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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12217|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機按鍵的的三種方法 附源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:808771 發(fā)表于 2020-8-24 19:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
分享單片機按鍵的三種方法

方法一:
#include <reg52.h>typedef unsigned int uInt16;sbit LED1 = P2^0;
sbit KEY1 = P3^4;
sbit KEY2 = P3^5;void DelayMS(uInt16 ValMS)
{
        uInt16 uiVal,ujVal;
        for(uiVal = 0; uiVal < ValMS; uiVal++)
                for(ujVal = 0; ujVal < 113; ujVal++);
}// 函數(shù)功能:毫秒延時// 函數(shù)功能:掃描按鍵并做出相應(yīng)LED燈亮滅動作void main(void)
{
        while(1)
        {
                if(0 == KEY1)                                   // 檢測按鍵是否按下
                {
                        DelayMS(5);                                 // 延時去抖
                        if(0 == KEY1)                          // 再次檢測
                        {
                                LED1 = 0;                   // 點亮LED燈
                                while(!KEY1);                // 等待按鍵彈起
                        }
                }
                if(!KEY2)
                {
                        DelayMS(5);
                        if(!KEY2)
                        {
                                LED1 = 1;
                                while(!KEY2);
                        }
                }        }
}




方法二:行列掃描法
#include <reg52.h>#define uInt16 unsigned int
#define uChar8 unsigned char

#define DATA P0                                          //數(shù)據(jù)口
#define KEYPORT         P3                                  //鍵盤接入端口sbit SEG_SELECT = P1^7;                          //段選控制端
sbit BIT_SELECT = P1^6;                          //位選控制端uChar8 code SEG_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//段選顯示表格uChar8 g_ucKeyNum = 16;                        //鍵值// 函數(shù)功能:毫秒延時void DelayMS(uInt16 ValMS)
{
        uInt16 uiVal,ujVal;
        for(uiVal = 0; uiVal < ValMS; uiVal++)
                for(ujVal = 0; ujVal < 121; ujVal++);
}// 函數(shù)功能:矩陣按鍵掃描void ScanKey(void)
{
        uChar8 ucTemp;

        KEYPORT = 0xfe;                                          //檢測第一行
        ucTemp = KEYPORT;                                  //讀取鍵盤端口數(shù)值
        if(ucTemp != 0xfe)                                 //若是不等于0xF0表示有按鍵按下
        {
                DelayMS(5);                 //去抖
                ucTemp = KEYPORT;                        //讀端口值
                if(ucTemp != 0xfe)                        //再次判斷
                {
                        ucTemp = KEYPORT;                //取鍵值
                        switch(ucTemp)                        //判斷鍵值對應(yīng)鍵碼
                        {
                                case 0xee:g_ucKeyNum = 0;break;
                                case 0xde:g_ucKeyNum = 1;break;
                                case 0xbe:g_ucKeyNum = 2;break;
                                case 0x7e:g_ucKeyNum = 3;break;        
                        }
                        while(KEYPORT != 0xfe);        //按鍵釋放檢測
                }
        }        
        KEYPORT = 0xfd;
        ucTemp = KEYPORT;
        if(ucTemp != 0xfd)
        {
                DelayMS(5);
                ucTemp = KEYPORT;
                if(ucTemp != 0xfd)
                {
                        ucTemp = KEYPORT;
                        switch(ucTemp)
                        {
                                case 0xed:g_ucKeyNum = 4;break;
                                case 0xdd:g_ucKeyNum = 5;break;
                                case 0xbd:g_ucKeyNum = 6;break;
                                case 0x7d:g_ucKeyNum = 7;break;        
                        }
                        while(KEYPORT != 0xfd);
                }
        }        
        KEYPORT = 0xfb;
        ucTemp = KEYPORT;
        if(ucTemp != 0xfb)
        {
                DelayMS(5);
                ucTemp = KEYPORT;
                if(ucTemp != 0xfb)
                {
                        ucTemp = KEYPORT;
                        switch(ucTemp)
                        {
                                case 0xeb:g_ucKeyNum = 8;break;
                                case 0xdb:g_ucKeyNum = 9;break;
                                case 0xbb:g_ucKeyNum = 10;break;
                                case 0x7b:g_ucKeyNum = 11;break;        
                        }
                        while(KEYPORT != 0xfb);
                }
        }        
        KEYPORT = 0xf7;
        ucTemp = KEYPORT;
        if(ucTemp != 0xf7)
        {
                DelayMS(5);                  
                ucTemp = KEYPORT;
                if(ucTemp != 0xf7)
                {
                        ucTemp = KEYPORT;
                        switch(ucTemp)
                        {
                                case 0xe7:g_ucKeyNum = 12;break;
                                case 0xd7:g_ucKeyNum = 13;break;
                                case 0xb7:g_ucKeyNum = 14;break;
                                case 0x77:g_ucKeyNum = 15;break;        
                        }
                        while(KEYPORT != 0xf7);
                }
        }
}
/* ***************************************************** */
// 函數(shù)名稱:Display()
// 函數(shù)功能:數(shù)碼管刷新
// 入口參數(shù):需顯示的數(shù)值(ucVal)
// 出口參數(shù):無
/* ***************************************************** */
void Display(uChar8 ucVal)
{
        if(ucVal == 16)                        //若鍵值是16即沒有按鍵按下,則不顯示
        {
                   BIT_SELECT = 1;
                DATA = 0xff;
                BIT_SELECT = 0;
        }
        else                                   //若有按下,顯示對應(yīng)鍵值
        {
                BIT_SELECT = 1;
                DATA = 0x00;
                BIT_SELECT = 0;        
                SEG_SELECT = 1;
                DATA = SEG_Tab[ucVal];
                SEG_SELECT = 0;        
                DelayMS(10);
                DATA = 0xff;
        }
}
/* ***************************************************** */
// 函數(shù)名稱:main()
// 函數(shù)功能:矩陣按鍵掃描并用數(shù)碼管顯示鍵值
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void main(void)
{
        while(1)         
        {        
                ScanKey();
                Display(g_ucKeyNum);
        }
}                                                                                          



方法三:
  1. void key4(void)
  2. {
  3.         static uchar i = 0;
  4.         static uchar keybuff[4] = {0xff,0xff,0xff,0xff};
  5.         static uchar keybackup = 1;

  6.         keybuff[0] = (keybuff[0] << 1)|KEY1;
  7.         keybuff[1] = (keybuff[1] << 1)|KEY2;
  8.         keybuff[2] = (keybuff[2] << 1)|KEY3;
  9.         keybuff[3] = (keybuff[3] << 1)|KEY4;

  10.         if(keybuff[i] == 0xf0 && keybackup)
  11.         {
  12.                 key = 1 + i;
  13.                 keybackup = 0;
  14.         }
  15.         else if(keybuff[i] == 0xff)
  16.         {
  17.                 i++;
  18.                 if(i == 4)
  19.                 {
  20.                         i = 0;
  21.                 }
  22.                 keybackup = 1;
  23.         }
  24. }
復(fù)制代碼



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

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品午夜 | 色综合久久久久 | 无码一区二区三区视频 | 黄色免费网站在线看 | 天堂中文在线播放 | 一二三四在线视频观看社区 | 龙珠z国语版在线观看 | 日韩三级 | 国产成人麻豆免费观看 | 一级片av| 精品国产一区二区在线 | 欧美日韩高清在线一区 | 天天干天天想 | 爱爱视频网| 免费黄色片在线观看 | 午夜在线小视频 | 超碰97免费在线 | 亚洲欧美日韩在线不卡 | 欧美日韩亚洲一区二区 | 毛片久久久| 国产一区www| 久久久无码精品亚洲日韩按摩 | 久久99国产精品 | 欧美专区在线 | 黄色一级毛片免费看 | 日韩欧美二区 | 国产免费一区二区三区免费视频 | 亚洲精品在线免费观看视频 | 黑人巨大精品 | 久久久综合 | 99r在线 | 性一区 | 久久久夜色精品亚洲 | 99久久精品国产一区二区三区 | 特级黄一级播放 | 亚洲欧美日韩在线 | 久久激情网 | 亚洲日韩欧美一区二区在线 | 操人网站| 国产视频在线观看一区二区三区 | 日韩成人免费视频 |