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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機按鍵處理程序(長按 短按 松手檢測)

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月01日   【字體:

一個很精妙的單鍵程序:

 bit flag=0; 定義標志
以下是鍵盤處理程序:
void scankey()   //掃描按鍵
{

if(p10= =0&&flag= =0)  //p10口按鍵及處理程序,其中flag如果為1就不用再掃描    就是這里,沒有消抖動了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1)  //如果p10為1,flag為1說明已經被按下并抬起
{
TR0=!TR0;    //松開時相應
flag=0;    //標志清零,為下次按鍵做準備(其實為一次處理)
}
}

以下是另一個一個檢測的主要部分:

#include <reg51.h>
#include <intrins.h>
#define key_port P0    //鍵盤接口定義
sbit key_port_0=key_port^0;
sbit key_port_1=key_port^1;
sbit key_port_2=key_port^2;
sbit key_port_3=key_port^3;


if(Key_down==PRESSED)
{
     while(Key_down==PRESSED)          //計數,用來判斷是長按還是短按
     {
 
      if( (counter++) > Long_cnt) //counter>65534:長按,
        {
     Key_Code=KEY_FP_DOWN;             //KEY1長按時返回的鍵值
    // counter=0;
           return;
        }
     }
     if(counter<=Long_cnt && counter>Short_cnt)   //counter<=65534:短按,counter>20:消抖動
     {   
    
      Key_Code=KEY_FP_DOWN;             //KEY1短按時返回的鍵值
   // counter=0;
           return;       
     }
}
 

以下程序可以作為一個單獨的 key.c 文件包含在項目里面:

#define KEYDELAY 25    /*首鍵延遲次數*/
#define KEYLOOP 10    /*連續鍵間隔次數,需小于KEYDELAY*/
unsigned char key_bak;
unsigned char key_temp;
unsigned char key_old;
unsigned char key_data;
bit key_ok;
    //  P1口行列式鍵盤  //
#define KEYPIN_L  P1               // 定義鍵掃描列端口為 P1低四位輸入  //
#define KEYPIN_H  P1              // 定義鍵掃描行端口為 P1高四位掃描輸出  //
    //內部私有函數  //
unsigned char fnKeycode(unsigned char key);     //  根據鍵盤映射表輸出順序鍵值            //
    //  P1口行列式鍵盤  //
//---------------------------------------------------------------------------//
void KeyScan(void)                    //鍵掃描
    {
    unsigned char sccode,recode;
    KEYPIN_L = KEYPIN_L|0x0f;                    //  P1低四位為列線輸入         //
    KEYPIN_H = KEYPIN_H&0x0f;                    //  P1高四位為行線發全零掃描碼 //
    if ((KEYPIN_L&0x0f) !=  0x0f)    //有鍵按下
        {
        key_temp = 鍵值;             //鍵掃描,獲得鍵值
        if (key_temp == key_bak)
            {
            key_old++;
          //  if (key_old==KEYDELAY)                //連續鍵,不要則把此if屏蔽
             //   {
               // key_ok=1;
              //  key_data=fnKeycode(key_temp);    //鍵*
               // key_old=KEYDELAY-KEYLOOP;
          //  }
        }
        else
            {
            key_old=0;
            key_bak=key_temp;
        }
    }
    else                            //鍵抬起
        {
        if (key_old)
            {
            key_ok=1;
            key_data=fnKeycode(key_temp);    //鍵*
/*      //      if (key_old==100)                //加上時間,不同時間不同功能,與連續鍵沖突
            //    {
           //     bp(1);
           //     key_data    +=    0x10;
         //  }
          //  if (key_old==200)
          //      {
           //     bp(2);
            //    key_data    +=    0x20;
         //   }
*/
        //}
        key_old=0;
    }
    KEYPIN_H = KEYPIN_H|0xf0;
}
//---------------------------------------------------------------------------//
unsigned char KeyGetcode(void)        //返回按鍵碼
{
    key_ok=0;
    return(key_data);
}
bit KeyTest(void)                //檢查有無按鍵
{
    KeyScan();            //鍵掃描
    return(key_ok);
bit flag=0; 定義標志
以下是鍵盤處理程序:
void scankey()   //掃描按鍵
{
if(p10= =0&&flag= =0)  //p10口按鍵及處理程序,其中flag如果為1就不用再掃描    就是這里,沒有消抖動了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1)  //如果p10為1,flag為1說明已經被按下并抬起
{
TR0=!TR0;    //松開時相應
flag=0;    //標志清零,為下次按鍵做準備(其實為一次處理)
}
}

關閉窗口

相關文章

主站蜘蛛池模板: 国产成人精品一区二 | 欧美视频 亚洲视频 | 午夜电影网站 | 国产精品久久久久久久久免费丝袜 | 国产农村妇女毛片精品久久麻豆 | 韩日视频在线观看 | 成人影院在线观看 | 亚洲成人久久久 | 在线小视频 | 国产永久免费 | 久久一级免费视频 | 精品日韩一区 | 国产中文一区二区三区 | 日韩一区av | 精品一区二区三区在线观看国产 | 国产一区二区自拍 | 国产精品欧美一区喷水 | 国产精品一区一区三区 | 先锋av资源网 | 欧美一区二区三区在线看 | 午夜码电影 | 水蜜桃久久夜色精品一区 | 亚洲xxxxx | 91久久夜色精品国产网站 | 在线看av的网址 | 亚洲日日夜夜 | 久久综合一区二区 | 免费精品在线视频 | 精品久久一 | 亚洲国产精品一区二区久久 | 鲁大师一区影视 | 操久久 | 精品99在线| 久久这里只有精品首页 | 亚洲 欧美 综合 | 激情六月丁香婷婷 | 一片毛片| 夜夜爽夜夜操 | 精品久久香蕉国产线看观看亚洲 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 中文字幕国产第一页 |