找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11457|回复: 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 单片机教程网

快速回复 返回顶部 返回列表