并用74HC595和74HC1显示出来。
#include #include #define uchar unsigned char #define uint unsigned int sbit SCL=P2^0; sbit SDA=P2^1; bit ack; uchar a[3]; uchar b[3]; sbit SCK=P1^0; sbit DAT=P1^3; sbit G=P1^2; sbit RCK=P1^1; //把unsigned char宏定义为uchar uchar Led_code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, //数码管的0~F的所对应的段码 0x7F,0x6F}; //uchar Led_enbit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //共阳数码管 uchar Led_enbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管第0~7位所对应位选的代码 /******************************************************* *函数:void delay(void) * *功能:延时2ms * ********************************************************/ void delay1(uchar x) { unsigned char a,b; for(b=80;b>0;b--) for(a=x;a>0;a--); } /******************************************************* *函数:void send_data(unchar Data) * *功能:发送一字节数据 * *说明:数据的高位在前,低位在后。SCK上升沿写入一位 * ********************************************************/ void send_data(uchar Data) { uchar i; for(i=0;i<8;i++) { SCK=0; DAT=Data&0x80; //取数据的最高位 SCK=1; Data=Data<<1; //数据左移一位 } } /******************************************************* *函数:void display(uchar num,uchar site) * *功能:在指定的位置显示对的数字 其中1控制段,595控制位 * *说明:num为要显示的数字,site为要显示在哪一位数码管在 * 先发送段码后发送位码 * ********************************************************/ void display(uchar num,uchar site) { G=1; //禁止位选数据输出(高阻态) send_data(Led_code[num]); //发送一位段码数据 send_data(Led_enbit[site]); //发送一位位码数据 G=0; //允许位选数据输出 RCK=0; //位选数据写入数据存储器 _nop_(); RCK=1; delay1(10); //延时2ms } /******************************************************************* I2c专用延时函数 函数原型: void Delay_I2c(); 功能: 延时7US左右 ********************************************************************/ void Delay_I2c() { uchar a,b; for(a=1;a>0;a--) for(b=1;b>0;b--); } /******************************************************************* 总线函数初始化 函数原型: void Init_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Init_I2c() { SCL=1; //I2C 时钟 SDA=1; //I2C 数据 } /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA=0; /*发送起始条件的数据信号*/ SCL=1; SDA=1; Delay_I2c(); /*起始条件建立时间大于4.7us,延时*/ SDA=0; Delay_I2c(); /*发送起始信号*/ /* 起始条件锁定时间大于4μs*/ SCL=0; /*钳住I2C总线,准备发送或接收数据 */ } /******************************************************************* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/ void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ SCL=0; /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ Delay_I2c(); SDA=1; /*发送I2C总线结束信号*/ Delay_I2c(); SDA=0; } /******************************************************************** 应答子函数 函数原型: void Ack_I2c(); 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2c() { uchar i; SCL=0; SDA=1; SCL=1; SDA=0; Delay_I2c(); //*时钟低电平周期大于4μs while((SDA==1) && (i<255)) i++; SCL=0; SDA=1; //*清时钟线,钳住I2C总线以便继续接收 } /******************************************************************** 应答子函数 函数原型: void N_Ack_I2c(); 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void N_Ack_I2c() { SCL=0; SDA=0; SCL=1; SDA=1; Delay_I2c(); SCL=0; SDA=0; } /******************************************************************* 字节数据发送函数 函数原型: void SendByte(UCHAR c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void Send_Byte(unsigned char c) { unsigned char BitCnt; SCL=0; //时钟线为低电平数据会变 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if(c&0x80) SDA=1; /*判断发送位*/ else SDA=0; c=c<<1; Delay_I2c(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ Delay_I2c(); /*保证时钟高电平周期大于4μs*/ SCL=0; Delay_I2c(); } SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ Delay_I2c(); if(SDA==1)ack=0; else ack=1; //*判断是否接收到应答信号 SCL=0; Delay_I2c(); } /******************************************************************* 读一字节数据接收函数 函数原型: UCHAR RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 ********************************************************************/ unsigned char Rcv_Byte() { unsigned char dat; unsigned char BitCnt; dat=0; //SCL=0; //Nop(); SDA=1; Delay_I2c(); /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) { SCL=0; /*置时钟线为低,准备接收数据位*/ Delay_I2c(); /*时钟低电平周期大于4.7μs*/ SCL=1; /*置时钟线为高使数据线上数据有效*/ Delay_I2c(); dat=dat<<1; // dat=(dat<<1)|SDA;// if(SDA==1)dat=dat+1; /*读数据位,接收的数据位放入dat中 */ //强制加一,防止上卷,*/ SCL=0; Delay_I2c(); } return(dat); } /******************************************************************* 函数原型: AD_chli() // 功能: ********************************************************************/ uchar AD_culi(char con) { uint date; Start_I2c(); Send_Byte(0x90);//发送器件地址 Ack_I2c(); Send_Byte(con);//控制方式为输出 ,通道0 Ack_I2c(); Start_I2c(); Send_Byte(0x91); Ack_I2c(); date=Rcv_Byte(); N_Ack_I2c(); Stop_I2c(); return date; } /******************************************************************* 函数原型: DA_chli() // 功能: ********************************************************************/ void DA_culi(uchar con,uchar dat) { Start_I2c(); Send_Byte(0x90); Ack_I2c(); Send_Byte(con); Ack_I2c(); Send_Byte(dat); Ack_I2c(); Stop_I2c(); } void main() { uchar shu=0; uint x,y; uchar we; Init_I2c(); while(1) { x=AD_culi(0x01); a[2]=x/100; a[1]=x%100/10; a[0]=x%10; for(we=0;we<3;we++) { display(a[we],we); } DA_culi(0x40,shu); shu++; } }