上一个版本的不能修改日期,只能修改时间;至此,让它进化;
可惜,天道不仁,以万物为刍狗;进化一半,失败了;只能显示时间,闹钟,日期;能修改时间,闹钟,日期;能中断修改;
还差显示星期并且能修改,且能随着日期的增加,自动变化;日期已经能自动增加;
闹钟也只是长响,不是间歇响;唉,可惜可惜
单片机源程序如下:
- #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)
|