发布时间 : 星期六 文章基于单片机的万年历设计更新完毕开始阅读a142267e03d276a20029bd64783e0912a3167c21
.
;..
flagset=1; // 设置标志位,表示在进行各种时间设置。 while(!kmenu); di();
switch(kmenunum) //定位光标闪烁点。 {
case 1: writecom(0x80+0x40+10); // 秒闪烁。 writecom(0x0f); // 开光标闪烁。 break;
case 2: writecom(0x80+0x40+7); // 分闪烁。 break;
case 3: writecom(0x80+0x40+4); // 时闪烁。 break;
case 4: writecom(0x80+10); //星期闪烁 . break;
case 5: writecom(0x80+7); //日闪烁 . break;
case 6: writecom(0x80+4); //月闪烁 . break;
case 7: writecom(0x80+1); //年闪烁 . break; case 8: kmenunum=0;
writecom(0x0c); // 取消光标闪烁。 flagset=0; //取消时间调节标志。
dswrite(0x8e,0x00); /* 允许写操作 */ dswrite(0x80,second/10*16+second); dswrite(0x82,minute/10*16+minute); dswrite(0x84,hour/10*16+hour); dswrite(0x8a,week/10*16+week); dswrite(0x86,day/10*16+day); dswrite(0x88,month/10*16+month); dswrite(0x8c,year/10*16+year); dswrite(0x8e,0x80); /* 禁止写操作 */ break; } } }
if(kmenunum!=0) //只有当功能键按下时 ,才检测增大 ,减小键 . {
if(kup==0) {
delay(5); if(kup==0) {
while(!kup);
送液晶显示 光标复位 .
;..
.
di();
switch(kmenunum) //根据功能键被按下的次数,调节相应数值。 {
case 1: second++;
if(second==60) second=0;
writetime(9,second);
writecom(0x80+0x40+10); // 因为,上面
break; //一次 ,光标后移一位 ,所以要将
case 2: minute++;
if(minute==60) minute=0;
writetime(6,minute); writecom(0x80+0x40+7); break; case 3: hour++;
if(hour==24) hour=0;
writetime(3,hour); writecom(0x80+0x40+4); break; case 4: week++;
if(week==8) week=1;
writeweek(week); writecom(0x80+11); break; case 5: day++;
if(day==32) day=1;
writenyr(6,day); writecom(0x80+7); break; case 6: month++;
if(month==13) month=1;
writenyr(3,month); writecom(0x80+4); break; case 7: year++;
if(year==100)
year=0;
.
;..
writenyr(0,year); writecom(0x80+1); break; } } }
if(kdown==0) {
delay(5); if(kdown==0) {
while(!kdown); di();
switch(kmenunum) //根据功能键被按次数调节相应数值 . {
case 1: second--;
if(second==-1) second=59;
writetime(9,second); writecom(0x80+0x40+10); break; case 2: minute--;
if(minute==-1) minute=59;
writetime(6,minute); writecom(0x80+0x40+7); break; case 3: hour--;
if(hour==-1) hour=23;
writetime(3,hour); writecom(0x80+0x40+4); break; case 4: week--;
if(week==0) week=7;
writeweek(week); writecom(0x80+11); break; case 5: day--;
if(day==0) day=31;
writenyr(6,day); writecom(0x80+7);
.
break; case 6: month--;
if(month==0) month=12;
writenyr(3,month); writecom(0x80+4); break; case 7: year--;
if(year==-1) year=99;
writenyr(0,year); writecom(0x80+1); break; } } } }
if(kalarm==0) // 检测闹钟调节键是否按下,此条if 语句与 if(kmenunum!=0)
{ // 在同一个层次。 delay(5);
if(kalarm==0) {
flagseta=~flagseta; while(!kalarm); di();
if(flagseta==0) //此时,退出闹钟设置,保存各相关数值。 {
flagset=0; //清除时间设置标志,在 if(kalarm==0) 这个 if 语句writecom(0x80+0x40)中,不用 flagset=1 这条语句来设置 //flagset 标志位,因为如果进行了闹钟时间的设置就会执行前面 if(kmenunum==0) 语句中的 flagset=1 这条语句。
writedata(' '); // 清除液晶上的 “ Ri闹钟调节标志。 ” writedata(' ');
writecom(0x0c); //取消光标闪烁
dswrite(0x8e,0x00); /* 允许写操作 */
dswrite(writealarmsecond,second/10*16+second); // 往 DS1302 中保存闹钟的时分秒值。
dswrite(writealarmminute,minute/10*16+minute); dswrite(writealarmhour,hour/10*16+hour); dswrite(0x8e,0x80); /* 禁止写操作 */ }
else //进入闹钟设置。 {
;..