找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1895|回复: 5
打印 上一主题 下一主题
收起左侧

单片机按键点亮LED灯条的程序问题,为什么放直接在while(1)中就不行呢?

[复制链接]
跳转到指定楼层
楼主
按键点亮LED灯条,键号越大点亮的越多。在主函数中 , P2=LED2;P3=LED3;  放在if(key!=-1)中才可以保持按键值,否则按键弹上去后就恢复到原始状态,为什么放直接在while(1)中就不行呢



代码如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. unsigned char table[]={0x11,0x12,0x14,0x18,0x21,
  4.          0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
  5. void delay(int x)
  6. {
  7.         int i,j;
  8.         for(i=x;i>0;i--)
  9.                 for(j=110;j>0;j--);
  10. }
  11. unsigned char keys_scan()     //键盘扫描
  12. {
  13.         unsigned char i,j,hcode,zcode;
  14.         P1=0xf0;     //行拉低,列拉高
  15.         if((P1&0xf0)!=0xf0)   // 判断是否有键按下
  16.         {
  17.                 delay(20);     //延时抖动
  18.                 if((P1&0xf0)!=0xf0)
  19.                 {
  20.                         hcode=0xfe;     //初始值
  21.                         for(j=0;j<4;j++)
  22.                         {
  23.                                 P1=hcode;
  24.                                 if((P1&0xf0)!=0xf0)
  25.                                 {
  26.                                         zcode=~P1;     //取反判断行坐标
  27.                                         for(i=0;i<16;i++)
  28.                                         {
  29.                                                 if(zcode==table[i])
  30.                                                         return i;
  31.                                         }
  32.                                 }        
  33.                                 else
  34.                                         hcode=_crol_(hcode,1);   
  35.                         }
  36.                 }
  37.         }
  38.         return -1;
  39. }
  40. void main(void)
  41. {
  42.         unsigned char key,i,LED2,LED3;
  43.         key=-1;
  44.         P2=0x00;
  45.         P3=0X00;
  46.         while(1)
  47.         {
  48.                 key=keys_scan();        
  49.                 if(key!=-1)
  50.                 {
  51.                         LED2=0x00;
  52.                         LED3=0X00;
  53.                         for(i=0;i<=key;i++)
  54.                         {
  55.                                 if(i<8)
  56.                                 {                                
  57.                                         LED2<<=1;
  58.                                         LED2++;
  59.                                 }
  60.                                 else
  61.                                 {
  62.                                         LED3<<=1;
  63.                                         LED3++;
  64.                                 }
  65.                         }
  66.                         P2=LED2;
  67.                         P3=LED3;
  68.                 }
  69.                
  70.         }
  71.         
  72. }
复制代码

全部资料51hei下载地址:
EXP16.rar (57.18 KB, 下载次数: 6)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2020-3-24 08:37 | 只看该作者
单独把 P2=LED2;                         P3=LED3;放在  if(key!=-1)外应该可以,出虾米问题?
回复

使用道具 举报

板凳
ID:697917 发表于 2020-3-24 08:47 | 只看该作者
你的逻辑编写有问题,key_scan()中仔细看看
                        for(j=0;j<4;j++)
                        {
                               P1=hcode;
                                if((P1&0xf0)!=0xf0)
                                {
                                        zcode=~P1;     //取反判断行坐标
                                        for(i=0;i<16;i++)
                                        {
                                                if(zcode==table)
                                                        return i;
                                        }
                                }        
                                else
                                        hcode=_crol_(hcode,1);   
                        }

循环下 P1=hcode;每次都重新赋值,那4次扫描有什么不同。
回复

使用道具 举报

地板
ID:704397 发表于 2020-3-24 10:34 | 只看该作者
本帖最后由 DEVOTION 于 2020-3-24 10:38 编辑
黎明初至 发表于 2020-3-24 08:47
你的逻辑编写有问题,key_scan()中仔细看看
                        for(j=0;j

hcode的初值是0xfe,设在for循环外面的,如果 按下的行不是P1.0,就会执行else,hcode的值左移
回复

使用道具 举报

5#
ID:704397 发表于 2020-3-24 10:35 | 只看该作者
xianfajushi 发表于 2020-3-24 08:37
单独把 P2=LED2;                         P3=LED3;放在  if(key!=-1)外应该可以,出虾米问题?

如果直接放在外面,LED只有在按下键不松开的时候才亮,键弹上来后就又恢复到原始灭的状态
回复

使用道具 举报

6#
ID:332444 发表于 2020-3-24 11:07 | 只看该作者
从道理来讲,LED保存的值只有在按键按下时会被修改,因此,不存在按键判断外被修改的可能,因此,是可以放在按键判断外.
之所以看到按键按下与释放不同的结果,是因为循环太快的缘故,当放下按键时的值可能是随机的.

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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