问题是按键按下后没用或者乱加数,初学单片机两周,还请高手指教。
改了两天,实在看不出是为什么。#include<reg52.h>
#include<intrins.h>//中断函数库
#define uchar unsigned char
#define uint unsigned int
sbit key_s=P1^1;
sbit key_m=P1^2;
sbit key_h=P1^3;
sbit start=P1^4;//四个按键
sbit bell=P3^6;//蜂鸣器
uchar temp,aa,num,i,x,y,z,restar,sec,min,hour,TCNT;
uchar duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//段码
uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//六个位
uchar buffer[6];//显示缓冲区,格式H1-H2-m1-m2-s1-s2
void delay(unsigned int us)
{
while(us--);
}
//动态扫描显示
void scandisp()
{
unsigned char i,value;
for(i=0;i<6;i++)
{
P2=0xc0;//消影,1100 0000
value=duan[buffer[i]];
P0=value;
P2=wei[i];
delay(100);
}
}
//计算时分秒高低位数据并缓存
void display()
{
scandisp();
buffer[0]=hour/10;
buffer[1]=hour%10;
buffer[2]=min/10;
buffer[3]=min%10;
buffer[4]=sec/10;
buffer[5]=sec%10;//时高,时低,分高,分低,秒高,秒低
}
//按键检测及加法
void keyadd()
{
display();
P2=0xc0;//1100 0000
restar=0;
if(key_s==0)
{
delay(100);
if(key_s==0)
{
sec++;
if(sec==60)
{
sec=0;
}
key_s=1;
while(sec==0)
display();
}
}
if(key_m==0)
{
delay(100);//避开抖动时期
if(key_m==0)
{
min++;
if(min==60)
{
min=0;
}
key_m=1;
while(min==0)
display();
}
}
if(key_h==0)
{
delay(100);
if(key_h==0)
{
hour++;
if(hour==24)
{
hour=0;
}
key_h=1;
while(hour==0)
display();
}
}
if(start==0)
{
delay(100);
if(start==1)
{
restar=1;
}
}
}
void main()
{
P2=0xc0;//每个数码管都选通
P0=0x3f;//都显示0
key_s=1;
key_m=1;
key_h=1;
start=1;//按键初始化
/*计时开始被按下才进入计时状态*/
while(1)
{
if(start==0)break;
}
/*中断设置*/
hour=0;
min=0;
sec=0;
TCNT=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
while(1)
{
keyadd();
if(restar==1)
break;
}
}
void Timer0(void) interrupt 1 //中断服务程序 1为中断号,由优先级决定
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//重新赋值
TCNT++;
if(TCNT==20)
{
sec++;
TCNT=0;
if(sec==60)
{
min++;
sec=0;
if(min==60)
{
hour++;
min=0;
if(hour==24)
{
hour=0;
min=0;
sec=0;
TCNT=0;
}
}
}
}
}
|