#include<reg52.h> //100秒的秒表,每10毫秒计数一次,共四位显示,
#define uchar unsigned char
#define uint unsigned int
unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码
unsigned char tab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //秒后带小数点的段码
uint x;
sbit key=P3^2; //开始停止按键
void delay(uint i) // 1ms延时
{
uchar j;
while(i--)
{
for(j=0;j<120;j++);
}
}
void display(uint x) //显示子程序
{
P2=0xef; //十位秒显示
P0=smg[x/1000];
delay(3);
P2=0xff; //关闭数码管
P0=0xff;
delay(3);
P2=0xdf; //个位秒显示,带小数点
P0=tab[x/100%10];
delay(3);
P2=0xff; //关闭数码管
P0=0xff;
delay(3);
P2=0xbf; //小数点后一位显示
P0=smg[x/10%10];
delay(3);
P2=0xff;
P0=0xff;
delay(3);
P2=0x7f; //小数点后第二位显示
P0=smg[x%10];
delay(3);
P2=0xff;
P0=0xff;
delay(3);
}
void main()
{ x=0;
EA=1; //开总中断
EX0=1; //开外部中断0
IT0=1; //负跳变触发
TMOD=0x01; //定时器工作方式1;
TR0=0; //启动定时器
TF0=0; //溢出标志位清0
TH0=(65536-10000)/256; //定时器0高8位赋值
TL0=(65536-10000)%256; //定时器0低8位赋值
while(1)
{ while(TF0==1) //当溢出时 ,标志位变1
{ TF0=0; //标志位清0
x++; //计数
TH0=(65536-9000)/256;
TL0=(65536-9000)%256;
}
display(x); //显示函数
if(x>10000) //超过10s后,归0
{x=0;}
}
}
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
TR0=~TR0; //定时器启动位取反
}
。。。。。。。。。。。。。。。。。。。。。。。。。
开始停止按键经常不管用,是不是该消抖呢,但该怎么消呢?求大神指点
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
if(key==0) //按键消抖
{
delay(20);
if(key==0)
{
TR0=~TR0; //定时器启动位取反
}
}
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
TR0=~TR0; //定时器启动位取反
}
从你中断服务函数看,控制定时器的开启和关闭,可能造成原因,一次按下连续两次或多次进入中断0服务函数,造成开启或关闭。所以,你应该在中断服务函数里面加上这么些语句:while(!EXTI0); EXTI0在前面定义为sbit EXTI0=P3^2;进入中断时关闭EX0,出中断前开启EX0用来保证一次触发只有一次中断。
试了,不行,按下按键后,只有一个数码管显示0,其他数码管都灭了
一周热门 更多>