附录2 源程序(此程序与实验箱相配)
#include
int a,b,i,min,hour,minge,minshi,hourge,hourshi,sec,secge,secshi,cnt,cnt1, nian=2014,yue=3,ri=7, amin1=1,ahour1,aminge1,aminshi1,ahourge1,ahourshi1, amin2=1,ahour2,aminge2,aminshi2,ahourge2,ahourshi2, amin3=1,ahour3,aminge3,aminshi3,ahourge3,ahourshi3, amin4=1,ahour4,aminge4,aminshi4,ahourge4,ahourshi4;
uchar code table1[]={'0','1','2','3','4','5','6','7','8','9'}; uchar code table2[]=\ \;
uchar code table3[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x11,0x1F}; uchar code table4[]={0x00,0x0E,0x0A,0x0E,0x00,0x00,0x00,0x00}; uchar code table5[]={0x0F,0x09,0x0f,0x09,0x0f,0x09,0x09,0x11}; uchar code table6[]={0x06,0x09,0x08,0x08,0x09,0x06,0x00,0x00}; uchar code table7[]={0x01,0x1E,0x04,0x1F,0x0E,0x15,0x04,0x04}; uchar code table8[]={0x04,0x0E,0x15,0x04,0x02,0x04,0x18,0x00}; uchar code table9[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02}; uchar code Alarm_1[]=\ %uchar code Alarm_2[]=\ %uchar code Alarm_3[]=\ %uchar code Alarm_4[]=\ %uchar code riqi[]=\ \
uchar num1,num2,alarm1,alarm2,alarm3,alarm4; bit flag=0;
void delay(unsigned int z) //延时程序 { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--);
11
}
void write_com(uchar com) //LCD命令控制,写指令函数 { delay(5) ; lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }
void write_data(uchar date) //LCD数据控制,写数据函数 { delay(5); lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; }
void write_nian(uchar add , uint date) //年显示函数 {
uchar qian,bai,shi,ge; qian=date/1000;
bai=(date-1000*qian)/100;
shi=(date-qian*1000-bai*100)/10; ge=date;
write_com(0x80+0x40+add); write_data(table1[qian]); write_data(table1[bai]); write_data(table1[shi]); write_data(table1[ge]); }
void write_yue(uchar add , uchar date) //月显示函数 {
uchar shi,ge; shi=date/10; ge=date;
write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge);
12
}
void write_ri(uchar add , uchar date) //日显示函数 {
uchar shi,ge; shi=date/10; ge=date;
write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge); }
void qi() //总日期显示函数 {
write_nian(0,nian); write_yue(5,yue); write_ri(8,ri);
write_com(0x80+0x40+7);
write_data(0x01);//显示自定义“月”字 write_com(0x80+0x40+4); write_data('-'); write_com(0x80+0x40+10); write_data(0x00);//显示自定义“日”字 }
void time() //设置时间函数 { while(1) { if(key1==0) { delay(10); if(key1==0) //按键检测与消抖 { if(hour==23) //\时\设置 hour=0; else hour++; hourge=hour; hourshi=hour/10;
13
write_com(0x0f); //显示开,光标开且闪烁 delay(2); write_com(0x80+6); write_data(table1[hourge]); //\时\个位写入LCD第1行第6位 delay(5); write_com(0x80+5); delay(2); write_data(table1[hourshi]); //\时\十位写入LCD第1行第5位 while(!key1); //松手检测 } } if(key2==0) { delay(10); if(key2==0) { if(min==59) //\分\设置 min=0; else min++; minge=min; minshi=min/10; write_com(0x0f); //显示开,光标开且闪烁 write_com(0x80+9); write_data(table1[minge]); //\分\个位写入LCD第二行第9位 delay(1); write_com(0x80+8); write_data(table1[minshi]); //\分\十位写入LCD第二行第8位 delay(1); while(!key2); //松手检测 } } if(key3==0) { delay(10); if(key3==0) { write_com(0x0c); //整体显示,关光标,不闪烁 TR1=1; //定时计数器1启动 while(!key3); break; //key3松开时,显示时间\时\分\位均已设置完毕
14
} } } }
void display1() //设置闹钟1时间函数 { while(1) { if(key1==0) { delay(10); if(key1==0) { if(ahour1==23) //闹钟\时\设置 ahour1=0; else ahour1++; ahourge1=ahour1; ahourshi1=ahour1/10; write_com(0x0f); //显示开,光标开且闪烁 write_com(0x80+0x40+8); //写入显示地址 write_data(':'); write_com(0x80+0x40+7); write_data(table1[ahourge1]); delay(1); write_com(0x80+0x40+6); write_data(table1[ahourshi1]); delay(1); while(!key1); } } if(key2==0) //闹钟\分\设置 { delay(10); if(key2==0) { if(amin1==59) amin1=0; else amin1++; aminge1=amin1; aminshi1=amin1/10; write_com(0x0f); write_com(0x80+0x40+10);
15