附图3 电子万年历界面图
附录Ⅱ 电子万年历程序
1.电子万年历主程序+键盘扫描程序
/******************************************/ /******文件名称:电子万年历主程序+键盘扫描*/ /*******完成日期:2011年11月8日*********/ /*******修改日期: 2012年2月29日**********/ /*******作者:Li Li Cai*********************/ /*****************************************/ #include
sbit k1=P1^0; //按键端口定义 sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3;
#define uchar unsigned char #define uint unsigned int
uchar key1=0,key2=0,key3=0;
/***函数名称:键盘消抖延时************/ /***入口参数:uint Z******************/ /***函数功能:短暂延时,去除键盘抖动**/
void delayK(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--) ; }
/***函数名称:键盘管理程序*****/ /***函数功能:扫面按键,设定***/ /******************************/ void key() { uchar nian=0,yue=0,ri=0,zhou=0,xiaoshi=0,fenzhong=0,miao=0; if(!k1) //功能选择 { delayK(20); //按键消抖 if(!k1) { lcd_pos(4,1); //显示设置提示 lcd_wdat(DIS7[0]); //设 lcd_wdat(DIS7[1]); lcd_wdat(DIS7[2]); //置 lcd_wdat(DIS7[3]); lcd_wdat(DIS3[1]); //< lcd_wdat(DIS3[2]); //< key1++; if(key1==8) key1=1; switch(key1) //进行设定功能选择 { case 1: { lcd_pos(4,4); //年 lcd_wdat(DIS7[4]); lcd_wdat(DIS7[5]); };break; case 2: { lcd_pos(4,4); //月 lcd_wdat(DIS7[6]); lcd_wdat(DIS7[7]); };break; case 3: { lcd_pos(4,4); //日 lcd_wdat(DIS7[10]); lcd_wdat(DIS7[11]); };break; case 4: { lcd_pos(4,4); //周 lcd_wdat(DIS7[8]); lcd_wdat(DIS7[9]); };break; case 5: { lcd_pos(4,4); //时
lcd_wdat(DIS7[12]); lcd_wdat(DIS7[13]); };break; case 6: { lcd_pos(4,4); //分 lcd_wdat(DIS7[14]); lcd_wdat(DIS7[15]); };break; case 7: { lcd_pos(4,4); //秒 lcd_wdat(DIS7[16]); lcd_wdat(DIS7[17]); };break; } //end switch } //end if1 while(k1==0); //等待按键释放 } // end if(k1)
if(!k2) //增加键控制 { delayK(200); if(!k2) { if (key1 == 1) //如果选择年 { nian=((now[6]>>4)&0x0F)*10 + (now[6]&0x0F); //将年的BCD码转换为十进制数 nian++; if (nian == 100) { nian = 0; } if (nian < 0) { nian = 99; } now[6]=((nian/10)<<4)|(nian); //将年的十进制数转换为BCD码 DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x8c, now[6]); DS1302_WriteData(0x8e, 0x80); //写保护 } if (key1 == 2) //如果选择月 { yue=((now[4]>>4)&0x0F)*10 + (now[4]&0x0F); //将月的BCD码转换为十进制数 yue++; if (yue == 13) { yue = 1; } if (yue == 0) { yue = 12; } now[4]=((yue/10)<<4)|(yue); //将月的十进制数转换为BCD码 DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x88, now[4]);
DS1302_WriteData(0x8e, 0x80); //写保护 }
if (key1 == 3) //如果选择日 { ri=((now[3]>>4)&0x0F)*10 + (now[3]&0x0F); //将日的BCD码转换为十进制数 ri++; if (ri == 32) { ri = 1; } if (ri == 0) { ri = 31; } now[3]=((ri/10)<<4)|(ri); //将日的十进制数转换为BCD码 DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x86, now[3]); DS1302_WriteData(0x8e, 0x80); //写保护 }
if (key1 == 4) //如果选择星期 { zhou=((now[5]>>4)&0x0F)*10 + (now[5]&0x0F); //将星期的BCD码转换为十进制数 zhou++; if (zhou == 8) { zhou = 1; } switch(zhou) { case 1: now[5]=0x01;break; case 2: now[5]=0x02;break; case 3: now[5]=0x03;break; case 4: now[5]=0x04;break; case 5: now[5]=0x05;break; case 6: now[5]=0x06;break; case 7: now[5]=0x07;break; } DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x8a, now[5]); DS1302_WriteData(0x8e, 0x80); //写保护 }
if (key1 == 5) //如果选择小时 { xiaoshi=((now[2]>>4)&0x0F)*10 + (now[2]&0x0F); //将小时的BCD码转换为十进制数 xiaoshi++; if (xiaoshi == 24) { xiaoshi = 0; } now[2]=((xiaoshi/10)<<4)|(xiaoshi); //将小时的十进制数转换为BCD码 DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x84, now[2]); DS1302_WriteData(0x8e, 0x80); //写保护 }
if (key1 == 6) //如果选择分钟 { fenzhong=((now[1]>>4)&0x0F)*10 + (now[1]&0x0F);//将时的BCD码转换为十进制数
fenzhong++; if (fenzhong == 60) { fenzhong = 0; } now[1]=((fenzhong/10)<<4)|(fenzhong); DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x82, now[1]); DS1302_WriteData(0x8e, 0x80); //写保护 } if (key1 == 7) //如果选择秒 { miao=((now[0]>>4)&0x0F)*10 + (now[0]&0x0F); miao++; if (miao == 60) { miao = 0; } now[0]=((miao/10)<<4)|(miao); DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x80, now[0]); DS1302_WriteData(0x8e, 0x80); //写保护 } } //end if k2 xiao dou } //end if(k2)
if(!k3) //减小控制键 { delay(20); if(!k3) { if (key1 == 1) //如果选择年 { nian=((now[6]>>4)&0x0F)*10 + (now[6]&0x0F); nian--; if (nian < 0) { nian = 99; } now[6]=((nian/10)<<4)|(nian); DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x8c, now[6]); DS1302_WriteData(0x8e, 0x80); //写保护 } if (key1 == 2) //如果选择月 { yue=((now[4]>>4)&0x0F)*10 + (now[4]&0x0F); yue--; if (yue == 0) { yue = 12; } now[4]=((yue/10)<<4)|(yue); DS1302_WriteData(0x8e, 0x00); //允许写操作 DS1302_WriteData(0x88, now[4]); DS1302_WriteData(0x8e, 0x80); //写保护 }