这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘、键盘消抖等)包含原理图、代码等

  • (一)基础补充
    • 1.键盘的任务
    • 2.键盘的识别
    • 3.如何消除按键的抖动
    • 4.非编码键盘与编码键盘
    • 5.非编码键盘的扫描方式
      • (1)查询扫描:
      • (2)定时扫描:
      • (3)中断扫描:
  • (二)独立键盘
    • 1.独立键盘原理图
    • 2.独立键盘K1控制LED1代码实现
  • (三)矩阵键盘
    • 1.矩阵键盘原理图
    • 2.矩阵键盘对应数码管输出0到代码实现

(一)基础补充

1.键盘的任务

(1)判别是否有键按下?若有,进入下一步。
(2)识别哪一个键被按下,并求出相应的键值。
(3)根据键值,找到相应键值的处理程序入口。

2.键盘的识别


按键的闭合与否,反映在行线输出电压上就是呈现高电平或低电平,单片机通过对行线电平的高低状态的检测,便可以确认按键是否按下或松开。为了确保单片机对一次按键动作只确认一次按键有效(所谓按键有效,是指按下按键后,一定要再松开),必须消除抖动期t1和t3的影响。

3.如何消除按键的抖动

(1)用软件延时来消除按键抖动,基本思路是:在检测到有键按下时,该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线电平是否仍为低电平,如果仍为低电平,则确认该行确实有键按下。当按键松开时,行线的低电平变为高电平,执行一段延时10ms的子程序后,检测该行线为高电平,说明按键确实已经松开。
(2)采用专用的键盘/显示器接口芯片,这类芯片中都有自动去抖动的硬件电路。

4.非编码键盘与编码键盘

(1)非编码键盘是指按下按键,键号信息不能直接得到,要通过软件来获取。非编码键盘常见的有独立式键盘和矩阵式键盘两种结构。
(2)编码键盘是指当按键按下后,能直接得到按键的键号,例如使用专用的键盘接口芯片。

5.非编码键盘的扫描方式

(1)查询扫描:

利用单片机空闲时,调用键盘扫描子程序,反复扫描键盘,来响应键盘的输入请求,如果单片机的查询频率过高,虽能及时响应键盘的输入,但也会影响其他任务的进行。如果查询的频率过低,有可能出现键盘输入的漏判现象。所以要根据单片机系统的繁忙程度和键盘的操作频率,来调整键盘扫描的频率。

(2)定时扫描:

单片机可每隔一定的时间对键盘扫描一次,即定时扫描。这种方式通常是利用单片机内的定时器产生的定时中断,进入中断子程序后对键盘进行扫描,在有键按下时识别出按下的键,并执行相应键的处理程序。由于每次按键的时间一般不会小于100ms,所以为了不判漏有效的按键,定时中断的周期一般小于100ms。

(3)中断扫描:

为了进一步提高单片机扫描键盘的工作效率,可采用中断扫描方式,即键盘只有在有按键按下时,才会向单片机发出中断请求信号。单片机响应中断,执行键盘扫描中断服务子程序,识别出按下的按键,并跳向该按键的处理程序。如果无键按下,单片机将不理睬键盘。该方式的优点是只有有按键按下时才会进行处理,所以实时性强,工作效率高。

(二)独立键盘

1.独立键盘原理图

独立式键盘的特点是各键相互独立,每个按键各接一条I/O口线,通过检测I/O口输入线的电平状态,很容易判断哪个按键被按下。

2.独立键盘K1控制LED1代码实现

#include<reg52.h>
sbit led1=P2^0;//因为led1由p2^0口控制
sbit k1=P3^1;//P31口的输出电平由按键k1控制
void delay(int i)
{while(i--);
}
void keyproc()
{if(k1==0){delay(1000);//延时消抖if(k1==0){led1=~led1;}while(!k1) ;}
}
void main()
{while(1){keyproc();}
}

(三)矩阵键盘

1.矩阵键盘原理图


矩阵式(也称行列式)键盘通常用于按键数目较多的场合,它由行线和列线组成,按键位于行、列交叉点上,其接口电路如上图。

2.矩阵键盘对应数码管输出0到代码实现

#include "reg52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define GPIO_DIG P0
#define GPIO_KEY P1uchar code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,0x39, 0x5e, 0x79, 0x71};//静态数码管码值uint KeyColValue;
uint KeyLineValue;void delay(uint i) //延时函数
{while(i --);
}void KeyDown() //键盘按键扫描函数
{char a; GPIO_KEY = 0x0f;if(GPIO_KEY != 0x0f)//检测4行中哪一行按键是否按下{delay(1000); //延时消抖if(GPIO_KEY != 0x0f) //再次检测4行中哪一行按键是否按下{switch(GPIO_KEY) //根据IO的值来确定哪一行按键按下{case(0x07): KeyColValue = 0; break;case(0x0b): KeyColValue = 1; break;case(0x0d): KeyColValue = 2; break;case(0x0e): KeyColValue = 3; break;}}}GPIO_KEY = 0xf0;if(GPIO_KEY != 0xf0) //检测4行中哪一列按键是否按下{delay(1000);  //延时消抖if(GPIO_KEY != 0xf0) //再次检测4行中哪一列按键是否按下{switch(GPIO_KEY) //根据IO的值来确定哪一列按键按下{case(0x70): KeyLineValue = 0; break;case(0xb0): KeyLineValue = 1; break;case(0xd0): KeyLineValue = 2; break;case(0xe0): KeyLineValue = 3; break;}}while((a < 50) && (GPIO_KEY != 0xf0))  //延时,确保没有按键再按下{delay(1000);a ++;}}
}void main()
{while(1){KeyDown();//检测按键是否按下GPIO_DIG = smgduan[KeyLineValue*4 + KeyColValue];//根据按键的行列值,静态数码管显示相应的值}
}

最后还想说的是,看到最后的朋友们,如果对你有用,点赞收藏哦!
创作不易,还需要你们的支持,后续持续更新51单片机系列。

学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)相关推荐

  1. 学习笔记:51单片机(STC89C52)如何定时10ms

    1.定时器如何定时 首先大致描述一下定时器的定时原理,其实本质就一句话:每经过一个机器周期,寄存器就加1. 这里就又要解释什么是时钟周期,什么是机械周期.我们的51单片机无论是开发板还是最小系统板上, ...

  2. 学习笔记之-51单片机特殊功能寄存器

    一.前言 学习51单片机的过程中,其实就是学习怎么用它的特殊功能寄存器(有些寄存器是我们看不到的),特殊功能寄存器是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据 ...

  3. 强化学习笔记(一)基础篇

    强化学习笔记(一)基础篇 目录 1.强化学习相关概念 2.强化学习与监督学习和非监督学习的区别 3.强化学习分类 4.三对重要概念 目录 写在前面:本文系小编学习邹伟老师等人编著的<强化学习&g ...

  4. MyBatis学习笔记(1)—使用篇

    MyBatis学习笔记(1)-使用篇 MyBatis学习笔记(2)-映射关系篇 MyBatis学习笔记(3)-高级映射之一对一映射 Mybatis学习笔记(4)-高级映射之一对多映射 Mybatis学 ...

  5. FPGA系统性学习笔记连载_Day1数字电路基础篇

    FPGA系统性学习笔记连载_Day1数字电路基础篇 连载<叁芯智能FPGA设计与研发就业班-第一天> <数字电路基础1> 原创作者:紫枫术河 转载请联系群主授权,否则追究责任 ...

  6. 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)

    嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...

  7. 嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器)

    嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器) 定时器/计数器简介 TH与TL TMOD工作模式寄存器 TCON定时器控制寄存器 定时器操作实例 定时器/计数器简介 在单片机中, ...

  8. HFSS学习笔记(一)基础篇 操作界面简介和使用前的准备工作

    HFSS学习笔记(一)基础篇 操作界面简介和使用前的准备工作 一.HFSS工作界面简介 各区域的功能: 二.设计的步骤 1.创建工程文件 2.进行设计前的准备工作 一.HFSS工作界面简介 各区域的功 ...

  9. 安卓学习笔记(一)入门篇

    总结<第一行代码>Android学习笔记(一)入门篇 1.入门 Android的四层架构和四大组件 运行第一个Android程序 日志工具Log AndroidStudio快捷键 GIT的 ...

最新文章

  1. python控制流_Python 的控制流代码混淆
  2. 第十四次ScrumMeeting博客
  3. 【原创】源智工作流聚合步骤模型
  4. PHP on Windows Azure 入门教学系列(2) ——利用SQL Azure做一个简单的访问计数器...
  5. java 获取指定后缀名的文件
  6. 奇数在前,偶数在后;奇数按从大到小排序;偶数按从小到大排序。对其重新排序。
  7. 3D优化之ShadowGun系列二:浓烟,使用面片模拟粒子效果
  8. excel两列数据对比找不同_怎么在excel中对比两列数据并查找重复项?
  9. 计算机win7如何加快开机速度,Win7系统如何提高开机速度?提高开机速度的三种方法步骤...
  10. UG NX二次开发-外部模式
  11. VMware安装Linux详细教程
  12. imap服务器不支持身份验证方法,POP/IMAP 客户端身份验证失败 | Microsoft Docs
  13. 1968:Misspelling
  14. PDF怎么编辑修改内容的免费方法
  15. 学生成绩排名 (用结构体数组按成绩排名)
  16. matlab算kdj指标,KDJ指标(随机指标)详解
  17. arcmap小技巧之获取行政区划及json格式转shp,json转csv
  18. rabbitmq系列(三)消息幂等性处理
  19. 博弈论——非合作博弈 什么是纳什均衡
  20. thinkpad如何屏蔽bios更新 提示电池_华硕(圣骑)100系 200系 BIOS更新支持8代CPU软件刷新...

热门文章

  1. Error--解决使用Application Loader提交ipa包审核时的报错:ERROR ITMS-90168: The binary you uploaded was invalid....
  2. Javascript类的创建
  3. PHP向服务器错误记录、文件或远程目标发送一个错误
  4. linux下编程epoll实现将GPS定位信息上报到服务器
  5. Spring AMQP + Rabbit 配置多数据源消息队列
  6. Python教程:丛入门到实践
  7. 图片 滚动切换效果(五) 高级篇
  8. OC学习篇之---类的初始化方法和点语法的使用
  9. 浏览器构造页面的原理
  10. 实现IMSI、IMEI查询