单片机程序求修改,实现按键控制数码管0-9,急!!!

求单片机C语言程序:0~9秒计数器;第1个独立按键控制加法功能,第2个独立按键控制减法功能,第3个独立按键控制清零功能,第4个独立按键控制实现定时器1方式1定时1S使得数码管逐渐显示0~9功能,再按一次第4按键的话数字会暂停,以下是1个数码管实现的类似程序,1、2、3功能均已实现,就是第4个按键再按一次的话数字会暂停想不出怎么编,求补充!!

#include <reg51.h>
unsigned int num,a;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
unsigned char code led_code[20]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,
0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
void delay(unsigned char i)
{
unsigned char j;
for(;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
/*实现加法功能*/
if(key0==0)
{
delay(7);
if(key0==0)
{
num++;
if(num==10) num=0;
while(key0!=1);
delay(7);
while(key0!=1);
}
}

/*实现减法功能*/
if(key1==0)
{
delay(7);
if(key1==0)
{
if(num==0) num=10;
num--;
while(key1!=1);
delay(7);
while(key1!=1);
}
}
/*实现清零功能*/
if(key2==0)
{
delay(7);
if(key2==0)
{
num=0;
while(key2!=1);
delay(7);
while(key2!=1);
}
}
/*实现定时器1方式1定时1S使得数码管加1显示功能*/
if(key3==0)
{
delay(7);
if(key3==0)
{
while(1)
{
if(a>20)
{
a=0;
if(num==10) num=0;
P3=led_code[num];
num++;

}

}

}

}
}
void T1_ini()
{
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void timer1() interrupt 3
{
a++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
void display()
{
P3=led_code[num];
}
void main()
{
T1_ini();
while(1)
{
keyscan();
display();
}
}

#include <reg51.h>
unsigned int num,a;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;

bit flag;

unsigned char code led_code[20] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay(unsigned char i)
{
unsigned char j;
for(;i>0;i--) for(j=110;j>0;j--);
}

void keyscan()
{
/*实现加法功能*/
if(key0==0) {
delay(7);
if(key0==0) {
num++;
if(num==10) num=0;
while(key0==0);
}
}

/*实现减法功能*/
if(key1==0) {
delay(7);
if(key1==0) {
num--;
if(num==-1) num=9;

while(key1==0);

}
}
/*实现清零功能*/
if(key2==0) {
delay(7);
if(key2==0) {
num=0;
while(key2==0);
}
}
/*实现定时器1方式1定时1S使得数码管加1显示功能*/
if(key3==0) {
delay(7);
if(key3==0) {
flag = ~flag;
while(key3==0);
}
}
}
void T1_ini()
{
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void timer1() interrupt 3
{
a++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
void display()
{
P3=led_code[num];
}
void main()
{
T1_ini();
while(1)
{
keyscan();
display();
if(a >= 20 && flag) {
a = 0;
num++;
if(num==10) num=0;
}
}
}
试试看。追问

这个可以啊,超级感谢啊,我想知道那个flag是干什么用的?求大神解释!!!

追答

flag 是用来记录按键按下奇偶次数的标志位。

追问

这种bit定义的方法我们还没有教过,可以详细的解释一下吗?flag是怎么变化的?初始值是多少

追答

肯定学过 char、int...。
这些,分别是定义八位的、16位的变量。
在单片机的 C51 语言中,还可以用 bit 定义一个 1 位的变量。

这种变量的值,只有 0 和 1。

初始值,应该自己设定。

对于本题目,设定不设定,也没有多大的关系。

追问

if(a >= 20 && flag) {
a = 0;
num++;
if(num==10) num=0;
}
那这里是指只要flag有变化且a>=20就会执行吗?

追答

只要:flag == 1,并且 a >= 20,就会执行。

flag == 1,可简写成 flag。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-20

//将key3改成以下的程序就OK了
if(key3==0) 
{  
delay(7); 
if(key3==0) 
{
while(key3==0);
if(TR1==1)
{
    TR1 = 0;
}
else
{
    TR1 = 1;

}


}
}
    if(a>=20)
    {
        a = 0;
        num ++;
        if(num >= 10)
        {
            num = 0;
        }
        P3=led_code[num];
    }

追问

不好意思啊,程序好像有问题。。没有那个效果

相似回答