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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2012|回復: 3
打印 上一主題 下一主題
收起左側

請教大神分析關于單片機鍵盤掃描的松手檢測程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:578842 發表于 2020-10-30 21:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
學了霖鋒的矩陣鍵盤,(與源程序有差別)程序基本如下:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int  u16;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,};

void delay(u16 z)
{
  u16 x,y;
  for(x=z;x>0;x--)
          for(y=110;y>0;y--);

}


void main()   
{   
        u8 key_l,key_h;
         while(1)
        {           
                P1=0xf0;                 
                key_l=P1;
                if(key_l!=0xf0)
                {
                  delay(10);
                   if(key_l!=0xf0)
                   {
                           key_l=key_l|0x0f;
                        P1=key_l;
                           key_h=P1;
        
                   }
               
                }           
                switch(key_h)
                {
                  case 0xee:P0=~smgduan[15];break;
                  case 0xde:P0=~smgduan[14];break;
                  case 0xbe:P0=~smgduan[13];break;
                  case 0x7e:P0=~smgduan[12];break;
                  case 0xed:P0=~smgduan[11];break;
                  case 0xdd:P0=~smgduan[10];break;
                  case 0xbd:P0=~smgduan[9];break;
                  case 0x7d:P0=~smgduan[8];break;
                  case 0xeb:P0=~smgduan[7];break;
                  case 0xdb:P0=~smgduan[6];break;
                  case 0xbb:P0=~smgduan[5];break;
                  case 0x7b:P0=~smgduan[4];break;
                  case 0xe7:P0=~smgduan[3];break;
                  case 0xd7:P0=~smgduan[2];break;
                  case 0xb7:P0=~smgduan[1];break;
                  case 0x77:P0=~smgduan[0];break;
                }  
          }
}

這個程序沒用松手檢測,但在開發板上試驗,很穩定,沒有一次按下是錯的。請教各位師傅,為什么呢?
普中的程序如下:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int  u16;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,};
#define smg P0
#define key P1
u8 keyvalue,keyvalue1;


void delay(u16 z)
{
  u16 x,y;
  for(x=z;x>0;x--)
          for(y=110;y>0;y--);

}

void keyscan()
{
  u8 a;
  a=0;
  key=0x0f;
    if(key!=0x0f)
    {
            delay(5);
              if(key!=0x0f)
          {
            switch(key)
            {
            case(0x07):keyvalue=0;break;
            case(0x0b):keyvalue=1;break;
            case(0x0d):keyvalue=2;break;
            case(0x0e):keyvalue=3;break;
            }
          }


    }
    key=0xf0;
    if(key!=0xf0)
    {
            delay(5);
              if(key!=0xf0)
          {
            switch(key)
            {
            case(0x70):keyvalue1=keyvalue;    break;
            case(0xb0):keyvalue1=keyvalue+4;  break;
            case(0xd0):keyvalue1=keyvalue+8;  break;
            case(0xe0):keyvalue1=keyvalue+12; break;
            }
          }
              

    }
   while((a<50)&&(key!=0xf0))        //松手檢測且限定時間退出程序
          {
                  delay(5);
                a++;
         
         
          }        //假如按鍵持續一直按下,會占用CPU的資源,因此設定一定的時間
                //讓CPU退出鍵盤掃描程序
}
void main()   
{
         while(1)
         {
                    keyscan();
                smg=~smgduan[keyvalue1]; //共陽的數碼管,要取反。
          }  

}

這個松手檢測必須有,不然有時顯示不正常。
這兩個程序一個沒用松手檢測,一個用了。但都是正常。
不知道為什么?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2020-10-31 07:18 | 只看該作者
按鍵松手檢測不是必不可少的,要看具體應用場合。樓主上面的示例中,鍵值是對應唯一1個常數,所以按下不松手,無論按鍵程序執行多少遍,其鍵值常量不變。假設帶入是變量x++,smgduan[x];,沒有松手檢測就亂套了。下面是改后的示例,成為松手后0~15隨機數了。
typedef unsigned char u8;
typedef unsigned int  u16;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,};
u8 x;
void delay(u16 z)
{
  u16 x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);

}
void main()   
{   
        u8 key_l,key_h;
        while(1)
        {           
                P1=0xf0;                 
                key_l=P1;
                if(key_l!=0xf0)
                {
                        delay(10);
                        if(key_l!=0xf0)
                        {
                                key_l=key_l|0x0f;
                                P1=key_l;
                                key_h=P1;
                        }
                }           
                x++;
                x%=16;
                switch(key_h)
                {
                        case 0xee:P0=~smgduan[x];break;
                        case 0xde:P0=~smgduan[x];break;
                        case 0xbe:P0=~smgduan[x];break;
                        case 0x7e:P0=~smgduan[x];break;
                        case 0xed:P0=~smgduan[x];break;
                        case 0xdd:P0=~smgduan[x];break;
                        case 0xbd:P0=~smgduan[x];break;
                        case 0x7d:P0=~smgduan[x];break;
                        case 0xeb:P0=~smgduan[x];break;
                        case 0xdb:P0=~smgduan[x];break;
                        case 0xbb:P0=~smgduan[x];break;
                        case 0x7b:P0=~smgduan[x];break;
                        case 0xe7:P0=~smgduan[x];break;
                        case 0xd7:P0=~smgduan[x];break;
                        case 0xb7:P0=~smgduan[x];break;
                        case 0x77:P0=~smgduan[x];break;
                }  
        }
}
回復

使用道具 舉報

板凳
ID:234075 發表于 2020-10-31 08:19 | 只看該作者
你應該使用的是數碼管顯示鍵值來驗證效果,這樣是看不出來是否有松手檢測效果的。你的程序沒有松手檢測,表面看是按了一次(按下時間較長),顯示也是對應的鍵值,其實程序是一直在循環并輸出這個鍵值;有了松手檢測,則按一次,不管按下時間多長,程序只經過了1次循環,也只輸出1次該鍵值;
在有些場景中必須有松手檢測的:
例如一個設備4個按鍵,分別是開機、關機、累加和累減,明顯的開機和關機的按鍵可以不用松手檢測,這個按鍵就是一個效果,開機或關機,不管按下多少次都無所謂;但是累加和累減就必須有松手檢測,他的效果是重復并累計的,如果沒有松手檢測,你按下一次,會出現累加或累減多次的效果。
回復

使用道具 舉報

地板
ID:578842 發表于 2020-10-31 10:46 | 只看該作者
嗯,明白了。謝謝各位的解釋。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月婷婷 六月丁香 | 久久天堂 | 亚洲一区视频在线 | 欧美日韩精品一区二区三区四区 | 亚洲欧美成人 | 免费国产一区二区视频 | 99精品久久久久久中文字幕 | 久久久久高清 | 日本不卡视频在线播放 | 久久久精品| 国产成人免费视频网站视频社区 | 玖玖精品| 正在播放国产精品 | 精品国产乱码久久久久久蜜柚 | 亚洲激情网站 | 精品中文字幕一区二区三区 | 色男人的天堂 | 天天操天天射综合网 | 成人福利在线 | 久久精品国产亚洲 | 日韩成人中文字幕 | 伊人精品在线视频 | 一区二区在线免费观看视频 | 天天躁日日躁狠狠躁白人 | www.久 | 亚洲国产黄色av | 亚洲精品久久国产高清情趣图文 | 午夜精品久久久久99蜜 | 91久久精品一区二区二区 | 亚洲欧美激情精品一区二区 | 国产免费一区二区 | 欧美一区日韩一区 | 久久蜜桃资源一区二区老牛 | 免费一区 | 欧美午夜一区 | 免费看的黄网站 | 成人av免费在线观看 | 久久国产精品免费视频 | 一级黄a视频 | 黑人一级片视频 | 国产美女视频黄a视频免费 国产精品福利视频 |