DS1302驅動程序
AIP1722液晶驅動顯示
代碼如下:
TimeArray[4],TimeArray[5]的加減是否正確,結果出來時TimeArray[4]減到0,再減下去就是95,TimeArray[5]到0時,再減下去顯示15;
不知道什么原因,求大神!
- /**************************************************
- 單片機-->DS1302時鐘模塊
- SCLK 7 - P0.5
- IO 6 - P0.4
- CE 5 - P0.3
- ****************************************************/
- #include "n76e003.h"
- #include "intrins.h"
- #include "Function_Define.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit CLK = P1^1 ; //時鐘
- sbit CS = P1^2 ; //片選
- sbit DIN = P1^0 ; //數據
- sbit SCLK= P0^5 ; //DS1302時鐘
- sbit DSIO= P0^4 ; //DS1302數據
- sbit RST = P0^3 ; //DS1302CE
- sbit LED = P0^2 ;
- sbit K1 = P0^1 ; //按鍵1
- sbit K2 = P0^0 ; //按鍵2
- sbit K3 = P1^3 ; //按鍵3
- sbit K4 = P1^4 ; //按鍵4
- uchar TimeArray[8]={20,21,5,21,9,20,52,2};//空2020年2月22日8時20分52秒2周 數組:array
- uchar ary[8]; //空年月日時分秒周
- uchar Dis[7];
- uchar KEY_count=0;
- uchar code Table[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f};//顯示數字0-9
- uchar code Letter[]={0x01,0x02,0x04,0x08,0x80}; //地址0xc2單獨帶字母:SCENT\WORK\PAUSE\EVENT\NULL\NULL\NULL\ON
- uchar code Week[]={0x01,0x02,0x04,0x08}; //地址0xc6單獨帶字母:THU\FRI\SAT\SUN
- uchar code OFF[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xc3數字帶OFF符號(加0x80)第一數碼管
- uchar code MON[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xcf數字帶MON符號(加0x80)第二數碼管
- uchar code TUE[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xce數字帶TUE符號(加0x80)第三數碼管
- uchar code Colon[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf};//地址0xcb數字帶 :符號(加0x80)第四數碼管
- uchar code WED[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xc7數字帶WED符號(加0x80)第五數碼管
- uchar code Week_Address[]={0xcf,0xce,0xc7,0xc6}; //星期地址,0xc6含星期四、星期五、星期六、星期日
- //MON:(0xcf,MON[*])、TUE:(0xce,TUE[*])、WED:(0xc7,WED[*])、THU:(0xc6,0x01)、FRI(0xc6,0x02)、SAT(0xc6,0x04)、SUN(0xc6,0x08)//帶字母數字地址及數據
- #define sec_add 0x80 //秒寄存器寫操作命令字
- #define min_add 0x82 //分寄存器寫操作命令字
- #define hour_add 0x84 //時寄存器寫操作命令字
- #define day_add 0x86 //日寄存器寫操作命令字
- #define mon_add 0x88 //月寄存器寫操作命令字
- #define week_add 0x8a //周寄存器寫操作命令字
- #define year_add 0x8c //年寄存器寫操作命令字
- #define ctrl_add 0x8e //控制寄存器寫操作命令字
- #define cha_add 0x90 //涓流充電寄存器寫操作命令字
- #define clk_add 0xbe //時鐘突發寄存器寫操作命令字
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Write_1722_byte(uchar DATA) //寫字節
- {
- uchar i;
- CS=0;
- for(i=8;i>=1;i--)
- {
- CLK = 0; //時鐘拉低,寫數據
- DIN = DATA & 0x01; //DATA & 10000000,讀取最高位寫入max7219,最先發送高位(從左往右D7-D0)
- CLK = 1; //時鐘拉高,送數據
- DATA = DATA >> 1; //左移1位,重新&運算,讀取最高位寫入max7219,從右往左寫
- }
- }
- void Write_1722_com(uchar com) //寫指令
- {
- CS=0;
- Write_1722_byte(com);
- CS=1;
- }
- void TM1722_Write_Word(uchar addr,uchar dat) //寫數據
- {
- Write_1722_byte(addr);
- Write_1722_byte(dat);
- Delay_xms(10);
- CS=1;
- }
- void Init_1722(void)
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- P00_PushPull_Mode;
- P01_PushPull_Mode;
- P02_PushPull_Mode;
- P03_PushPull_Mode;
- P04_PushPull_Mode;
- P05_PushPull_Mode;
- P10_PushPull_Mode;
- P11_PushPull_Mode;
- P12_PushPull_Mode;
- Write_1722_com(0x00);
- Write_1722_com(0x40);
- Write_1722_com(0xc0);
- Write_1722_com(0x97); //亮度
- }
- void Init_qingping() //清屏程序
- {
- TM1722_Write_Word(0xc2,0x00);
- TM1722_Write_Word(0xc3,0x00);
- TM1722_Write_Word(0xc6,0x00);
- TM1722_Write_Word(0xc7,0x00);
- TM1722_Write_Word(0xca,0x00);
- TM1722_Write_Word(0xcb,0x00);
- TM1722_Write_Word(0xce,0x00);
- TM1722_Write_Word(0xcf,0x00);
- }
- /*************向 DS1302 寫入一字節數據***************/
- void DS1302_Write_DATA(uchar add, uchar dat)
- {
- uchar i;
- RST=1; //寫入控制字節: add
- add=add&0xfe; // 最低位置低
- for(i=0;i<8;i++) //依次寫入控制字的八位
- {
- if(add&0x01) // 若 add與 0x01 按位與的結果為 0x01(真)
- DSIO=1; //向 DS1302 寫入 1
- else //否則若 add 與 0x01 按位與的結果不為 0x01(假)
- DSIO=0; //向 DS1302 寫入 0
- SCLK=1; //時鐘高電平
- SCLK=0; //時鐘低電平
- add=add>>1; //add 依次由高位向低位右移
- }
- for(i=0;i<8;i++) //依次寫入數據的八位
- {
- if(dat&0x01) //若 dat 與 0x01 按位與的結果為 0x01(真)
- DSIO=1; //向 DS1302 寫入 1
- else //否則若 dat 與 0x01 按位與的結果不為 0x01(假)
- DSIO=0; //向 DS1302 寫入 0
- SCLK=1; //時鐘高電平
- SCLK=0; //時鐘低電平
- dat=dat>>1; //dat 依次由高位向低位右移
- }
- RST=0; //停止 DS1302 總線
- }
- uchar DS1302_Read_Bit(uchar add) //從 DS1302 讀出一字節數據
- {
- uchar i,tem;
- RST=1; //寫入目標地址: add
- add=add|0x01; //最低位置高
- for(i=0;i<8;i++) //依次寫入控制字的八位
- {
- if(add&0x01) //若 add 與 0x01 按位與的結果為 0x01(真)
- DSIO=1; //向 DS1302 寫入 1
- else //否則若 add與 0x01 按位與的結果不為 0x01(假)
- DSIO=0; //向 DS1302 寫入 0
- SCLK=1; //時鐘高電平
- SCLK=0; //時鐘低電平
- add=add>>1; //add 依次由高位向低位右移
- }
- //輸出數據: temp
- for(i=0;i<8;i++) //依次讀出數據的八位
- {
- tem=tem>>1; //dat 依次由高位向低位右移
- if(DSIO) //若 SDA=1
- tem|=0x80; //就執行 tem 與 0x80 按位或再賦給 tem,取高位的 1
- else //若 SDA=0
- tem&=0x7f; //就執行 tem 與 0x7f 按位與再賦給 tem,取高位的 0
- SCLK=1; //時鐘高電平
- SCLK=0; //時鐘低電平
- }
- RST=0; //停止 DS1302 總線
- return tem; //返回 tem 的值
- }
- /**************向 DS1302 寫入時鐘數據*******************/
- void Write_1302CLK()
- {
- uchar i,tmp;
- for(i=0;i<8;i++)
- { //BCD 處理
- tmp=TimeArray[i]/10;
- ary[i]=TimeArray[i]%10;
- ary[i]=ary[i]+tmp*16; //十進制轉換為十六進制,ary[]={0x20,0x11,0x06,0x27,0x13,0x33,0x00,0x01}
- }
- DS1302_Write_DATA(ctrl_add,0x00); //關閉寫保護
- DS1302_Write_DATA(sec_add,0x80); //暫停
- //DS1302_Write_DATA(cha_add,0xa9); //涓流充電
- DS1302_Write_DATA(year_add,ary[1]); //年
- DS1302_Write_DATA(mon_add,ary[2]); //月
- DS1302_Write_DATA(day_add,ary[3]); //日
- DS1302_Write_DATA(hour_add,ary[4]); //時
- DS1302_Write_DATA(min_add,ary[5]); //分
- DS1302_Write_DATA(sec_add,ary[6]); //秒
- DS1302_Write_DATA(week_add,ary[7]); //周
- DS1302_Write_DATA(ctrl_add,0x80); //打開寫保護
- //將ary[]中的年月日時分秒周的十六進制數據寫入 DS1302
- }
- /**********************從 DS1302 讀出時鐘數據********************************/
- void Read_1302CLK()
- {
- uchar i,tmp; //從 DS1302 讀出的年月日時分秒周的十六進制數據存入 ary[]
- ary[1]=DS1302_Read_Bit(year_add); //年
- ary[2]=DS1302_Read_Bit(mon_add); //月
- ary[3]=DS1302_Read_Bit(day_add); //日
- ary[4]=DS1302_Read_Bit(hour_add); //時
- ary[5]=DS1302_Read_Bit(min_add); //分
- ary[6]=DS1302_Read_Bit(sec_add); //秒
- ary[7]=DS1302_Read_Bit(week_add); //周
-
- for(i=0;i<8;i++) //BCD 處理
- {
- tmp=ary[i]/16; //十位
- TimeArray[i]=ary[i]%16; //個位
- TimeArray[i]=TimeArray[i]+(tmp*10); //十六進制轉換為十進制
- } //將每個十六進制數轉換為十進制數存入 TimeArray[]
- }
- void Arrange() //時間讀取處理轉換函數
- {
- Dis[0]=Table[TimeArray[4]/10]; //時
- Dis[1]=Table[TimeArray[4]%10];
- Dis[2]=0x40; //顯示"-"
- Dis[3]=Table[TimeArray[5]/10]; //分
- Dis[4]=Table[TimeArray[5]%10];
- Dis[5]=0x40;
- Dis[6]=Table[TimeArray[6]/10]; //秒
- Dis[7]=Table[TimeArray[6]%10];
- TM1722_Write_Word(0xc3,Dis[7]);//1數碼管
- TM1722_Write_Word(0xcf,Dis[0]);//2數碼管
- TM1722_Write_Word(0xce,Dis[1]);//3數碼管
- TM1722_Write_Word(0xcb,Dis[3]);//4數碼管
- TM1722_Write_Word(0xc7,Dis[4]);//5數碼管
- }
- void Standby_Colon(uchar TimeR0,uchar TimeR1) //調整時間和星期時閃爍
- {
- uchar j=0,k=0;
- static uchar display_count=0;
- display_count++;
- if(display_count>120)
- {
- display_count=1;
- }
- if(KEY_count==1)
- {
- j=60;
- }
- else if(KEY_count==2)
- {
- k=60;
- }
- if(display_count>j)
- {
- TM1722_Write_Word(0xcf,Table[TimeR0/10]);//2數碼管
- TM1722_Write_Word(0xce,Table[TimeR0%10]);//3數碼管
-
- }
- else
- {
-
- TM1722_Write_Word(0xcf,0x00);//2數碼管
- TM1722_Write_Word(0xce,0x00);//3
- }
- if(display_count>k)
- {
-
- TM1722_Write_Word(0xcb,Table[TimeR1/10]);//4數碼管
- TM1722_Write_Word(0xc7,Table[TimeR1%10]);//5數碼管
- }
- else
- {
- TM1722_Write_Word(0xcb,0x00);//4數碼管
- TM1722_Write_Word(0xc7,0x00);//5
- }
- }
- void Adjust_Time()
- {
- Standby_Colon(TimeArray[4],TimeArray[5]);
- if(KEY_count==0)
- {
- Arrange();
- }
- if(KEY_count==1)
- {
-
- if(K3==0||K4==0)
- {
- if(!K3)
- {
- TimeArray[4]++; //小時
- while(K3==0||K4==0);
- if(TimeArray[4]>=24)
- {
- TimeArray[4]=0;
- }
- }
- else if(!K4)
- {
- TimeArray[4]--;
- while(K3==0||K4==0);
- if(TimeArray[4]<=0)
- {
- TimeArray[4]=23;
- }
- }
-
- }Write_1302CLK();
- }
- else if(KEY_count==2)
- {
- if(K3==0||K4==0)
- {
- if(!K3)
- {
- TimeArray[5]++; //分鐘
- while(K3==0||K4==0);
- if(TimeArray[5]>59)
- {
- TimeArray[5]=0;
- }
- }
- else if(!K4)
- {
- TimeArray[5]--;
- while(K3==0||K4==0);
- if(TimeArray[5]<0)
- {
- TimeArray[5]=59;
- }
- }
- }Write_1302CLK();
- }
- }
- void main()
- {
- Init_1722();
- Init_qingping(); //清屏程序
- Write_1302CLK();
- Read_1302CLK();
- Delay_xms(5);
- while(1)
- {
- Read_1302CLK();
- Adjust_Time();
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-53320)/256;
- TL0=(65536-53320)%256;
- if(!K2)
- {
- KEY_count++;
- while(!K2);
- if(KEY_count>=3)
- {
- KEY_count=0;
- }
- }
- }
復制代碼
|