永发信息网

51单片机,以下代码哪里错了?数码管可以计数,但独立按键不好使

答案:2  悬赏:30  手机版
解决时间 2021-02-16 09:00
  • 提问者网友:浪荡绅士
  • 2021-02-15 19:03
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num1,num2,num3,shi,ge;

void displayms(uchar);
void key();
void deplay();

void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
while(1)
{
key();
deplay();
}
}

void key()
{
if(k1==0)
{
displayms(100);
if(k1==0)
{
num2++;
if(num2==60)
num2=0;
while(!k1);
}

}
if(k2==0)
{
displayms(100);
if(k2==0)
{
if(num2==0)
num2=60;
num2--;
while(!k2);
}

}
if(k3==0)
{
displayms(100);
if(k3==0)
{
num2=0;
while(!k3);
}

}
if(k4==0)
{
displayms(100);
if(k4==0)
{
while(!k4);
TR0=~TR0;
}
}
}
void deplay()
{
uchar num;

num=0;
while(1)
{
switch(num)
{
case(0): LSA=0; LSB=0; LSC=0; break;
case(1): LSA=1; LSB=0; LSC=0; break;
}
if(num==0)
P0=table[ge];
else
P0=table[shi];
num++;
if(num==2)
num=0;

displayms(100);
P0=0x00;
}
}

void aha()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)
{
num1=0;
num2++;
if(num2==60)
num2=0;
shi=num2/10;
ge=num2%10;
}
}

void displayms(uchar xms)
{
while(xms--);
}
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-02-15 20:31
deplay(); 是显示子程序吧,为什么有while(1)呢,这是不进入死循 环了吗?就一直在显示子程序中了,不回到主程序了,也就不会调用键盘程序:key(); 当然那按键就不好使了。
把显示程序中的while(1) 删掉,这只能写在主程序中。
全部回答
  • 1楼网友:梦中风几里
  • 2021-02-15 20:37
位选即wei=1;p0=0xfe;wei=0;可以放到while(1)下面,只不过在 duan=1;p0=leddata[num];duan=0;后面要加个毫秒的延时 你想你频繁地打开位锁存器 再打开段锁存器都是us级的,即使led能够响应,亮度也不能保证
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯