找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6108|回复: 5
收起左侧

当按下s1开关按键时数码管显示1 的单片机程序有问题应该怎么解决?

[复制链接]
ID:354566 发表于 2018-6-21 13:42 | 显示全部楼层 |阅读模式
程序目的是为了实现:当按下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();
                }
               
}

回复

使用道具 举报

ID:194257 发表于 2018-6-21 14:38 | 显示全部楼层
你的程序应该是停在了这句:while(!k1)
回复

使用道具 举报

ID:330198 发表于 2018-6-21 15:02 | 显示全部楼层
360截图20180621150121586.jpg
你while用的太多了,直接去掉也是一样的效果

评分

参与人数 1黑币 +5 收起 理由
hpy1997 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:356569 发表于 2018-6-22 09:35 来自手机 | 显示全部楼层
建议把按键写成一个带返回值的函数,然后再在主函数主循环里写,这样结构很清晰,以后任何需要用到按键的时候都可以直接复制。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:319344 发表于 2018-6-22 12:40 | 显示全部楼层
你想实现的是当按下一个键的时候只有一个亮,当同时按下两个或多个按键的时候只有一个亮对吧,你的问题是while(!K1),然后就没有然后了,我看不懂它会接下来怎么执行,改的话也比较简单,while(!k1);  或者while(!k1){},当按下一个键之后,就会死循环,不会去判断其它键是否按下了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:346616 发表于 2018-6-22 15:58 | 显示全部楼层
一定要学会调试,不然以后程序大了很麻烦,
你的问题出现在松手检测while(!k1)  和 while(!k2) 后面没有打分号,
使得与下方语句形成乱七八糟嵌套造成不明错误。
松手语句的意思,就是停止在当前这一句,C语言里面的分号是语句结束的重要标识。
还有,要保持一个良好的编码习惯,松手检测语句最好写在上一个语句后面,越过几个括号不是一个好风格。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表