标题:
数码管只显示四位0,而且按键无反应,应该是单片机程序逻辑上的问题
[打印本页]
作者:
skcxks
时间:
2019-5-29 23:53
标题:
数码管只显示四位0,而且按键无反应,应该是单片机程序逻辑上的问题
下面是原程序
#include"math.h"
#include "reg51.h"
#define uchar unsigned char
uchar key_temp,key=0,i,j,k,t=0;
uchar a=0,b=0,c=0,d=0;
unsigned long qian,hou;
uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
static unsigned char state_key=0;
static unsigned char state_dis=0;
void keyscan()
{
switch(state_key)
{
case 0:
key_temp=(P1&0x0f);
if(key_temp!=0x0f)
t=0;
state_key=1;
break;
case 1:
if(t>=10)
{
if(key_temp==(P1&0x0f))
{
if(P1^0==0)
key=1;
if(P1^1==0)
key=2;
if(P1^2==0)
key=3;
if(P1^3==0)
key=4;
}
state_key=2;
}
else
state_key=0;
break;
case 2:
if(key_temp==(P1&0x0f))
{
state_key=0;
break;
}
key=0;//default:break;
}
}
void keyaction()
{
switch(key)
{
case 1:break;
case 2:i=0;
i++;
if(i>9)
break;
case 3:j=0;
if(j<=3)
j++;
switch(j)
{
case 0:P3=0xfe;i++;break;
case 1:P3=0xfd;i++;break;
case 2:P3=0xfb;i++;break;
case 3:P3=0xf7;i++;break;
}
break;
case 4: k=0;
k++;
if(k==1)
hou=hou+qian;
qian=0;
if(k==2)
hou=hou+qian;
qian=0;
k=0;
break;
}
}
void display()
{
switch(j)
{
case 0:P2=table[a];break;
case 1:P2=table[b][b];break;
case 2:P2=table[c];break;
case 3:P2=table[d];break;
}
}
void display0()
{
switch(state_dis)
{
case 0:a=i;b=0;c=0;d=0;break;
case 1:b=i;c=0;d=0;break;
case 2:c=i;d=0;break;
case 3:d=i;break;
}
display();
}
void time0init()
{
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
EA=1;
ET0=1;
TR0=1;
}
void time0()interrupt 1
{
TH0=-50000/256;
TL0=-50000%256;
t++;
if(state_dis<=3)
state_dis++;
else
state_dis=0;
}
void main()
{
time0init();
while(1)
{
keyscan();
keyaction();
display0();
switch(j)
{
case 0:qian=a;break;
case 1:qian=a+b*10;break;
case 2:qian=a+b*10+c*100;break;
case 3:qian=a+b*10+c*100+d*1000;break;
}
a=0;
b=0;
c=0;
d=0;
}
}
复制代码
数码管只显示四位0,而且按键无反应,应该是逻辑上的问题,实在找不到,求大神!
作者:
wc86110
时间:
2019-5-30 06:52
这源程序明显被阉割过
作者:
m182892
时间:
2019-5-30 08:22
定时器及中断好像没问题,按键和显示程序认真检查一下,这两者其中一个出问题都会导致显示0而没有其它动作。
作者:
skcxks
时间:
2019-5-30 08:27
wc86110 发表于 2019-5-30 06:52
这源程序明显被阉割过
这是我自己写的程序,通过3位按钮使用计算器
作者:
随风飘远
时间:
2019-5-30 11:20
可以自己调试一下, main函数里先把数码管用延时的方式都显示一遍,没有问题再调试按键。刚开始还要多看别人的代码
作者:
suncat0504
时间:
2019-5-30 14:13
1、keyaction()函数中
case 2:i=0;
i++;
if(i>9)
break;
case 3:j=0;
if(j<=3)
j++;
这样的处理逻辑,每次主函数进入这个函数后,P1^1或者P1^2在按下时,走case 2或case 3的分支,i和j永远都是从0开始,加一次变成1,永远不会有2以后的数字出现?你确定是需要做成这样的逻辑?
2、display()函数中case 1:P2=table[b][b];break;,这个table[b][b]是什么意思?
3、keyscan函数中
case 0:
key_temp=(P1&0x0f);
if(key_temp!=0x0f)
t=0;
state_key=1;
的处理,无论是否有按钮按下,state_key=1;都会被执行,下次进入case 1的分支,你确定这个逻辑正确?不是应该有按钮按下了,下次才进入case 1,判断是那个按钮按下吗?是不是改成
if(key_temp!=0x0f) {
t=0;
state_key=1;
}更合理一些?
按照你现在的扫描逻辑,即使没有按钮按下,case 0,case 1,case 2也会按照顺序全都走一遍!
另外自己的程序,无论是变量的声明,还是代码,都没有注释,即使现在你能看懂。过段时间你再看未必能明白。既然编程,一定要养成写注释的良好习惯。
作者:
wulin
时间:
2019-5-30 14:46
楼上都是乱猜的,这种最基础最基础的东西都是错的怎么帮你???
case 1:
if(t>=10)
{
if(key_temp==(P1&0x0f))
{
if(P1^0==0)??????????
key=1;
if(P1^1==0)??????????
key=2;
if(P1^2==0)?????????
key=3;
if(P1^3==0)?????????
key=4;
}
state_key=2;
}
else
state_key=0;
break;
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1