标题:
当按下s1开关按键时数码管显示1 的单片机程序有问题应该怎么解决?
[打印本页]
作者:
kaitaoguo
时间:
2018-6-21 13:42
标题:
当按下s1开关按键时数码管显示1 的单片机程序有问题应该怎么解决?
程序目的是为了实现:当按下s1开关按键时数码管显示1;按下s2开关按键时数码管显示2;按下s3开关按键时,数码管显示0。程序显示无错误i,但现象只有当按下s1开关按键时数码管显示1,且灭不了,按其他键没反应,想知道为什么。下面是程序:
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
u8 code smgduan[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 };
void delay(u16 i)
{
while (i--);
} // 延时
void keypros()
{
if (k1==0) //S1开关
{
delay(1000); //防抖动
if(k1==0)
{
P0=smgduan[1]; //显示1
}
}
while(!k1) //显示1模块
if (k2==0) //S2开关
{
delay(1000); //防抖动
if(k2==0)
{
P0=smgduan[2]; //显示2
}
}
while(!k2) //显示2模块
if (k3==0) //S3开关
{
delay(1000); //防抖动
if(k3==0)
{
P0=smgduan[0]; //显示0
}
}
while(!k3); //显示0模块
}
void main()
{
LSA=1;
while(1)
{
keypros();
}
}
作者:
xiaoshan7748
时间:
2018-6-21 14:38
你的程序应该是停在了这句:while(!k1)
作者:
zhanghyg
时间:
2018-6-21 15:02
360截图20180621150121586.jpg
(26.44 KB, 下载次数: 79)
下载附件
2018-6-21 15:01 上传
你while用的太多了,直接去掉也是一样的效果
作者:
赤瞳之父
时间:
2018-6-22 09:35
建议把按键写成一个带返回值的函数,然后再在主函数主循环里写,这样结构很清晰,以后任何需要用到按键的时候都可以直接复制。
作者:
wenzedong
时间:
2018-6-22 12:40
你想实现的是当按下一个键的时候只有一个亮,当同时按下两个或多个按键的时候只有一个亮对吧,你的问题是while(!K1),然后就没有然后了,我看不懂它会接下来怎么执行,改的话也比较简单,while(!k1); 或者while(!k1){},当按下一个键之后,就会死循环,不会去判断其它键是否按下了
作者:
菜鸟来了
时间:
2018-6-22 15:58
一定要学会调试,不然以后程序大了很麻烦,
你的问题出现在松手检测while(!k1) 和 while(!k2) 后面没有打分号,
使得与下方语句形成乱七八糟嵌套造成不明错误。
松手语句的意思,就是停止在当前这一句,C语言里面的分号是语句结束的重要标识。
还有,要保持一个良好的编码习惯,松手检测语句最好写在上一个语句后面,越过几个括号不是一个好风格。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1