标题:
我想用单片机按键控制数码管但是结果显示按只能增加而不能减少?
[打印本页]
作者:
455130517
时间:
2020-10-11 08:25
标题:
我想用单片机按键控制数码管但是结果显示按只能增加而不能减少?
单片机源程序如下:
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 num=0;
u8 buff[2];
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit k2=P3^0;
sbit k1=P3^1;
sbit p22=P2^2;
sbit p23=P2^3;
sbit p24=P2^4;
void delay(){
u16 i=100;
while(i--);
}
void digdisplay()
{
u8 i;
for(i=0;i<=1;i++)
{
switch(i)
{
case 0:p22=0;p23=0;p24=0;break;
case 1:p22=0;p23=0;p24=1;break;}
P0=buff[i];
delay();
P0=0x00;
}
}
u8 keyscanf()
{
static u8 keyan=1;
if(keyan==1&&(k1==0||k2==0))
{
delay();
keyan=0;
if(k1==0)return 2;
else if(k2==0)return 1;
}
else if(k1==1&&k2==1){
keyan=1;
}
return 0;
}
void datpros()
{
if(keyscanf()==1)
{num++;
if(num==100){
num=0;}
}
else if(keyscanf()==2)
{num--;
if(num==0)
{
num=99;}
}
buff[0]=smgduan[num%10];
buff[1]=smgduan[num/10];
}
void main()
{
while(1){
datpros();
digdisplay();
}
}
复制代码
作者:
xdqfc
时间:
2020-10-11 10:16
程序没有细看,有仿真器的话,看看程序有没有进入减法的相关代码,应该很好检查的。
作者:
liuzx66
时间:
2020-10-11 10:24
程序逻辑不对啊。我没有看你的程序,只是从问题来推测BUG
作者:
jinsheng7533967
时间:
2020-10-11 19:54
不要else if(keyscanf()==2),直接 if(keyscanf()==2),可先将值设一个3,4,5,按减看结果,也可屏蔽加的部份直接调减的部份
作者:
c20160526
时间:
2020-10-12 08:05
你按钮检测返回逻辑有问题,你可以直接写K1==0的时候执行加,k2执行减,没必要执行一个返回,然后再用返回值来判断加还是减
作者:
asd15455455
时间:
2020-10-12 09:42
程序没有细看,有仿真器的话,看看程序有没有进入减法的相关代码,应该很好检查的。
作者:
man1234567
时间:
2020-10-12 11:05
keyscanf()中的
if(k1==0)return 2;
else if(k2==0)return 1;
}
else if(k1==1&&k2==1){
keyan=1;
}
都是顺次执行写成这样条理就清楚了:
if(k1==0)return 2;
if(k2==0)return 1;
if(k1==1&&k2==1)keyan=1;
keyscanf()不管前面return了什么结尾都return 0。
先理清程序,其他问题自己查。
作者:
robinsonlin
时间:
2020-10-12 17:35
判断问题:
按键检测那里是自己写,还是抄回来改的。那个keyan变量,是处理连按效果用的么? 建议删除这个判断,先直接简单的检测按键。
解决办法:
先不处理数字,把按键值直接反馈到显示界面,看看按键起到效果没有。 是不是你要的结果。
作者:
455130517
时间:
2020-10-12 21:01
好的,正在改,谢谢各位
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1