久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2483|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品综合在线 | 国产探花在线观看视频 | 亚洲综合二区 | 亚洲精品一二区 | 久久久久久久久久久久久久国产 | 在线欧美日韩 | 美女久久| 91久久国产综合久久 | 亚洲精品二三区 | 黄色网址免费在线观看 | 中文字幕免费在线 | 91精品国产综合久久久久 | 超黄毛片 | 欧美在线视频网 | 国产 欧美 日韩 一区 | 日韩一区二区三区av | 亚洲欧美中文日韩在线v日本 | 国产成人99久久亚洲综合精品 | 蜜桃久久 | 精品久久久久久久久久久久久久 | 女同久久另类99精品国产 | 爱爱视频在线观看 | 成人激情视频免费在线观看 | 午夜精品久久久久久久久久久久 | 69视频在线播放 | 中文字幕1区2区 | 日韩欧美在线观看一区 | 操操日| 日日噜 | 久久一区二区免费视频 | 国产99视频精品免费视频7 | 亚洲综合无码一区二区 | 日韩高清一区 | 亚洲电影专区 | 日本韩国欧美在线观看 | 亚洲精品66 | www.亚洲一区二区三区 | 久久国产精品一区二区 | 91porn国产成人福利 | 亚洲高清在线观看 | 成人午夜黄色 |