用51单片机设计了一个简单的倒计时器,但数码管有点小问题,请教高手

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
uchar data1[]={5,9}; //保存倒计时初始值
sbit a=P1^0; //设置键
sbit b=P1^1; //增一键
sbit c=P1^2; // 减一键
sbit d=P1^3; // 确定键
sbit e=P3^0; //控制LED发光
sbit f=P3^2;
void keyscan();
void display();
void delayms(uint t)
{
uint a,b;
for(a=t;a>0;a--)
for(b=125;b>0;b--);
}
void display() //数码管显示函数
{
uchar i;
P2=0X01;
for(i=0;i<2;i++)
{

P0=table[data1[i]];
P2=~(P2<<i);
delayms(2);
P2=~P2;
}

while(!(data1[1]||data1[0])) //当倒计时到0时点亮LED,停止计时
{

TR0=0;
e=0;
f=0;
P2=0XFC;
P0=0X3F;
}

}

void main()
{
// delayms(1);
TMOD=0x01;
ET0=1;
EA=1;
TH0=0X3C;
TL0=0XB0;
TR0=1;

while(1)
{
keyscan();
display();

}
}

void timer0() interrupt 1 using 0
{
uchar count;
count++;
if(count==20)
{
count=0;
data1[1]--;
if(data1[1]==-1)
{
data1[1]=9;
data1[0]--;

}
}
else
TH0=0X3C;
TL0=0XB0;
}

void keyscan()
{
uchar num;
if(a==0)
{
delayms(10);
if(a==0)
{
TR0=0;
num++;

}
}
while(a==0);//松手检测
if(num==1)
{
if(b==0)
{
delayms(5);
if(b==0)
{
while(!b)
{
display();
}
data1[1]++;
if(data1[1]==10)
{

data1[1]=0;
data1[0]++;
if(data1[0]==6)
data1[0]=1;
}
}
}
if(c==0)
{
delayms(10);
if(c==0)
{
while(!c);
data1[1]--;
if(data1[1]==255)
{
data1[1]=9;
data1[0]--;
}
}

}
}

if(d==0)
{
TR0=1;
num=0;
}

}
当每次按下按键时,左侧数码管都会抖动一次,如何改程序能克服抖动,电路图如下,如果必要的话可以改电路图

试试看:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {
0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};
uchar data1[]={5, 9}; //保存倒计时初始值
uchar num; //设为全局变量
uchar count;

sbit a = P1^0; //设置键
sbit b = P1^1; //增一键
sbit c = P1^2; //减一键
sbit d = P1^3; //确定键

sbit e = P3^0; //控制LED发光
sbit f = P3^2;

void delayms(uint t)
{
uint a, b;
for(a = t; a > 0; a--) for(b = 125; b > 0; b--);
}
void display() //数码管显示函数.
{
uchar i;
for(i = 0; i < 2; i++) {
P0 = table[data1[i]];
P2 = ~(i + 1);
delayms(2);
P2 = 255;
}
while(!(data1[1] || data1[0])) { //当倒计时到0时点亮LED,停止计时.
TR0 = 0;
e = 0;
f = 0;
P2 = 0xFC;
P0 = 0x3F;
}
}

void keyscan()
{
if(a == 0) {
display();
if(a == 0) {
TR0 = 0;
num++;
}
}
while(!a) display();//松手检测.

if(num >= 1) {
if(b == 0) {
display();
if(b == 0) {
while(!b) display();
data1[1]++;
if(data1[1] == 10) {
data1[1] = 0;
data1[0]++;
if(data1[0] == 6) data1[0] = 1;
}
}
}

if(c == 0) {
display();
if(c == 0) {
while(!c) display();
data1[1]--;
if(data1[1] == 255) {
data1[1] = 9;
data1[0]--;
}
}
}
}
if(d == 0) {TR0 = 1; num = 0;}
}

void main()
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1) {
keyscan();
display();
}
}

void timer0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
count++;
if(count == 20) {
count = 0;
data1[1]--;
if(data1[1] == -1) {
data1[1] = 9;
data1[0]--;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-28
把数码管显示的刷新程序放在中断中,不就OK了。
这就相当于多任务系统,又开了个线程。
相似回答