|
上個(gè)帖子是不可調(diào)節(jié)。這個(gè)程序?yàn)榭烧{(diào)節(jié),用了矩陣按鍵里7個(gè)按鍵,每個(gè)按鍵調(diào)一個(gè),因?yàn)榕晒鈽?biāo)移動(dòng)選擇調(diào)節(jié)的話(huà),光標(biāo)顏色很暗,不知道什么原因。
- /********************************************/
- #include <reg52.h>
- #include"inc/lcd.h"
- #include"inc/key.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit IO = P3^6;
- sbit SCLK = P3^5;
- sbit RST = P3^7;
- sbit ACC_0 = ACC^0;
- sbit ACC_7 = ACC^7;
- //寫(xiě)的地址
- uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
- //讀的地址
- uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
- /*形式上為十六進(jìn),數(shù)值是BCD碼*/
- //存儲(chǔ)格式是BCD碼秒 分 時(shí) 日 月 周 年
- uchar time[7]={0x50,0x59,0x14,0x20,0x06,0x06,0x19};
- /*如果數(shù)值時(shí)間是十進(jìn)制,寫(xiě)入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼*/
- //uchar time[7]={0,25,15,15,12,6,18}; //十進(jìn)制
- uchar KEYRETURN;//鍵值
- void write_byte(uchar dat)//寫(xiě)一個(gè)字節(jié)
- {
- uchar i;
- ACC=dat;
- for(i=8;i>0;i--)
- {
- IO=ACC_0;
- SCLK=0;
- SCLK=1;
- ACC=ACC>>1;
- }
- /*
- uchar i;
- for(i=0;i<8;i++)
- {
- IO = (bit)(dat & 0x01);
- SCLK = 0;
- SCLK = 1;
- dat >>= 1;
- }
- */
- }
- uchar read_byte() //讀一個(gè)字節(jié)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- ACC_7=IO;
- SCLK=1;
- SCLK=0;
- ACC=ACC>>1;
- }
- IO=0;
- return (ACC);
- /*
- uchar dat,i;
- for(i=0;i<8;i++)
- {
- if(IO == 1)
- {
- dat = dat|0x80;
- }
- SCLK = 1;
- SCLK = 0;
- dat >>= 1;
- }
- IO = 0;
- return (dat);
- */
- }
- void write_1302(uchar add,uchar dat) //向1302芯片寫(xiě)函數(shù),指定寫(xiě)入地址,數(shù)據(jù)
- {
- RST=0;
- SCLK=0;
- RST=1;
- write_byte(add);
- write_byte(dat);
- SCLK=1;
- RST=0;
- }
- uchar read_1302(uchar add) //從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來(lái)源地址
- {
- uchar temp;
- RST=0;
- SCLK=0;
- RST=1;
- write_byte(add);
- temp=read_byte();
- SCLK=1;
- RST=0;
- return(temp);
- }
- void ds1302_init()
- {
- uchar k;
- write_1302(0x8e,0x00); //禁止寫(xiě)保護(hù),即允許數(shù)據(jù)寫(xiě)入
- for(k=0;k<7;k++) //寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
- {
- write_1302(write_addr[k],time[k]);
- }
- write_1302(0x8e,0x80); //打開(kāi)寫(xiě)保護(hù)
- /*//寫(xiě)入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼
- uchar i,tmp;
- write_1302(0x8e,0x00); //禁止寫(xiě)保護(hù),即允許數(shù)據(jù)寫(xiě)入
- for (i=0; i<7; i++)
- {
- tmp = time[i] / 10;
- time[i] = time[i] % 10;
- time[i] = time[i] + tmp*16; // 十進(jìn)制轉(zhuǎn)化為BCD格式
- write_1302(write_addr[i],time[i]);
- //寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
- }
- write_1302(0x8e,0x80); //打開(kāi)寫(xiě)保護(hù)
- */
- }
- void BCD_STRING(uchar bcd, uchar *str) //BCD轉(zhuǎn)化為字符串
- {
- *str = (bcd >> 4) + '0';
- *(str+1) = (bcd & 0x0f) + '0';
- }
- void read_time(uchar *timedata)
- {
- uchar n;
- for(n=0;n<7;n++)
- {
- timedata[n]=read_1302(read_addr[n]); //讀取分秒時(shí)日月周年
- }
- BCD_STRING(timedata[6], LCD_TIME+0);//轉(zhuǎn)化后年,存放在LCD_TIME
- BCD_STRING(timedata[4], LCD_TIME+2);//轉(zhuǎn)化后月
- BCD_STRING(timedata[3], LCD_TIME+4);//轉(zhuǎn)化后日
- BCD_STRING(timedata[5], LCD_TIME+6);//轉(zhuǎn)化后周
- BCD_STRING(timedata[2], LCD_TIME+8);//轉(zhuǎn)化后時(shí)
- BCD_STRING(timedata[1], LCD_TIME+10);//轉(zhuǎn)化后分
- BCD_STRING(timedata[0], LCD_TIME+12);//轉(zhuǎn)化后秒
- }
- uchar TEN_BCD(uchar time_buf ) // 十進(jìn)制轉(zhuǎn)化為BCD格式
- {
- uchar tmp;
- tmp = time_buf / 10;
- time_buf = time_buf % 10;
- time_buf = time_buf + tmp*16;
- return(time_buf);
- }
- uchar BCD_TEN(uchar bcd) //BCD碼轉(zhuǎn)十進(jìn)制函數(shù)
- {
- uchar ten;
- ten=bcd>>4;
- return(ten=ten*10+(bcd&=0x0F));
- }
- void change_time()
- {
- // 年 月 日 周 時(shí) 分
- uchar tmp=0,tmp1=1,tmp2=1,tmp3=1,tmp4=0,tmp5=0;
- uchar year,mon,day,week,hour,minu;
- KEYRETURN=KEY();
- if(KEYRETURN!=0)
- {
- delay(400);
- switch(KEYRETURN)
- { /*************年*************/
- case 0x11:
- write_1302(0x8e,0x00);//關(guān)閉保護(hù)
- if(BCD_TEN(time[6])<99)//先將讀取出來(lái)的時(shí)間轉(zhuǎn)化為十進(jìn)制比大小
- {
- tmp=BCD_TEN(time[6]);//變量等于當(dāng)前值
- tmp++; //變量再++
- }
- else
- tmp=0;//大于99變回0
- year=TEN_BCD(tmp);//再轉(zhuǎn)化為BCD碼
- write_1302(0x8c,year); //再寫(xiě)入
- write_1302(0x8e,0x80);;//打開(kāi)保護(hù)
- break;
- /*效果就是比如初始年是19,按一下鍵,變成20,而不是從0開(kāi)始。
- 如果把讀取出來(lái)的時(shí)間轉(zhuǎn)化為16進(jìn)制,再改程序,我試了不行*/
- /*************月*************/
- case 0x21:
- write_1302(0x8e,0x00);
- if(BCD_TEN(time[4])<12)
- {
- tmp1=BCD_TEN(time[4]);
- tmp1++;
- }
- else
- tmp1=1;
- mon=TEN_BCD(tmp1);
- write_1302(0x88,mon);
- write_1302(0x8e,0x80);break;
- /**********效果同上************/
-
- /**************日************/
- case 0x41:
- write_1302(0x8e,0x00);
- if(BCD_TEN(time[3])<31)
- {
- tmp2=BCD_TEN(time[3]);
- tmp2++;
- }
- else
- tmp2=1;
- day=TEN_BCD(tmp2);
- write_1302(0x86,day);
- write_1302(0x8e,0x80);break;
- /**********效果同上*********/
- /**************周************/
- case 0x81:
- write_1302(0x8e,0x00);
- if(BCD_TEN(time[5])<7)
- {
- tmp3=BCD_TEN(time[5]);
- tmp3++;
- }
- else
- tmp3=1;
- week=TEN_BCD(tmp3);
- write_1302(0x8a,week);
- write_1302(0x8e,0x80);break;
- /**********效果同上********/
- /**************時(shí)************/
- case 0x12:
- write_1302(0x8e,0x00);
- if(BCD_TEN(time[2])<23)
- {
- tmp4=BCD_TEN(time[2]);
- tmp4++;
- }
- else
- tmp4=0;
- hour=TEN_BCD(tmp4);
- write_1302(0x84,hour);
- write_1302(0x8e,0x80);break;
- /**********效果同上*******/
- /**************分************/
- case 0x22:
- write_1302(0x8e,0x00);
- if(BCD_TEN(time[1])<59)
- {
- tmp5=BCD_TEN(time[1]);
- tmp5++;
- }
- else
- tmp5=0;
- minu=TEN_BCD(tmp5);
- write_1302(0x82,minu);
- write_1302(0x8e,0x80);break;
- /***********效果同上*******/
-
- /**************秒************/
- case 0x42:
- write_1302(0x8e,0x00);
- write_1302(0x80,0x00);
- write_1302(0x8e,0x80);break;
- /*效果為按下鍵歸0,不像上面按下加1按下加1*/
- }
- }
- KEYRETURN=0;
- }
-
- void main()
- {
- ds1302_init();//1302初始化,設(shè)定時(shí)間
- Lcd_init(); // lcd初始化
- while(1)
- {
- read_time(&time); //讀取時(shí)間
- lcd_dis(); // 顯示在lcd
- change_time(); //按鍵調(diào)時(shí)
- }
- while(1); //等待
- }
復(fù)制代碼
詳細(xì)程序可下載免費(fèi)
按鍵調(diào)節(jié)加lcd顯示時(shí)鐘.rar
(43.4 KB, 下載次數(shù): 176)
2018-12-17 11:22 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
附件
|
評(píng)分
-
查看全部評(píng)分
|