|
上一個(gè)版本的不能修改日期,只能修改時(shí)間;至此,讓它進(jìn)化;
可惜,天道不仁,以萬(wàn)物為芻狗;進(jìn)化一半,失敗了;只能顯示時(shí)間,鬧鐘,日期;能修改時(shí)間,鬧鐘,日期;能中斷修改;
還差顯示星期并且能修改,且能隨著日期的增加,自動(dòng)變化;日期已經(jīng)能自動(dòng)增加;
鬧鐘也只是長(zhǎng)響,不是間歇響;唉,可惜可惜
單片機(jī)源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- /********************************
- 腳位定義
- ********************************/
- sbit rs = P3^5; //寫(xiě)命令/數(shù)據(jù)端
- sbit en = P3^4; //使能
- sbit rw = P3^6; //led1602讀命令/數(shù)據(jù)端
- sbit we = P2^7; //數(shù)碼管位選
- sbit du = P2^7; //數(shù)碼管段選
- sbit S2 = P3^0;
- sbit S3 = P3^1;
- sbit S4 = P3^2;
- sbit S5 = P3^3; //獨(dú)立鍵盤(pán)四個(gè)按鍵腳位
- sbit fm = P2^3; //蜂鳴器腳位
- uchar count, S2num; //定時(shí)器,修改按鍵次數(shù),
- uchar hour = 7, //時(shí)
- min = 59, //分
- sec = 55; //秒 時(shí)間
- uint nian = 2020, //年
- yue = 3, //月
- ri = 19; //日 日期
- uchar clock,
- hour1 = 8, //時(shí)
- min1 = 0; //分 鬧鐘
- // 星期一↓ 二↓ 三↓ 四↓ 五↓ 六↓ 日↓
- uchar X[] = {"MON,TUE,MED,THU,FRI,SAT,SUN"};//星期循環(huán)
- uchar code table[] = "2020-03-19"; //注意:修改這里必須先修改↑ uchar ↑,↓↓↓↓
- uchar code table1[] = "07:59:55 C08:00"; // 否則,時(shí)間不會(huì)跟著這里走
- /********************************************
- 延時(shí)函數(shù)
- ********************************************/
- void delay(uint z)//長(zhǎng)延時(shí)函數(shù)
- {
- uint x, y;
- for(x = z; x > 0;x --)
- for (y = 110; y > 0; y --);
- }
- /********************************************
- 寫(xiě)命令函數(shù)
- ********************************************/
- void write_com(uchar com)
- {
- rs = 0;
- P0 = com;
- delay(5);
- en = 1;
- delay(5);
- en = 0;
- }
- /********************************************
- 寫(xiě)數(shù)據(jù)函數(shù)
- ********************************************/
- void write_dat(uchar dat)
- {
- rs = 1;
- P0 = dat;
- delay(5);
- en = 1;
- delay(5);
- en = 0;
- }
- /********************************************
- 初始化函數(shù)
- ********************************************/
- void init()
- {
- uchar num;
- rw =0;
- en = 0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- for(num = 0; num < 10; num ++)
- write_dat(table[num]);
- write_com(0x80 + 0x40);
- for(num = 0; num < 16; num ++)
- write_dat(table1[num]);
- TMOD = 0x01;
- TH0 = (65536 - 50000) / 256; //裝定時(shí)器初值
- TL0 = (65536 - 50000) % 256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /********************************************
- 定時(shí)器函數(shù)
- ********************************************/
- void timer0() interrupt 1
- {
- TH0 = (65536 - 50000) / 256;//再次裝定時(shí)器初值
- TL0 = (65536 - 50000) % 256;
- count ++;
- }
- /********************************************
- 時(shí)分秒 + 鬧鐘函數(shù)
- ********************************************/
- void write_sfm(uchar add, uchar date)
- {
- uchar shi, ge;
- shi = date / 10;
- ge = date % 10;
- write_com(0x80 + 0x40 + add); //時(shí)間 / 鬧鐘顯示的位置
- write_dat(0x30 + shi);
- write_dat(0x30 + ge);
- }
- /********************************************
- 年月日函數(shù)
- ********************************************/
- void write_nyr(uint add, uint date)
- { //這里不能用uchar,uchar數(shù)字最多只有255,顯示不全年份
- uint qian, bai, shi, ge;
- qian = date / 1000;
- bai = date % 1000 / 100;
- shi = date % 100 / 10;
- ge = date % 10;
- write_com(0x80 + add);
- if (add == 0) //年顯示的位置
- {
- write_dat(0x30 + qian);
- write_dat(0x30 + bai);
- write_dat(0x30 + shi);
- write_dat(0x30 + ge);
- }
- if(add == 5) //月顯示的位置
- {
- write_dat(0x30 + shi);
- write_dat(0x30 + ge);
- }
- if(add == 8) //日顯示的位置
- {
- write_dat(0x30 + shi);
- write_dat(0x30 + ge);
- }
- }
- /********************************************
- 星期函數(shù)
- ********************************************/
- void write_xq(uchar add, uchar date)
- {
- uchar ge;
- ge = date % 10;
- write_com(0x80 + add); //星期顯示的位置
- write_dat(0x30 + ge);
- }
- /************************************************************
- 日期時(shí)間自加函數(shù) + 插入的鬧鐘函數(shù)
- *************************************************************/
- void write_shijian()
- {
- if(count == 20) //定時(shí)1秒
- {
- count = 0;
- sec ++;
- if(sec == 60)
- {
- sec = 0;
- min ++;
- if(min == 60)
- {
- min = 0;
- hour ++;
- /*******↓*****↓*****插入鬧鐘*****↓*****↓*******/
- if(hour == hour1 & min == min1) //當(dāng)時(shí)間‘時(shí)’‘分’==鬧鐘‘時(shí)’‘分’時(shí),蜂鳴器打開(kāi)
- {
- fm = 0; //fm = 0時(shí),蜂鳴器打開(kāi),fm = 1時(shí),蜂鳴器關(guān)閉
- }
- /**********↑***↑***↑***↑***↑***↑***↑***********/
- if(hour == 24)
- {
- hour = 0;
- ri ++;
- if(ri == 31)
- {
- ri = 1;
- yue ++;
- if(yue == 13)
- {
- yue = 1;
- nian ++;
- if(nian == 2100)
- {
- nian = 0;
- yue = 0;
- ri = 0;
- hour = 0;
- min = 0;
- sec = 0;
- }
- write_nyr(0, nian);//年份送回LED屏幕顯示
- }
- write_nyr(5, yue); //月份送回LED屏幕顯示
- }
- write_nyr(8, ri); //天數(shù)送回LED屏幕顯示
- }
- write_sfm(0, hour); //小時(shí)送回LED屏幕顯示
- }
- write_sfm(3, min); //分鐘送回LED屏幕顯示
- }
- write_sfm(6, sec); //秒送回LED屏幕顯示
- }
- }
- /*****************函數(shù)聲明********************/
- void Key();
- /********************************************
- 主函數(shù)
- ********************************************/
- void main()
- {
- init();
- while(1)
- {
- Key(); //插入按鍵函數(shù)
- write_shijian();
- }
- }
- /********************************************
- 按鍵函數(shù)
- ********************************************/
- void Key()
- {
- /***************插入停止鬧鐘按鍵設(shè)置************/
- if(fm == 0) //鬧鐘是撿來(lái)的,到處插入^_^
- {
- if(S5 == 0)
- {
- delay(5);
- if(S5 == 0)
- fm = 1;
- }
- }
- /***********修改日期 + 時(shí)間 + 鬧鐘按鍵設(shè)置************/
- if(S2 == 0) //按下修改按鍵
- {
- delay(25); //軟件消抖
- if(S2 == 0) //確認(rèn)按下
- {
- S2num ++; //按鍵次數(shù)增加
- while(!S2); //松開(kāi)按鍵
- TR0 = 0; //關(guān)閉定時(shí)器
- write_com(0x0f); //打開(kāi)光標(biāo)且閃爍
- if(S2num == 1)
- write_com(0x80 + 0x40 + 7); //修改時(shí)間秒針數(shù)
- if(S2num == 2)
- write_com(0x80 + 0x40 + 4); //修改時(shí)間分鐘數(shù)
- if(S2num == 3)
- write_com(0x80 + 0x40 + 1); //修改時(shí)間小時(shí)數(shù)
- if(S2num == 4)
- write_com(0x80 + 0X40 + 12);//修改鬧鐘小時(shí)數(shù)
- if(S2num == 5)
- write_com(0x80 + 0X40 + 15);//修改鬧鐘分鐘份
- if(S2num == 6)
- write_com(0x80 + 3); //修改日期年份
- if(S2num == 7)
- write_com(0x80 + 6); //修改日期月份
- if(S2num == 8)
- write_com(0x80 + 9); //修改日期天數(shù)
- if(S2num == 9)
- {
- S2num = 0; //修改按鍵次數(shù)清零
- write_com(0x0c); //關(guān)閉光標(biāo)且停止閃爍
- TR0 = 1; //打開(kāi)定時(shí)器
- }
- }
- }
- /*************增加日期 + 時(shí)間 + 鬧鐘按鍵設(shè)置**************/
- if(S2num != 0) //按下修改按鍵,取消修改、增加和減少按鍵才有效
- {
- if(S5 == 0) //取消修改按鍵(僅在S2按下有效)
- {
- delay(25);
- if(S5 == 0)
- S2num = 0; //修改按鍵次數(shù)清零
- write_com(0x0c); //關(guān)閉光標(biāo)且停止閃爍
- TR0 = 1; //打開(kāi)定時(shí)器
- }
- if(S3 == 0) //增加鍵按下
- {
- delay(25); //軟件消抖
- if(S3 == 0)
- {
- while(!S3); //確定按鍵按下
- /********************時(shí)間*************************/
- if(S2num == 1)
- {
- sec ++;
- if(sec == 60)
- sec = 0;
- write_sfm(6, sec);
- write_com(0x80 + 0x40 + 7); //秒
- }
- if(S2num == 2)
- {
- min ++;
- if(min == 60)
- min = 0;
- write_sfm(3, min);
- write_com(0x80 + 0x40 + 4); //分
- }
- if(S2num == 3)
- {
- hour ++;
- if(hour == 24)
- hour = 0;
- write_sfm(0, hour);
- write_com(0x80 + 0x40 + 1); //時(shí)
- }
- /********************鬧鐘*************************/
- if(S2num == 4)
- {
- hour1 ++;
- if(hour1 == 24)
- hour1 = 0;
- write_sfm(11, hour1);
- write_com(0x80 + 0x40 + 12); //時(shí)
- }
- if(S2num == 5)
- {
- min1 ++;
- if(min1 == 60)
- min1 = 0;
- write_sfm(14, min1);
- write_com(0x80 + 0x40 + 15); //分
- }
- /********************日期*************************/
- if(S2num == 6)
- {
- nian ++;
- if(nian == 2101)
- nian = 1999;
- write_nyr(0, nian);
- write_com(0x80 + 3); //年
- }
- if(S2num == 7)
- {
- yue ++;
- if(yue == 13)
- yue = 1;
- write_nyr(5, yue);
- write_com(0x80 + 6); //月
- }
- if(S2num == 8)
- {
- ri ++;
- if(ri == 31)
- ri = 1;
- write_nyr(8, ri);
- write_com(0x80 + 9); //日
- }
- }
- }
- /***********減少日期 + 時(shí)間 + 鬧鐘按鍵設(shè)置******************/
- if(S4 == 0) //減少鍵按下
- {
- delay(25);
- if(S4 == 0)
- {
- while(!S4); //確定按鍵按下
- /********************時(shí)間*************************/
- if(S2num == 1)
- {
- sec --;
- if(sec == -1)
- sec = 59;
- write_sfm(6, sec);
- write_com(0x80 + 0x40 + 7); //秒
- }
- if(S2num == 2)
- {
- min --;
- if(min == -1)
- min = 59;
- write_sfm(3, min);
- write_com(0x80 + 0x40 + 4); //分
- }
- if(S2num == 3)
- {
- hour --;
- if(hour == -1)
- hour = 23;
- write_sfm(0, hour);
- write_com(0x80 + 0x40 + 1); //時(shí)
- }
- /********************鬧鐘*************************/
- if(S2num == 4)
- {
- hour1 --;
- if(hour1 == -1)
- hour1 = 23;
- write_sfm(11, hour1);
- write_com(0x80 + 0x40 + 12); //時(shí)
- }
- if(S2num == 5)
- {
- min1 --;
- if(min1 == -1)
- min1 = 59;
- write_sfm(14, min1);
- write_com(0x80 + 0x40 + 15); //分
- }
- /********************日期*************************/
- if(S2num == 6)
- {
- nian --;
- if(nian == 1998)
- nian = 2100;
- write_nyr(0, nian);
- write_com(0x80 + 3); //年
- }
- if(S2num == 7)
- {
- yue --;
- if(yue == 0)
- yue = 12;
- write_nyr(5, yue);
- write_com(0x80 + 6); //月
- }
- if(S2num == 8)
- {
- ri --;
- if(ri == 0)
- ri = 30;
- write_nyr(8, ri);
- write_com(0x80 + 9); //日
- }
- }
- }
- }
- }
復(fù)制代碼
以上資料51hei提供下載:
萬(wàn)年歷.rar
(2.73 KB, 下載次數(shù): 7)
2020-3-21 17:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|