下面是一個試驗程序,4個位是直接分開的,沒有整合到一個unsigned int型里面,那樣就還要進行一次分離,打算把這4個位分別存入24C02的某個地址,下一次再讀回來接著顯示,但問題是讀回來的數(shù)字不能在數(shù)碼管上正確顯示,請教一個各位師傅你們是怎樣做的,int型不能直接存入24c02,必然是要拆開的,拆成兩個char型(一個高8位,一個低8位)?可是拆了以后,讀回來又不知道怎么整合到一起
單片機源程序如下:
- #include <STC89C5xRC.H>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit SDA=P2^7;
- sbit SCL=P2^6;
- sbit w1=P3^4;
- sbit w2=P3^5;
- sbit w3=P3^7;
- sbit w4=P3^6;
- uchar cc,ge,shi,bai,qian;
- uchar code table[ ]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90 }; //共陽0~9段碼
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- void start( )
- {
- SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號
- _nop_( );
- SCL=1;
- _nop_( ); //起始條件建立時間大于4.7us,延時
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SDA=0; //發(fā)送起始信號
- _nop_( ); //起始條件鎖定時間大于4μ
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SCL=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
- _nop_( );
- _nop_( ); //SCL置低,準備接收或發(fā)送數(shù)據(jù)
- }
- void stop( )
- {
- SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
- _nop_( ); //發(fā)送結(jié)束條件的時鐘信號
- SCL=1; //結(jié)束條件建立時間大于4μ
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SDA=1; //發(fā)送I2C總線結(jié)束信號
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( ); //延時保持4.7US以上
- }
- void write(uchar a)
- {
- uchar b,shu;
- for(b=0;b<8;b++) //要傳送的數(shù)據(jù)長度為8位
- {
- shu=a<<b; //把即將發(fā)送的數(shù)據(jù)的為移到最高位
- if((shu&0x80)!=0) //判斷最高位是否為0
- SDA=1; //不等于0說明最明當前要發(fā)送的數(shù)據(jù)為1
- else SDA=0; //否則數(shù)據(jù)為0
- SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
- _nop_( );
- _nop_( ); //保證時鐘高電平周期大于4μ
- _nop_( );
- _nop_( );
- _nop_( );
- SCL=0;
- }
- _nop_( );
- SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位
- _nop_( );
- SCL=1;
- _nop_( );
- }
- bit ack( ) //等待應答函數(shù)
- {
- bit h;
- SDA=1;
- _nop_( );
- SCL=1; //SDA和SCL全部置高
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SCL=0; //等待4.7US以上,把SCL置低
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- h=SDA; //等待4.7SU以上讀取SDA應答信號
- return h; //應答成功則是0,沒有應答則是1
- }
- uchar reade( ) //接收數(shù)據(jù)
- {
- uchar d,g;
- SDA=1; //數(shù)據(jù)線置高電平
- for(d=0;d<8;d++)
- {
- _nop_( );
- _nop_( );
- SCL=0;
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( ); //SCL低電平,數(shù)據(jù)變化
- SCL=1;
- _nop_( );
- _nop_( ); //SCL高電平,數(shù)據(jù)穩(wěn)定
- if(SDA==1)
- g=(g<<1)|0x01; //如果讀到的數(shù)據(jù)是1就是最低位置1
- else
- g=g<<1; //否則讀到是0,直接左移1位(左移后右補0)
- }
- return g; //經(jīng)過8次讀取移位,把g返回
- }
- void fasong(uchar add , uchar tab) //發(fā)送一個字節(jié)
- {
- start( ); //啟動總線
- write(0xa0); //器件地址(發(fā)送)
- ack( ); //等待應答
- write(add); //發(fā)送器件內(nèi)部地址
- ack( ); //等待應答
- write(tab); //發(fā)送數(shù)據(jù)
- ack( ); //等待應答
- stop( );
- }
- uchar jieshou(uchar add) //接收一個字節(jié)
- {
- uchar shu;
- start( ); //讀取(開始-器件地址(發(fā))- 器件內(nèi)部地址 - 開始 - 器件地址(收)- 接收數(shù)據(jù) -發(fā)應答或停止接收
- write(0xa0);
- ack( );
- write(add);
- ack( );
- start( );
- write(0xa1);
- ack( );
- shu=reade( );
- stop( );
- return shu;
- }
- void display(uchar a , uchar b , uchar c , uchar d)
- {
- if(a!=0)
- {
- w1=0;
- P0=table[a];
- delay(5);
- P0=0XFF;
- w1=1;
- }
- if(a!=0||b!=0)
- {
- w2=0;
- P0=table[b];
- delay(5);
- P0=0XFF;
- w2=1;
- }
- if(a!=0||b!=0||c!=0)
- {
- w3=0;
- P0=table[c];
- delay(5);
- P0=0XFF;
- w3=1;
- }
- w4=0;
- P0=table[d];
- delay(5);
- P0=0XFF;
- w4=1;
- }
- void main( )
- {
- uchar a1,a2,a3,a4;
- w1=w2=w3=w4=1;
- EA=1;
- ET0=1;
- TMOD=0X01;
- TH0=0X3C;
- TL0=0XB0;
- fasong(0x03,9);
- fasong(0x04,8);
- fasong(0x05,7);
- fasong(0x06,6);
- delay(100);
- a1=jieshou(0x03);
- ge=a1;
- a2=jieshou(0x04);
- shi=a2;
- a3=jieshou(0x05);
- bai=a3;
- a4=jieshou(0x06);
- qian=a4;
- TR0=1;
- while(1)
- {
- display(qian,bai,shi,ge);
- }
- }
- void aa( ) interrupt 1
- {
- TH0=0X3c;
- TL0=0Xb0;
- cc++;
- if(cc==1)
- {
- cc=0;
- ge++;
- if(ge==10)
- {
- ge=0;
- shi++;
- if(shi==10)
- {
- shi=0;
- bai++;
- if(bai==10)
- {
- bai=0;
- qian++;
- if(qian==10)
- {
- qian=0;
- }
- }
- }
- }
- }
- }
復制代碼
|