m0单片机io口_51单片机独立按键和矩阵按键实现
独立按键实验
按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,
开关断开。我们开发板上使用的按键及内部简易图如下图所示
管脚与管脚之间(注意是距离)距离长的是导通状态,短的是接通状态。
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号
如下图所示:
如图所示,按键闭合式不会立刻稳定的接通,断开时也不会一下子断开,会伴随一些抖动。抖动的时间长短有按键特性决定,一般为5Ms到10ms.按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。
消抖
消抖可分为硬件消抖和软件消抖。为了使电路更加简单,通常采用软件消抖。
一般来说一个简单的按键消抖就是先读取按键的状态, 如果得到按键按下之后, 延时 10ms, 再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。 其中延时 10ms 就是软件消抖处理。
消抖过程(软件)
1,先设置 IO 口为高电平(由于开发板 IO 都有上拉电阻,所以默认 IO 为高电平)。
2,读取 IO 口电平确认是否有按键按下。
3,如有 IO 电平为低电平后,延时几个毫秒。
4,再读取该 IO 电平,如果任然为低电平,说明对应按键按下。
5,执行相应按键的程序。
键盘
键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘(常说的矩阵键盘)。独立按键用的就是独立键盘。
实现原理
原理图:
独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机 IO 口。
单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的某个 I/O 口相连,开始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平,程序一旦检测到 I/O 口变为低电平则说明按键被按下,然后执行相应的指令。
由图可以看出,单片机的管脚(p1,p3,等管脚)都接有上拉电阻,上拉电阻接高电平。因此我们在消抖检测时,若按键以已经按下,则管脚接地,变为低电平,若管脚为低电平,则说明按键已经按下,执行LED灯点亮的步骤。
代码实现
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定义全局字符型变量
typedef unsigned int u16; //重定义全局整型变量
sbit LED=P2^0 ; //LED接P2口
sbit K1=P3^1; //按键k1接p3口,也可以是其他管脚/*延时函数*/
void dealy(u16 i)
{
while(i--);
}/*独立按键执行函数
*/
void KeyProcess()
{ if(K1==0){dealy(1000);//一个int型的所占的时间大约为10微妙,所以乘1000大约为10ms.if(K1==0){ //消抖后仍为低电平,则执行点亮进程LED=~LED; //为了让LED产生明暗变化}while(!K1); //判断按键是否松开,假如松开,则K1为真,加!为假,则循环结束跳出循环}}void main()
{ LED=0; //初始时灯位熄灭状态(LED原理),while(1){KeyProcess();}
}
矩阵按键实验
- 前面我们讲到独立按键,接下来我们引入独立按键。为什么引入矩阵按键?
独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵,多个按键时为了减少 I/O 口引脚。 - 4 * 4键盘的工作原理
矩阵按键原理图
开发板上将 16 个按
键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每
个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将
这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个
键。
- 矩阵按键的消抖
1.检查按键是否按下
由原理图可知,独立按键和矩阵按键是有所不同的。独立按键的各个按键一端接引脚,一端并联在一起接地。所以检测按键是否按下只需要看单片机的管脚是否为低电平即可。而矩阵按键,他们的两端分别并联在一起,
每一行(共4行)并联在一起接高位管脚上(7~4),每一列(共4列)并联在一起接到低位管脚上(3~0)。
所以检测方法有所不同。
一般情况下有两种方法。
方法一:
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。逐行扫描的时间是非常快的,肉眼难以观察。
举个例子,假设此时p7管脚为低电平,那么第一行按键的一段都为低电平,另一端分别连接低4位的管脚,只有当某一个开关按下,低4位的管脚与其中一个低电平的管脚连接变为低电平,所以只要查看低4位那个管脚为低电平就可以确定那个按键以按下。其他三行同理,每一行依次不断进行。
方法二:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。相当于第一次确定列,第二次确定行,行列交叉形成点,这个点就是我们要找的已经闭合的按键。
- 静态数码管显示按键
如图,每一个按键可用一个键值来代替,让对应的键值号来作为静态数码管的段选,从而实现按下按键显示数字的效果。
- 代码实现
采用第二种行列扫描的检测方法
#include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;#define GPIO_DIG P0 //宏定义p0口(静态显示数码管对应的管脚)
#define GPIO_KEY P1 //矩阵按键对应管脚u8 KeyValue; //用来存放读取到的键值u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值/*延时·函数*/
void delay(u16 i)
{while(i--);
}/*检测按键是否按下,消抖,读取键值*/
void KeyDown(void)
{char a=0;GPIO_KEY=0x0f; //0x0f转化为为二进制为0000 1111,即矩阵按键的八个管脚,高位为低电平(0),低位为高电平(1)if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(1000);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{ /*对列进行测试(高位低电平,低位高电平)*/GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break; //对应管脚高低电平0000 0111,第0列case(0X0b): KeyValue=1;break; //对应管脚高低电平0000 1011,第1列case(0X0d): KeyValue=2;break; //对应管脚高低电平0000 1101,第2列case(0X0e): KeyValue=3;break;//对应管脚高低电平0000 1110,第3列}/*对行进行测试(低位高电平,高位低电平)*/GPIO_KEY=0XF0;switch(GPIO_KEY){ /*上一行对应的列号加上相应有规律的字号就等于按键号,可由原理图查看*/case(0X70): KeyValue=KeyValue;break; //对应管脚高低电平0111 0000,第0行case(0Xb0): KeyValue=KeyValue+4;break; //对应管脚高低电平1011 0000,第1行case(0Xd0): KeyValue=KeyValue+8;break;//对应管脚高低电平1101 0000,第2行case(0Xe0): KeyValue=KeyValue+12;break; //对应管脚高低电平1110 0000,第0行}}}while((a<50)&&(GPIO_KEY!=0xf0))//检测按键松手检测(只有当按键松开时矩阵连接的管脚高位和低位才会互换继续检测行。否则进行循环延迟){delay(100);a++;}
}/*主函数*/
void main()
{ while(1){ KeyDown(); //按键判断函数GPIO_DIG=~smgduan[KeyValue]; //}
}
m0单片机io口_51单片机独立按键和矩阵按键实现相关推荐
- m0单片机io口_51单片机蜂鸣器
蜂鸣器实验 * 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机.打印机.复印机.报警器.电子玩具.汽车电子设备.电话机.定时器等电子产品中作发声器件.蜂鸣器主要分为压电 ...
- 51单片机有几个通用io口_51单片机IO端口基础知识及应用
文章目录 89C51单片机引脚信息单片机IO端口内部结构单片机IO引脚输出应用单片机IO引脚输入应用总结 89C51单片机引脚信息 我们在学习使用任何芯片到时候,可能第一个要注意的就是芯片的引脚信息了 ...
- 51单片机有几个通用io口_51单片机IO口的四种使用方法
原标题:51单片机IO口的四种使用方法 传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式 LED正极接VCC,负极接IO口 ...
- 51单片机独立按键和矩阵按键实现
这里写目录标题 独立按键实验 矩阵按键实验 独立按键实验 按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开.我们开发板上使用的按键及内部简易图如下图所示 管脚与管脚之间( ...
- 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图
当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...
- 想做数码管显示,单片机IO口资源不够?看看WTV890语音芯片能做些啥
在开发许多产品时许多工程师都会遇到以下问题,如:想驱动4位或10位的LED数码管显示,但是单片机的IO口不够用:要么更换IO口资源更多的MCU来控制,要么更换脚位丰富的单片机,这无疑在MCU上,加了1 ...
- 单片机IO口输入模式
单片机IO口输入模式 单片机IO口输入输出模式判断 如果判断单片机的此IO口电平是由外电路决定而非单片机本身所决定的,则此IO口就是输入IO口. 如果判断单片机的此IO口电平是由单片机决定而非外电路所 ...
- 独立按键和矩阵按键c语言,第八章 独立按键和矩阵按键
我们和单片机之间进行信息交互,主要包含两大类,输入设备和输出设备.前边讲的LED小灯.数码管.点阵都是输出设备,这节课我们学习一下最常用的输入设备--按键.在本节课的学习过程中我们还会穿插介绍一点硬件 ...
- IO口多路查理复用:三个单片机IO口控制六个LED
简 介: 本文介绍了单片机的IO控制 LED 中的复用技术,特别查理复用基本原理和特点进行了介绍.使用一款IS31FL3731可以构成16×9的PWM亮度可控的 LED 矩阵. 关键词: 查理复用,C ...
最新文章
- Centos 6.5下一个SNMP简单配置(snmp protocol v3,监控宝)
- java中overload与override的区别
- python程序员年薪百万_想要成为年薪百万的Python程序员,这套面试题别错过
- 集成学习-Boosting集成学习算法GBDT
- js数组获取index_通过事例重温一下 JS 中 常见的15 种数组操作(备忘清单),收藏...
- Java 多态 ——一个案例 彻底搞懂它
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1b=2c=3d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外...
- CamRaptor:针对DVR摄像头的漏洞利用工具
- 2核4G阿里云服务器被黑客抓鸡??然鹅一个操作就搞定
- win10 安装 HP LaserJet P1108 教程
- 目标检测算法——SSD
- poj1981-单位圆最多覆盖点
- Java基于网易云信实现手机短信验证
- Alist小雅超集Docker搭建排坑指南
- 已在调试程序中暂停 怎么办 解决办法
- 用python创建你自己的命令行地址簿程序
- 小试牛刀【自己翻译】
- 推荐 6 个前后端分离项目
- 国产FPGA(紫光同创)—— 数据采集及千兆以太网传输(二)
- 在Android平台启动Linux C/C++应用程序