#define uchar unsigned char
#define uint unsigned int
__CONFIG(0X3B31);
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar a1,a2,a3,a4;
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
本文引用地址:http://m.butianyuan.cn/article/201611/320590.htmvoid port_init()
{
TRISD=0;
TRISB=0;
TRISC=0xff;
PORTD=0;
PORTB=0;
}
void IIC_init()
{
SSPSTAT=0x80;
SSPCON=0x38;//CKP高電平空閑,因?yàn)镮2C必須加上拉電阻,所以設(shè)定高電平空閑
SSPCON2=0;//開始設(shè)為0,在讀寫的過程中相應(yīng)改變其中的寄存器
SSPADD=0x09;//設(shè)置波特率,時鐘=Fosc/[4*(SSPAD+1)
}
void write(uchar add,uchar wdate)
{
SSPIF=0;
SEN=1; //啟動信號
while(SSPIF==0); //1的時候是真 0的時候是假 !SSPIF為非真,為假退出語句
SSPIF=0; //軟件清零 不會自動清零
SSPBUF=0XA0; //發(fā)送設(shè)備地址
while(SSPIF==0); //判斷是否發(fā)送完畢
SSPIF=0;
SSPBUF=add; //發(fā)送存儲地址 add隨自己設(shè)置
while(SSPIF==0); //監(jiān)測數(shù)據(jù)是否發(fā)完
SSPIF=0;
SSPBUF=wdate; //寫入數(shù)據(jù)
while(SSPIF==0); //每發(fā)送一個數(shù)據(jù)都要檢測是否成功
SSPIF=0;
PEN=1; //發(fā)送停止信號
while(SSPIF==0);//如果收到停止信號同樣會置位
SSPIF=0;
delay(10);
}
uchar read(uchar add)
{
uchar rdate;
SSPIF=0;
SEN=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA0;//傳輸設(shè)備地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=add;//add為讀地?cái)?shù)據(jù)地址,靈活設(shè)置
while(SSPIF==0);
SSPIF=0;
RSEN=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA1;//A仍然為外接設(shè)備地址,1表示輸入,開始從外接設(shè)備讀取數(shù)據(jù)
while(SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
rdate=SSPBUF;
while(SSPIF==0);
SSPIF=0;
ACKDT=1;//寫入應(yīng)答信號
ACKEN=1;//發(fā)送應(yīng)答信號
while(SSPIF==0);
SSPIF=0;
PEN=1;
while(SSPIF==0);
SSPIF=0;
return(rdate);
}
void display(uchar num1,uchar num2,uchar num3,uchar num4)
{
PORTB=0XF7;
PORTD=table[num1];
delay(2);
PORTB=0XFB;
PORTD=table[num2];
delay(2);
PORTB=0XFD;
PORTD=table[num3];
delay(2);
PORTB=0XFE;
PORTD=table[num4];
delay(2);
}
void main()
{
port_init();
IIC_init();
delay(100);
write(0,123);//8位為存儲器,如果寫入的值大于255就溢出了
uchar read(uchar add);
while(1)
{
uchar lednum;
lednum=read(0);
a1=lednum/1000;
a2=lednum00/100;
a3=lednum0/10;
a4=lednum;
display(a1,a2,a3,a4);
}
}
評論