下面是一个试验程序,4个位是直接分开的,没有整合到一个unsigned int型里面,那样就还要进行一次分离,打算把这4个位分别存入24C02的某个地址,下一次再读回来接着显示,但问题是读回来的数字不能在数码管上正确显示,请教一个各位师傅你们是怎样做的,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; //发送起始条件的数据信号
- _nop_( );
- SCL=1;
- _nop_( ); //起始条件建立时间大于4.7us,延时
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SDA=0; //发送起始信号
- _nop_( ); //起始条件锁定时间大于4μ
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SCL=0; //钳住I2C总线,准备发送或接收数据
- _nop_( );
- _nop_( ); //SCL置低,准备接收或发送数据
- }
- void stop( )
- {
- SDA=0; //发送结束条件的数据信号
- _nop_( ); //发送结束条件的时钟信号
- SCL=1; //结束条件建立时间大于4μ
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- SDA=1; //发送I2C总线结束信号
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( ); //延时保持4.7US以上
- }
- void write(uchar a)
- {
- uchar b,shu;
- for(b=0;b<8;b++) //要传送的数据长度为8位
- {
- shu=a<<b; //把即将发送的数据的为移到最高位
- if((shu&0x80)!=0) //判断最高位是否为0
- SDA=1; //不等于0说明最明当前要发送的数据为1
- else SDA=0; //否则数据为0
- SCL=1; //置时钟线为高,通知被控器开始接收数据位
- _nop_( );
- _nop_( ); //保证时钟高电平周期大于4μ
- _nop_( );
- _nop_( );
- _nop_( );
- SCL=0;
- }
- _nop_( );
- SDA=1; //8位发送完后释放数据线,准备接收应答位
- _nop_( );
- SCL=1;
- _nop_( );
- }
- bit ack( ) //等待应答函数
- {
- 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( ) //接收数据
- {
- uchar d,g;
- SDA=1; //数据线置高电平
- for(d=0;d<8;d++)
- {
- _nop_( );
- _nop_( );
- SCL=0;
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( ); //SCL低电平,数据变化
- SCL=1;
- _nop_( );
- _nop_( ); //SCL高电平,数据稳定
- if(SDA==1)
- g=(g<<1)|0x01; //如果读到的数据是1就是最低位置1
- else
- g=g<<1; //否则读到是0,直接左移1位(左移后右补0)
- }
- return g; //经过8次读取移位,把g返回
- }
- void fasong(uchar add , uchar tab) //发送一个字节
- {
- start( ); //启动总线
- write(0xa0); //器件地址(发送)
- ack( ); //等待应答
- write(add); //发送器件内部地址
- ack( ); //等待应答
- write(tab); //发送数据
- ack( ); //等待应答
- stop( );
- }
- uchar jieshou(uchar add) //接收一个字节
- {
- uchar shu;
- start( ); //读取(开始-器件地址(发)- 器件内部地址 - 开始 - 器件地址(收)- 接收数据 -发应答或停止接收
- 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;
- }
- }
- }
- }
- }
- }
复制代码
|