|
|
DS1302驅(qū)動(dòng)程序
AIP1722液晶驅(qū)動(dòng)顯示
代碼如下:
TimeArray[4],TimeArray[5]的加減是否正確,結(jié)果出來(lái)時(shí)TimeArray[4]減到0,再減下去就是95,TimeArray[5]到0時(shí),再減下去顯示15;
不知道什么原因,求大神!
- /**************************************************
- 單片機(jī)-->DS1302時(shí)鐘模塊
- 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 ; //時(shí)鐘
- sbit CS = P1^2 ; //片選
- sbit DIN = P1^0 ; //數(shù)據(jù)
- sbit SCLK= P0^5 ; //DS1302時(shí)鐘
- sbit DSIO= P0^4 ; //DS1302數(shù)據(jù)
- 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時(shí)20分52秒2周 數(shù)組:array
- uchar ary[8]; //空年月日時(shí)分秒周
- uchar Dis[7];
- uchar KEY_count=0;
- uchar code Table[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f};//顯示數(shù)字0-9
- uchar code Letter[]={0x01,0x02,0x04,0x08,0x80}; //地址0xc2單獨(dú)帶字母:SCENT\WORK\PAUSE\EVENT\NULL\NULL\NULL\ON
- uchar code Week[]={0x01,0x02,0x04,0x08}; //地址0xc6單獨(dú)帶字母:THU\FRI\SAT\SUN
- uchar code OFF[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xc3數(shù)字帶OFF符號(hào)(加0x80)第一數(shù)碼管
- uchar code MON[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xcf數(shù)字帶MON符號(hào)(加0x80)第二數(shù)碼管
- uchar code TUE[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xce數(shù)字帶TUE符號(hào)(加0x80)第三數(shù)碼管
- uchar code Colon[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf};//地址0xcb數(shù)字帶 :符號(hào)(加0x80)第四數(shù)碼管
- uchar code WED[]={0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf}; //地址0xc7數(shù)字帶WED符號(hào)(加0x80)第五數(shù)碼管
- 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)//帶字母數(shù)字地址及數(shù)據(jù)
- #define sec_add 0x80 //秒寄存器寫(xiě)操作命令字
- #define min_add 0x82 //分寄存器寫(xiě)操作命令字
- #define hour_add 0x84 //時(shí)寄存器寫(xiě)操作命令字
- #define day_add 0x86 //日寄存器寫(xiě)操作命令字
- #define mon_add 0x88 //月寄存器寫(xiě)操作命令字
- #define week_add 0x8a //周寄存器寫(xiě)操作命令字
- #define year_add 0x8c //年寄存器寫(xiě)操作命令字
- #define ctrl_add 0x8e //控制寄存器寫(xiě)操作命令字
- #define cha_add 0x90 //涓流充電寄存器寫(xiě)操作命令字
- #define clk_add 0xbe //時(shí)鐘突發(fā)寄存器寫(xiě)操作命令字
- 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) //寫(xiě)字節(jié)
- {
- uchar i;
- CS=0;
- for(i=8;i>=1;i--)
- {
- CLK = 0; //時(shí)鐘拉低,寫(xiě)數(shù)據(jù)
- DIN = DATA & 0x01; //DATA & 10000000,讀取最高位寫(xiě)入max7219,最先發(fā)送高位(從左往右D7-D0)
- CLK = 1; //時(shí)鐘拉高,送數(shù)據(jù)
- DATA = DATA >> 1; //左移1位,重新&運(yùn)算,讀取最高位寫(xiě)入max7219,從右往左寫(xiě)
- }
- }
- void Write_1722_com(uchar com) //寫(xiě)指令
- {
- CS=0;
- Write_1722_byte(com);
- CS=1;
- }
- void TM1722_Write_Word(uchar addr,uchar dat) //寫(xiě)數(shù)據(jù)
- {
- 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 寫(xiě)入一字節(jié)數(shù)據(jù)***************/
- void DS1302_Write_DATA(uchar add, uchar dat)
- {
- uchar i;
- RST=1; //寫(xiě)入控制字節(jié): add
- add=add&0xfe; // 最低位置低
- for(i=0;i<8;i++) //依次寫(xiě)入控制字的八位
- {
- if(add&0x01) // 若 add與 0x01 按位與的結(jié)果為 0x01(真)
- DSIO=1; //向 DS1302 寫(xiě)入 1
- else //否則若 add 與 0x01 按位與的結(jié)果不為 0x01(假)
- DSIO=0; //向 DS1302 寫(xiě)入 0
- SCLK=1; //時(shí)鐘高電平
- SCLK=0; //時(shí)鐘低電平
- add=add>>1; //add 依次由高位向低位右移
- }
- for(i=0;i<8;i++) //依次寫(xiě)入數(shù)據(jù)的八位
- {
- if(dat&0x01) //若 dat 與 0x01 按位與的結(jié)果為 0x01(真)
- DSIO=1; //向 DS1302 寫(xiě)入 1
- else //否則若 dat 與 0x01 按位與的結(jié)果不為 0x01(假)
- DSIO=0; //向 DS1302 寫(xiě)入 0
- SCLK=1; //時(shí)鐘高電平
- SCLK=0; //時(shí)鐘低電平
- dat=dat>>1; //dat 依次由高位向低位右移
- }
- RST=0; //停止 DS1302 總線(xiàn)
- }
- uchar DS1302_Read_Bit(uchar add) //從 DS1302 讀出一字節(jié)數(shù)據(jù)
- {
- uchar i,tem;
- RST=1; //寫(xiě)入目標(biāo)地址: add
- add=add|0x01; //最低位置高
- for(i=0;i<8;i++) //依次寫(xiě)入控制字的八位
- {
- if(add&0x01) //若 add 與 0x01 按位與的結(jié)果為 0x01(真)
- DSIO=1; //向 DS1302 寫(xiě)入 1
- else //否則若 add與 0x01 按位與的結(jié)果不為 0x01(假)
- DSIO=0; //向 DS1302 寫(xiě)入 0
- SCLK=1; //時(shí)鐘高電平
- SCLK=0; //時(shí)鐘低電平
- add=add>>1; //add 依次由高位向低位右移
- }
- //輸出數(shù)據(jù): temp
- for(i=0;i<8;i++) //依次讀出數(shù)據(jù)的八位
- {
- tem=tem>>1; //dat 依次由高位向低位右移
- if(DSIO) //若 SDA=1
- tem|=0x80; //就執(zhí)行 tem 與 0x80 按位或再賦給 tem,取高位的 1
- else //若 SDA=0
- tem&=0x7f; //就執(zhí)行 tem 與 0x7f 按位與再賦給 tem,取高位的 0
- SCLK=1; //時(shí)鐘高電平
- SCLK=0; //時(shí)鐘低電平
- }
- RST=0; //停止 DS1302 總線(xiàn)
- return tem; //返回 tem 的值
- }
- /**************向 DS1302 寫(xiě)入時(shí)鐘數(shù)據(jù)*******************/
- 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; //十進(jìn)制轉(zhuǎn)換為十六進(jìn)制,ary[]={0x20,0x11,0x06,0x27,0x13,0x33,0x00,0x01}
- }
- DS1302_Write_DATA(ctrl_add,0x00); //關(guān)閉寫(xiě)保護(hù)
- 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]); //時(shí)
- 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); //打開(kāi)寫(xiě)保護(hù)
- //將ary[]中的年月日時(shí)分秒周的十六進(jìn)制數(shù)據(jù)寫(xiě)入 DS1302
- }
- /**********************從 DS1302 讀出時(shí)鐘數(shù)據(jù)********************************/
- void Read_1302CLK()
- {
- uchar i,tmp; //從 DS1302 讀出的年月日時(shí)分秒周的十六進(jìn)制數(shù)據(jù)存入 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); //時(shí)
- 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; //個(gè)位
- TimeArray[i]=TimeArray[i]+(tmp*10); //十六進(jìn)制轉(zhuǎn)換為十進(jìn)制
- } //將每個(gè)十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)存入 TimeArray[]
- }
- void Arrange() //時(shí)間讀取處理轉(zhuǎn)換函數(shù)
- {
- Dis[0]=Table[TimeArray[4]/10]; //時(shí)
- 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數(shù)碼管
- TM1722_Write_Word(0xcf,Dis[0]);//2數(shù)碼管
- TM1722_Write_Word(0xce,Dis[1]);//3數(shù)碼管
- TM1722_Write_Word(0xcb,Dis[3]);//4數(shù)碼管
- TM1722_Write_Word(0xc7,Dis[4]);//5數(shù)碼管
- }
- void Standby_Colon(uchar TimeR0,uchar TimeR1) //調(diào)整時(shí)間和星期時(shí)閃爍
- {
- 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數(shù)碼管
- TM1722_Write_Word(0xce,Table[TimeR0%10]);//3數(shù)碼管
-
- }
- else
- {
-
- TM1722_Write_Word(0xcf,0x00);//2數(shù)碼管
- TM1722_Write_Word(0xce,0x00);//3
- }
- if(display_count>k)
- {
-
- TM1722_Write_Word(0xcb,Table[TimeR1/10]);//4數(shù)碼管
- TM1722_Write_Word(0xc7,Table[TimeR1%10]);//5數(shù)碼管
- }
- else
- {
- TM1722_Write_Word(0xcb,0x00);//4數(shù)碼管
- 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]++; //小時(shí)
- 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;
- }
- }
- }
復(fù)制代碼
|
|