|
盡量都注釋了,希望各位大佬幫我看看,原本如果沒有讀和寫的話,tm1637數(shù)碼管中間兩個(gè)小點(diǎn)應(yīng)該是要閃的,但是一旦讀/寫了,就會(huì)不閃,卡主,不知道為什么,還是我的語言邏輯錯(cuò)了或者語法錯(cuò)了,麻煩各位大佬幫我看看。
單片機(jī)DS3231源碼:
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit SCL=P1^2; //clk
- sbit SDA=P1^3; //dio 這是數(shù)碼TM1637的定義引腳
- int sec10=0;//十位的秒
- int sec=0;//個(gè)位的秒
- int min10=0;//十位的分
- int min=0;//個(gè)位的分
- sbit scl=P1^0;
- sbit sda=P1^0;//這是ds3231的定義引腳
- void delay10ms()
- {
- int a,b;
- for(a=50;a>0;a--)
- for(b=200;b>0;b--);
- }
- void delay()
- {
- ;;
- }
- void nack()//3231空應(yīng)答信號(hào)
- {
- scl=1;
- delay();
- sda=1;
- scl=0;
- delay();
- }
- void start()//3231開始信號(hào)
- {
- sda=1;
- scl=1;
- delay();
- sda=0;
- delay();
- }
- void stop()//3231停止
- {
- sda=0;
- scl=1;
- delay();
- sda=1;
- delay();
- }
- void ack()//3231管應(yīng)答
- {
- uchar i;
- scl=1;
- delay();
- while((sda==1)&&i<520)
- i++;
- scl=0;
- delay();
- }
- void write_byte(uchar date)//3231寫一個(gè)字節(jié)
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- sda=CY;
- delay();
- scl=1;
- delay();
- }
- scl=0;
- delay();
- sda=1;
- }
- unsigned char read_byte()//3231讀一個(gè)字節(jié)
- {
- uchar i,j,k;
- scl=0;
- delay();
- for(i=0;i<8;i++)
- {
- scl=1;
- delay();
- j=sda;
- k=(k<<1)|j;
- scl=0;
- delay();
- }
- return k;
- }
- void write_at24c32(uchar address,uchar date)//3231指定地址寫
- {
- start();
- write_byte(0x57);
- ack();
- write_byte(address);
- ack();
- write_byte(date);
- ack();
- stop();
- }
- uchar read_at24c32(uchar address)//3231指定地址讀
- {
- uchar date;
- write_byte(0x56);
- ack();
- write_byte(address);
- ack();
- start();
- write_byte(0x57);
- ack();
- date=read_byte();
- nack();
- stop();
- return date;
- }
- void IIC_delay(void)
- {
- unsigned char i;
- for(i=0;i<20;i++) _nop_();
- }
- void start_IIC(void) //數(shù)碼管開始信號(hào)
- {
- SCL=1; //給芯片發(fā)送開始信號(hào)
- SDA=1;
- IIC_delay();
- SDA=0;
- IIC_delay();
- SCL=0; //開始信號(hào)傳送完
- IIC_delay();
- }
- void stop_IIC(void) //數(shù)碼管結(jié)束信號(hào)
- {
- SCL=0;
- IIC_delay();
- SDA=0;
- IIC_delay();
- SCL=1;
- IIC_delay();
- SDA=1;
- }
- void ack_IIC() //數(shù)碼管應(yīng)答信號(hào)
- {
- SCL=0;
- _nop_();_nop_();_nop_();
- while(SDA);
- SCL=1;
- _nop_();_nop_();_nop_();
- SCL=0;
- }
- void WriteByte(unsigned char WriteData) //數(shù)碼管寫信號(hào)
- {
- 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)答信號(hào)
- }
- void write_LEDSROM(unsigned char addr,unsigned char WData) //數(shù)碼管指定地址
- {
- start_IIC(); //調(diào)用開始信號(hào)
- WriteByte(addr); //寫起始地址命令(C0H),地址00H單元。
- WriteByte(WData);//給顯示寄存器寫顯示數(shù)據(jù),值可根據(jù)實(shí)參改變
- stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- }
- void xsled(void)
- {
- SDA=1;
- SCL=1;
- start_IIC(); //調(diào)用開始信號(hào)
- WriteByte(0x40);//寫命令40H(數(shù)據(jù)設(shè)置)
- stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- write_LEDSROM(0xC0,min10); //第一個(gè)數(shù)碼管
- write_LEDSROM(0xC1,min|0x80); //第二個(gè)數(shù)碼管0x80控制中間小點(diǎn)點(diǎn)
- delay10ms(); delay10ms(); delay10ms();//小點(diǎn)閃爍
- write_LEDSROM(0xC1,min); //第二個(gè)數(shù)碼管
- delay10ms(); delay10ms(); delay10ms();//小點(diǎn)閃爍
- write_LEDSROM(0xC2,sec10); //第三個(gè)數(shù)碼管
- write_LEDSROM(0xC3,sec);//第四個(gè)數(shù)碼管
- IIC_delay();
- start_IIC(); //調(diào)用開始信號(hào)
- WriteByte(0x8f); //送開屏命令,(8BH),亮度可以根據(jù)低三位調(diào)節(jié)。//顯示亮度
- stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- }
- void main()
- {
- write_at24c32(0x00,1);//將0000 0001寫入3231的0x00(秒位)
- while(1)
- { sec=read_at24c32(0x00);//讀取賦值給sec
- xsled();
-
- }
- }
復(fù)制代碼
|
|