你可以参考一下
- //基于TM1637的数码管控制
- #include<reg52.h> //包含52单片机头文件
- #include<intrins.h> // _nop_ 头文件
- //定义端口
- sbit SCL=P1^2; //定义模拟IIC总线的时钟线
- sbit SDA=P1^3; //定义模拟IIC总线的数据线
- unsigned char t, shi, ge, bai;
- unsigned int dadt;
- unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
- /*********************************************************
- *IIC_delay
- *******************************************************/
- void IIC_delay(void)
- {
- unsigned char i;
- for(i=0;i<20;i++) _nop_();
- }
- /*********************************************************
- *
- 启动IIC
- *********************************************************/
- void start_IIC(void)
- {
- SCL=1; //给芯片发送开始信号
- SDA=1;
- IIC_delay();
- SDA=0;
- IIC_delay();
- SCL=0; //开始信号传送完
- IIC_delay();
- }
- /*******************************************************
- *
- 停止IIC
- *******************************************************/
- void stop_IIC(void)
- {
- SCL=0;
- IIC_delay();
- SDA=0;
- IIC_delay();
- SCL=1;
- IIC_delay();
- SDA=1;
- }
- /*******************************************************
- *
- 判断芯片发过来的ACK应答信号
- *******************************************************/
- void ack_IIC()
- {
- SCL=0;
- _nop_();_nop_();_nop_();
- while(SDA);
- SCL=1;
- _nop_();_nop_();_nop_();
- SCL=0;
- }
- /*******************************************************
- *
- 写一个字节数据
- *******************************************************/
- void WriteByte(unsigned char WriteData)
- {
- unsigned char i;
- for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
- {
- SCL=0;
- IIC_delay();
- WriteData=WriteData>>1;
- SDA=CY;
- IIC_delay();
- SCL=1;
- IIC_delay();
- }
- //8位数据传送完
- ack_IIC(); //判断芯片发过来的ACK应答信号
- }
- /*******************************************************
- /************************************************
- 写一字节数据到LEDSROM
- **************************************************/
- void write_LEDSROM(unsigned char addr,unsigned char WData)
- {
- start_IIC(); //调用开始信号
- WriteByte(addr); //写起始地址命令(0C0H),地址00H单元。
- WriteByte(WData);//给显示寄存器写显示数据,值可根据实参改变
- stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
- }
- /************************************************
- /************************************************
- *
- 分开写数据到LED
- **************************************************/
- void xsled(void)
- {
- SDA=1;
- SCL=1;
- start_IIC(); //调用开始信号
- WriteByte(0x44);//写命令40H(数据设置)
- stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
- write_LEDSROM(0xC0,0x00); //第一个数码管
- write_LEDSROM(0xC1,xsbcdbuf[bai]|0x80); //第二个数码管 0x80 点亮数码管中间的两个小点
- write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三个数码管
- write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四个数码管
- IIC_delay();
- start_IIC(); //调用开始信号
- WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
- stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
- }
- void init()
- {
- TMOD|=0X01; // Timer0
- TH0=(65535-50000)/256; // 50ms
- TL0=(65535-50000)%256;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void jisuan()
- {
- bai=dadt/100;
- shi=dadt/10%10;
- ge=dadt%10;
- }
- void main()
- {
- //P1=0xff;
- init();
- while(1)
- {
- jisuan();
- xsled();
- if(t>=20) // 1s
- {
- t=0;
- dadt++;
- if(dadt>=1000) //能到999
- {
- dadt=0;
- }
- }
- }
- }
- void T0_time() interrupt 1 // 50ms
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- t++;
- }
复制代码 |