单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码.. 下载本文

{

clocksing=0; } } else {

clocksing=1; } } else {

clocksing=1; }

if(keyscan()==0xff) continue; keypro(); } }

/******************键扫描程序******************/ unsigned char keyscan(void) {

P3=0xff; keyval=P3;

if(keyval==0xff) {

return 0xff; }

delay(10000); if(keyval!=P3) {

return 0xff; } else {

while(P3!=0xff); return keyval; } }

/******************时钟中断及显示程序******************/ void t0int(void) interrupt 1 using 1 {

TH0=(0-2000)/256; //2ms TL0=(0-2000)%6;

P0=0xff; P1=0xff;

P1=bittab[dispindex];

if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句 {

P0=segtab_dot[dispbuf[dispindex]]; } else {

P0=segtab[dispbuf[dispindex]]; }

if((dispindex==pos)&&(flash==1)&&(mode==2||(mode==3&&clock_shanshuo==0)))//闪烁控制程序 {

P0=0xff; P1=0xf0; }

dispindex++;

dispindex=dispindex&0x03; cnt++; cnt1++;

if(cnt1>=250) //0.5ms闪烁 {

cnt1=0;

flash=~flash; }

if(cnt>=500) //2ms*500=1s {

cnt=0; ss++;

if(ss>=60) {

ss=0; mm++;

if(mm>=60) {

mm=0; hh++;

if(hh>=24) {

hh=0;

} } }

if(mode==0) {

dispbuf[0]=mm/10; dispbuf[1]=mm; dispbuf[2]=ss/10; dispbuf[3]=ss; }

else if(mode==1||(mode==3&&clock_shanshuo==1)) {

dispbuf[0]=hh/10; dispbuf[1]=hh; dispbuf[2]=mm/10; dispbuf[3]=mm;

} } }

/******************按键选择,进入不同模式******************/ void keypro(void) {

switch(mode) {

case 0://显示分秒

if(keyval==0x7f) {

mode=1;

dispbuf[0]=hh/10; dispbuf[1]=hh; dispbuf[2]=mm/10; dispbuf[3]=mm; }

break;

case 1://显示时分

if(keyval==0x7f) {

mode=2;

dispbuf[0]=hh/10; dispbuf[1]=hh; dispbuf[2]=mm/10; dispbuf[3]=mm; }

break;

case 2://时间调整(只调整时分)

if(keyval==0x7f) //按键1 调整模式 进入闹钟模式 { mode=3; clock_hh=0; clock_mm=0;

clock_shanshuo=0;

hh=dispbuf[0]*10+dispbuf[1]; //保存调整后的时间 mm=dispbuf[2]*10+dispbuf[3];

dispbuf[0]=clock_hh/10; //显示闹钟的初始时间 dispbuf[1]=clock_hh; dispbuf[2]=clock_mm/10; dispbuf[3]=clock_mm; TR0=1; }

else if(keyval==0xbf) //按键2 加 {

if(pos==0) {

dispbuf[pos]++; if(dispbuf[pos]==3) {

dispbuf[pos]=0; } }

else if(pos==1) {

if(dispbuf[0]==0||dispbuf[0]==1) {

dispbuf[pos]++;

dispbuf[pos]=dispbuf[pos]; }

if(dispbuf[0]==2) {

dispbuf[pos]++;