基于单片机的万年历设计 联系客服

发布时间 : 星期六 文章基于单片机的万年历设计更新完毕开始阅读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 //进入闹钟设置。 {

;..