我用按键和定时做的时钟。目标i是按一下。分钟小可以加减一次,但是实际上他加减不止一次;;
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 second=0,minute=0,hour=12;
u8 buff[8]={0};
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i){
while(i--);
}
void dings(){
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;
EA=1;
TR0=1;
ET0=1;
}
void display(){
u8 i;
for(i=0;i<8;i++){
switch(i){
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=buff[i];//发送段码 若无这一段,数码管亮度大大降低
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void sbuff(){
buff[0]=smgduan[second%10];
buff[1]=smgduan[second/10];
buff[2]=0x40;
buff[3]=smgduan[minute%10];
buff[4]=smgduan[minute/10];
buff[5]=0x40;
buff[6]=smgduan[hour%10];
buff[7]=smgduan[hour/10];
}
u8 key(void){
if(k1==0){
delay(1000);
if(k1==0){
return 1;
}
while(!k1);
}
if(k2==0){
delay(1000);
if(k2==0){
return 2;
}
while(!k2);
}
if(k3==0){
delay(1000);
if(k3==0){
return 3;
}
while(!k3);
}
if(k4==0){
delay(1000);
if(k4==0){
return 4;
}
while(!k4);
}
return 0;
}
void zhongduan() interrupt 1{
u8 count;
TH0=0X3C;
TL0=0XB0;
count++;
if(count==20){
count=0;
second++;
if(second==60){
second=0;
minute++;
if(minute==60){
minute=0;
hour++;
if(hour==24){
hour=0;
}
}
}
}
}
void change(u8 val){
switch(val){
case 1: minute++;
if(minute==59){
minute=0;
}
break;
case 2: minute--;
if(minute==0){
minute=59;
}
break;
case 3:hour++;
if(hour==24){
hour=0;
}
break;
case 4: hour--;
if(hour==0){
hour=24;
}
break;
}
}
void main(){
dings();
while(1){
change(key());
sbuff();
display();
}
}
按键已消抖。。。。。大神指导啊!!!。。。
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 second=0,minute=0,hour=12;
u8 buff[8]={0};
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i){
while(i--);
}
void dings(){
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;
EA=1;
TR0=1;
ET0=1;
}
void display(){
u8 i;
for(i=0;i<8;i++){
switch(i){
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=buff[i];//发送段码 若无这一段,数码管亮度大大降低
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void sbuff(){
buff[0]=smgduan[second%10];
buff[1]=smgduan[second/10];
buff[2]=0x40;
buff[3]=smgduan[minute%10];
buff[4]=smgduan[minute/10];
buff[5]=0x40;
buff[6]=smgduan[hour%10];
buff[7]=smgduan[hour/10];
}
u8 key(void){
if(k1==0){
delay(1000);
if(k1==0){
return 1;
}
while(!k1);
}
if(k2==0){
delay(1000);
if(k2==0){
return 2;
}
while(!k2);
}
if(k3==0){
delay(1000);
if(k3==0){
return 3;
}
while(!k3);
}
if(k4==0){
delay(1000);
if(k4==0){
return 4;
}
while(!k4);
}
return 0;
}
void zhongduan() interrupt 1{
u8 count;
TH0=0X3C;
TL0=0XB0;
count++;
if(count==20){
count=0;
second++;
if(second==60){
second=0;
minute++;
if(minute==60){
minute=0;
hour++;
if(hour==24){
hour=0;
}
}
}
}
}
void change(u8 val){
switch(val){
case 1: minute++;
if(minute==59){
minute=0;
}
break;
case 2: minute--;
if(minute==0){
minute=59;
}
break;
case 3:hour++;
if(hour==24){
hour=0;
}
break;
case 4: hour--;
if(hour==0){
hour=24;
}
break;
}
}
void main(){
dings();
while(1){
change(key());
sbuff();
display();
}
}
按键已消抖。。。。。大神指导啊!!!。。。