基于STC89C52的数码管显示秒表,用矩阵键盘,有走秒,输入时间正计时、倒计时,到时提醒,及切换到时钟模式的功能
键盘位置:7 8 9 开始(正计时)
4 5 6 暂停
1 2 3 倒计时
模式切换 0 时间校正 清零
很容易理解,所以,这个就直接附代码~~
下载地址:
多功能秒表.doc
(6.43 KB, 下载次数: 85)
///////////////////////////////////////////////////头文件和一些定义和初始化在附件里有///////////////////////////////////////////////////
char codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71, 0x54};//数码管段码,最后一个为n
char code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
void Init()//清零 { run=0; remind=0; num=0; time=0; miao=0; fen=0; time0=0.00001; beep=1; key=16; EA=0; ET0=0; TR0=0; }
void delay(unsigned char i)//延时
{
char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
} void bee()//蜂鸣器
{
beep=0;
delay(500);
beep=1;
}
void keyscan()//按键检测
{ uchar temp; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=7; break; case0xde: key=8; break; case 0xbe: key=9; break; case0x7e: key=12; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; break; case0xdd: key=5; break; case0xbd: key=6; break; case0x7d: key=13; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; }
} }
P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=1; break; case0xdb: key=2; break; case0xbb: key=3; break; case0x7b: key=14; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: key=10; break; case0xd7: key=0; break; case0xb7: key=11; break; case0x77: key=15; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } }
void stor() { if(key!=16)
{ if(key>11) switch(key) { case 12:run=1;break; case13:run=0;break; case14:run=2;break; case15:Init(); } if(key<10)
{ if(time0==0.00001) time0=0; time0=time0*10+key; run=3; } } key=16;//防止循环进入此函数 }
void T0_time()interrupt 1 { TH0=(65536-9216)/256; TL0=(65536-9216)%256; // num++; // if(num==2) // { // num=0; if(run==1) time+=0.01; else time-=0.01; // } }
void display(float t) { intmiao_,time10,a[6],n1; time10=t*100; miao_=time10%100; miao=time10/100%60; fen=time10/100/60;
a[0]=miao_%10; a[1]=miao_/10; a[2]=miao%10; a[3]=miao/10; a[4]=fen%10; a[5]=fen/10;
for(n1=0;n1<6;n1++) { if(n1!=2&&n1!=4) { P0=table[a[n1]]; dula=1; dula=0; P0=weixuan[n1]; wela=1; wela=0; delay(5); } else { //05 4744 P0=table[a[n1]]+0x80; dula=1; dula=0; P0=weixuan[n1]; wela=1; wela=0; delay(5); } }
// if(remind==0) // { // for(a5=0;a5<3;a5++)//数码管0-2位依次显示 // { // yu1=shang1%10;//取余 // shang1=shang1/10;//取商 // if(a5==1)//循环到个位时显示小数点 // { // P0=table[yu1]+0x80; // dula=1; // dula=0; // P0=weixuan[a5]; // wela=1; // wela=0; // delay(5); // } // else // { // P0=table[yu1]; // dula=1; // dula=0; // P0=weixuan[a5]; // wela=1; // wela=0; // delay(5); // } // } // for(;a5<5;a5++)//数码管3-4位依次显示 // { // yu2=shang2%10;//取余 // shang2=shang2/10;//取商 // if(a5==3)//循环到个位时显示小数点 // { // P0=table[yu2]+0x80; // dula=1; // dula=0; // P0=weixuan[a5]; // wela=1; // wela=0; // delay(5); // } // else // { // P0=table[yu2]; // dula=1; // dula=0; // P0=weixuan[a5]; // wela=1; // wela=0; // delay(5); // } // } // // } // else // { // P0=table[13]; // dula=1; // dula=0; // P0=weixuan[0]; // wela=1; // wela=0; // delay(5); // // P0=table[16]; // dula=1; // dula=0; // P0=weixuan[1]; // wela=1; // wela=0; // delay(5); // // P0=table[14]; // dula=1; // dula=0; // P0=weixuan[2]; // wela=1; // wela=0; // delay(5); // } }
void check_display() { if(run==0) TR0=0; if(run==1&&TR0==0||run==2&&TR0==0) { TMOD=0x01; TH0=(65536-9216)/256; TL0=(65536-9216)%256; EA=1; ET0=1; TR0=1; if(run==2&&time0!=0.00001) time=time0; } if(time==time0&&run==1&&remind==0) { // bee(); run=0; remind=1; } if(time<=0&&run==2&&remind==0) { // bee(); run=0; remind=1; } if(run!=3) display(time); else display(time0); }
void main() { Init(); while(1) { keyscan(); stor(); check_display(); } }
|