题目是这样的:
数码管前三位显示一个跑表,从000到999之间以1秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
错误:
大体功能我实现了,但是有些细节没搞明白,也没解决,恳请各位老哥帮我看一下,看看问题出在哪里不胜感激。就是我按下key2和key3是数码管会灭两个,但是功能正常,而且最后一个数码管会格外的亮。后面我会附上两张图,请各位大哥看一下,下面我把我的程序贴上去。
程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar bai,shi,ge,tt;
uint num;
void keyscan();
void init();
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
bai=num/100; //给百十个位定义
shi=num%100/10;
ge=num%10;
keyscan();
display(bai,shi,ge); //调用显示子程序
}
}
//-----------------------------
void init() //初始化函数
{
num=0;
tt=0;
TMOD=0x01; //定时方式1
EA=1; //总中断打开
ET0=1; //定时T0允许中断
TR0=1; //打开定时T0中断
TH0=(65536-50000)/256; //给定时器T0附初值
TL0=(65536-50000)%256;
}
//--------------------------------
void exter() interrupt 1 //T0工作方式1
{
TH0=(65536-50000)/256; //给定时器T0附初值
TL0=(65536-50000)%256;
tt++;
}
//-------------------------------
void delay(uint z)
{
uint x,y; //延时程序延时一毫秒
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//--------------------------------
void display(uchar bai,uchar shi,uchar ge) //3位显示程序
{
dula=1;
P0=table[bai];
dula=0; //对百位赋值
P0=0xff; //防止数据进入位选造成错乱
wela=1;
P0=0xfe;
wela=0;
delay(1); //打开数码管第一个即百位
dula=1;
P0=table[shi];
dula=0; //对十位赋值
P0=0xff; //防止数据进入位选造成错乱
wela=1;
P0=0xfd;
wela=0;
delay(1); //打开数码管第二个即十位
dula=1;
P0=table[ge];
dula=0; //对个位赋值
P0=0xff; //防止数据进入位选造成错乱
wela=1;
P0=0xfb;
wela=0;
delay(1); //打开数码管第三个即个位
}
//---------------------------------------
void keyscan() //键盘扫描程序
{
if(key1==0) //判断key1是否按下
{
delay(5); //防抖
if(key1==0)
{
TR0=0; //关闭定时器
dula=1; //关闭数码管
P0=0xff;
dula=0;
delay(1);
wela=1;
P0=0xff;
wela=0;
}
while(!key1); //判断key1是否松开
delay(5); //防抖
while(!key1);
TR0=1; //打开定时器
}
else //key1断开
{
if(tt==20) //判断是否一秒
{
tt=0; //一秒一数
num++; //数字累加
if(num==999) //判断NUM是否为999
{
num=0; //num归0
}
}
}
//-------------------------------
if(key2==0) //判断key2是否按下
{
delay(5); //消抖
if(key2==0)
{
TR0=0; //关闭定时器
}
while(!key2); //抬起检测
delay(5);
while(!key2);
}
//--------------------------------
if(key3==0)
{
delay(5);
if(key3==0)
{
TR0=0; //关闭定时器
}
while(!key3); //抬起检测
delay(5);
while(!key3);
TR0=1; //开启定时器
}
//----------------------------------
if(key4==0)
{
delay(5);
if(key4==0)
{
num=0;
if(tt==20) //判断是否一秒
{
tt=0; //一秒一数
num++; //数字累加
if(num==999) //判断NUM是否为999
{
num=0; //num归0
}
}
}
}
}
</div>
-
正常情况下
-
按下key2的情况下
一周热门 更多>