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