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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12134|回復: 0
收起左側

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

[復制鏈接]
ID:808771 發表于 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++);
}// 函數功能:毫秒延時// 函數功能:掃描按鍵并做出相應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                                          //數據口
#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;                        //鍵值// 函數功能:毫秒延時void DelayMS(uInt16 ValMS)
{
        uInt16 uiVal,ujVal;
        for(uiVal = 0; uiVal < ValMS; uiVal++)
                for(ujVal = 0; ujVal < 121; ujVal++);
}// 函數功能:矩陣按鍵掃描void ScanKey(void)
{
        uChar8 ucTemp;

        KEYPORT = 0xfe;                                          //檢測第一行
        ucTemp = KEYPORT;                                  //讀取鍵盤端口數值
        if(ucTemp != 0xfe)                                 //若是不等于0xF0表示有按鍵按下
        {
                DelayMS(5);                 //去抖
                ucTemp = KEYPORT;                        //讀端口值
                if(ucTemp != 0xfe)                        //再次判斷
                {
                        ucTemp = KEYPORT;                //取鍵值
                        switch(ucTemp)                        //判斷鍵值對應鍵碼
                        {
                                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);
                }
        }
}
/* ***************************************************** */
// 函數名稱:Display()
// 函數功能:數碼管刷新
// 入口參數:需顯示的數值(ucVal)
// 出口參數:無
/* ***************************************************** */
void Display(uChar8 ucVal)
{
        if(ucVal == 16)                        //若鍵值是16即沒有按鍵按下,則不顯示
        {
                   BIT_SELECT = 1;
                DATA = 0xff;
                BIT_SELECT = 0;
        }
        else                                   //若有按下,顯示對應鍵值
        {
                BIT_SELECT = 1;
                DATA = 0x00;
                BIT_SELECT = 0;        
                SEG_SELECT = 1;
                DATA = SEG_Tab[ucVal];
                SEG_SELECT = 0;        
                DelayMS(10);
                DATA = 0xff;
        }
}
/* ***************************************************** */
// 函數名稱:main()
// 函數功能:矩陣按鍵掃描并用數碼管顯示鍵值
// 入口參數:無
// 出口參數:無
/* ***************************************************** */
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. }
復制代碼



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区在线观看 | 黄色一级大片在线免费看产 | 色综合一区二区三区 | 国产精品一区二区三区在线播放 | 一区二区三区在线 | 成人免费在线播放 | 亚洲精品高清视频在线观看 | 精品福利av导航 | 特级丰满少妇一级aaaa爱毛片 | 日本在线免费观看 | 国产在线中文字幕 | 亚洲精品久久久蜜桃 | 天天操综合网站 | 亚洲视频网 | 久草视频网站 | 国产在线视频在线观看 | 色婷婷综合久久久久中文一区二区 | 精品视频一区二区三区 | 久久这里有精品 | 日本成人综合 | 国产午夜精品一区二区三区四区 | 国产精品综合网 | 一级做a爰片性色毛片视频停止 | 久久九七 | 欧美性受xxxx白人性爽 | 午夜精品久久久久久久99黑人 | 国产精品视频一区二区三区, | 日韩欧美精品在线播放 | 91视视频在线观看入口直接观看 | 91久久夜色精品国产网站 | 自拍偷拍亚洲欧美 | 视频二区 | 亚洲美女视频 | 国产成人一区在线 | 欧美理论片在线 | 国产成人一区 | 欧美一区二区成人 | 欧美aaaaaaaa | 久久精品视频播放 | 成年人在线观看 | 中文字幕一区二区三区日韩精品 |