|
讓他閃爍起來, 給你改了一下,你試試。
- //基于TM1637的數(shù)碼管控制
- #include<reg52.h> //包含52單片機(jī)頭文件
- #include<intrins.h> // _nop_ 頭文件
- //定義端口
- sbit SCL=P1^2; //定義模擬IIC總線的時(shí)鐘線
- sbit SDA=P1^3; //定義模擬IIC總線的數(shù)據(jù)線
- unsigned char t, shi, ge, bai;
- unsigned int dadt;
- bit Blink = 0; //中間的兩個(gè)小點(diǎn)閃爍起來標(biāo)志位,=1表示點(diǎn)亮,=0表示不點(diǎn)亮
- unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
- // 0 1 2 3 4 5 6 7 8 9 0
- /*********************************************************
- *IIC_delay
- *******************************************************/
- void IIC_delay(void)
- {
- unsigned char i;
- for(i=0;i<20;i++) _nop_();
- }
- /*********************************************************
- *
- 啟動(dòng)IIC
- *********************************************************/
- void start_IIC(void)
- {
- SCL=1; //給芯片發(fā)送開始信號
- 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;
- }
- /*******************************************************
- *
- 判斷芯片發(fā)過來的ACK應(yīng)答信號
- *******************************************************/
- void ack_IIC()
- {
- SCL=0;
- _nop_();_nop_();_nop_();
- while(SDA);
- SCL=1;
- _nop_();_nop_();_nop_();
- SCL=0;
- }
- /*******************************************************
- *
- 寫一個(gè)字節(jié)數(shù)據(jù)
- *******************************************************/
- void WriteByte(unsigned char WriteData)
- {
- unsigned char i;
- for(i=0;i<8;i++)//開始傳送8位數(shù)據(jù),每循環(huán)一次傳送一位數(shù)據(jù)
- {
- SCL=0;
- IIC_delay();
- WriteData=WriteData>>1;
- SDA=CY;
- IIC_delay();
- SCL=1;
- IIC_delay();
- }
- //8位數(shù)據(jù)傳送完
- ack_IIC(); //判斷芯片發(fā)過來的ACK應(yīng)答信號
- }
- /*******************************************************
- /************************************************
- 寫一字節(jié)數(shù)據(jù)到LEDSROM
- **************************************************/
- void write_LEDSROM(unsigned char addr,unsigned char WData)
- {
- start_IIC(); //調(diào)用開始信號
- WriteByte(addr); //寫起始地址命令(0C0H),地址00H單元。
- WriteByte(WData);//給顯示寄存器寫顯示數(shù)據(jù),值可根據(jù)實(shí)參改變
- stop_IIC(); //調(diào)用結(jié)束信號,一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- }
- /************************************************
- /************************************************
- *
- 分開寫數(shù)據(jù)到LED
- **************************************************/
- void xsled(void)
- {
- SDA=1;
- SCL=1;
- start_IIC(); //調(diào)用開始信號
- WriteByte(0x44);//寫命令40H(數(shù)據(jù)設(shè)置)
- stop_IIC(); //調(diào)用結(jié)束信號,一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- write_LEDSROM(0xC0,0x00); //第一個(gè)數(shù)碼管
- write_LEDSROM(0xC1,xsbcdbuf[bai]|(Blink ? 0x80 : 0x00)); //第二個(gè)數(shù)碼管 0x80 點(diǎn)亮數(shù)碼管中間的兩個(gè)小點(diǎn)
- write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三個(gè)數(shù)碼管
- write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四個(gè)數(shù)碼管
- IIC_delay();
- start_IIC(); //調(diào)用開始信號
- WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據(jù)低三位調(diào)節(jié)。//顯示亮度
- stop_IIC(); //調(diào)用結(jié)束信號,一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- }
- 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++;
- if(t%2==0)
- Blink =~Blink; //中間的兩個(gè)小點(diǎn)閃爍起來
- }
復(fù)制代碼 |
|