找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8906|回复: 3
收起左侧

关于单片机按键Key1,每按一次数码管加一遇到的问题,请大神老师指导

[复制链接]
ID:233997 发表于 2017-11-17 23:19 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. sbit Key1=P3^1;
  8. sbit Key2=P3^0;
  9. sbit Key3=P3^2;
  10. sbit Key4=P3^3;

  11. uchar num,num1,shi,ge;
  12. uint z,i,j;

  13. uchar code smgdisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  14. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  15. void delayms(uint z);

  16. void keydown()
  17. {
  18.         if(Key1==0)
  19.         {
  20.                 delayms(5);
  21.                 if(Key1==0)     //再次确认按键按下
  22.                 {
  23.                         num++;
  24.                         if(num==60)
  25.                         num=0;
  26.                          while(!Key1);  //此处等待按键释放 ,但不加该语句,程序依然能够实现。这是为什么呢?
  27.                 }
  28.                         

  29.         }

  30. }   //关于该处语句的理解如此:按键按下松开,数码管数值加一。开发板上的现象是按下数码管不显示任何数字,松开数值加一。

  31. void display(uchar num1)
  32. {
  33.         shi=num1/10;
  34.         ge=num1%10;
  35.         
  36.         LSA=1;
  37.         LSB=0;
  38.         LSC=0;
  39.         
  40.         P0=smgdisplay[shi];
  41.         delayms(10);
  42.         P0=0X00;

  43.         LSA=0;
  44.         LSB=0;
  45.         LSC=0;
  46.         
  47.         P0=smgdisplay[ge];
  48.         delayms(10);
  49.         P0=0X00;
  50.         
  51.                

  52. }

  53. void main()
  54. {
  55.         while(1)
  56.         {
  57.                 keydown();
  58.                 display(num);
  59.         }

  60.                

  61. }

  62. void delayms(uint z)
  63. {
  64.         for(i=z;i>0;i--)
  65.         for(j=110;j>0;j--);

  66. }




复制代码

HC6800-ES V2.0 新版.pdf

759.71 KB, 下载次数: 7

回复

使用道具 举报

ID:149988 发表于 2017-11-18 04:35 | 显示全部楼层

RE: 关于按键Key1,每按一次数码管加一遇到的问题,请大神老师指导

while(!Key1);是将键值取反,如果手已松开,键值等于1,取反后,键值等于0,while(0);跳出大循环,执行后面的程序。如果此时手没有松开,键值等于0,取反后,键值等于1,while(1);继续进行大循环,什么时候键值等于1,取反后,键值等于0,那时候跳出大循环。这也是为什么手松开数码管才显示加1的原因。

评分

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

查看全部评分

回复

使用道具 举报

ID:233997 发表于 2017-11-18 20:39 | 显示全部楼层
不倒翁.WZT 发表于 2017-11-18 04:35
while(!Key1);是将键值取反,如果手已松开,键值等于1,取反后,键值等于0,while(0);跳出大循环,执行后 ...

是,谢谢。但如果不加这一句程序依然能够实现,不明白为什么
回复

使用道具 举报

ID:245899 发表于 2017-11-21 13:50 | 显示全部楼层
bai850107 发表于 2017-11-18 20:39
是,谢谢。但如果不加这一句程序依然能够实现,不明白为什么

不加这一句就没有松手检测,那么按下去数码管就会加一,但如果不加这句按键有抖动数码管可能会连续加上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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