二、51单片机 使用Proteus仿真掌握矩阵键盘(仿真及代码)

学习内容:通过proteus实现对51单片机矩阵的掌握

1、键盘接口设计。键盘——向单片机输入数据、命令等功能,是人机对话的主要手段。由若干按键按照一定规则组成。每一个按键实质上是一个按键开关,按构造可分为有触点开关按键和无触点按键。有触点开关按键常见的有:触摸式键盘、薄膜键盘、导电橡胶、按键式键盘等,最常用按键式键盘。无触点开关按键有电容式按键、光电式按键和磁感应按键等。键盘的任务。任务3项。(1)判别是否有键按下?若有,进入第(2)步。(2)识别哪一个键被按下,并求出相应的键值。(3)根据键值,找到相应键值处理程序入口。

两种去抖动方法。一种是用软件延时来消除按键抖动,基本思想:在检测到有键按下时,该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线电平是否仍为低电平,如果仍为低电平,则确认该行确实有键按下。当按键松开时,行线的低电平变为高电平,执行一段延时10ms的子程序后,检测该行线为高电平,说明按键确实已经松开。采取以上措施,可消除两个抖动期t1和t3的影响。另一种去除按键抖动的方法是采用专用的键盘/显示器接口芯片,这类芯片中都有自动去抖动的硬件电路。

2、独立式键盘接口设计案例。独立式键盘特点各键相互独立,每个按键各接一条I/O口线,通过检测I/O输入线的电平状态,易判断哪个按键被按下,图中上拉电阻保证按键未按下时,保证对应I/O口线为稳定高电平。当某一按键按下时,对应I/O口线就变成低电平,与其他按键相连的I/O口线仍为高电平。

本设计案例矩阵键盘十六个按键分别对应0~F, Proteus仿真图如下

源码如下:

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit L0=P1^0;
sbit L1=P1^1;
sbit L2=P1^2;
sbit L3=P1^3;          // 定义列 //
uchar jyw[16]={0xc0,0xf9,0xa4,0xb0,            //数码管显示值0-F对应的段码值//
               0x99,0x92,0x82,0xf8,
               0x80,0x90,0x88,0x83,
               0xc6,0xa1,0x86,0x8e};

void delay(unsigned int time)                   //延时子程序//
{
   unsigned int i;
   for(i=0;i<time;i++)
   {}
}
main()                      //主程序//
{
	while(1)
	{
		P1=0xef;            //行扫描初值11101111//
		if (L0==0) P0=jyw[0];        //检测第一列有无按键按下,若有,对应的键值分别为0(一行),4(二行),8(三行),C(四行)//
		if (L1==0) P0=jyw[1];        //检测第二列有无按键按下,若有,对应的键值分别为1(一行),5(二行),9(三行),d(四行)//
		if (L2==0) P0=jyw[2];        //检测第三列有无按键按下,若有,对应的键值分别为2(一行),6(二行),A(三行),E(四行)//
		if (L3==0) P0=jyw[3];        //检测第四列有无按键按下,若有,对应的键值分别为3(一行),7(二行),b(三行),F(四行)//
		delay(500);
		
		P1=0xdf;           //行扫描初值11011111//
		if (L0==0) P0=jyw[4];        //检测第一列有无按键按下,若有,对应的键值分别为0(一行),4(二行),8(三行),C(四行)//
		if (L1==0) P0=jyw[5];        //检测第二列有无按键按下,若有,对应的键值分别为1(一行),5(二行),9(三行),d(四行)//
		if (L2==0) P0=jyw[6];        //检测第三列有无按键按下,若有,对应的键值分别为2(一行),6(二行),A(三行),E(四行)//
		if (L3==0) P0=jyw[7];        //检测第四列有无按键按下,若有,对应的键值分别为3(一行),7(二行),b(三行),F(四行)//
		delay(500);
		
		P1=0xbf;             //行扫描初值10111111//
		if (L0==0) P0=jyw[8];        //检测第一列有无按键按下,若有,对应的键值分别为0(一行),4(二行),8(三行),C(四行)//
		if (L1==0) P0=jyw[9];        //检测第二列有无按键按下,若有,对应的键值分别为1(一行),5(二行),9(三行),d(四行)//
		if (L2==0) P0=jyw[10];        //检测第三列有无按键按下,若有,对应的键值分别为2(一行),6(二行),A(三行),E(四行)//
		if (L3==0) P0=jyw[11];        //检测第四列有无按键按下,若有,对应的键值分别为3(一行),7(二行),b(三行),F(四行)//
		delay(500);
		
		P1=0x7f;             //行扫描初值//
		if (L0==0) P0=jyw[12];        //检测第一列有无按键按下,若有,对应的键值分别为0(一行),4(二行),8(三行),C(四行)//
		if (L1==0) P0=jyw[13];        //检测第二列有无按键按下,若有,对应的键值分别为1(一行),5(二行),9(三行),d(四行)//
		if (L2==0) P0=jyw[14];        //检测第三列有无按键按下,若有,对应的键值分别为2(一行),6(二行),A(三行),E(四行)//
		if (L3==0) P0=jyw[15];        //检测第四列有无按键按下,若有,对应的键值分别为3(一行),7(二行),b(三行),F(四行)//
		delay(500);
	} 
}

### 设计与仿真矩阵键盘 #### 矩阵键盘概述 矩阵式键盘适用于按键数量较多的情况,通过行线和列线组合形成多个按键位置。对于一个4×4的矩阵键盘而言,仅需8条I/O线路便能控制多达16个独立按键[^2]。 #### Proteus中的元件准备 在Proteus软件内创建新项目之后,从库中挑选Arduino板作为主控单元,并选取电阻以及按钮构建矩阵布局。具体来说,每一条行线连接到Arduino的一个数字引脚上;同样地,每一根列线也要接到不同的数字引脚上去。为了防止按下某个键时电流回流造成其他未按下的键被误触发,在每个按键处串联一个小阻值的限流电阻[^1]。 #### 连接方式说明 按照上述方法布置好硬件连线后,确保所有的行线都已分别接入Arduino的不同GPIO管脚,同时所有列线也同样各自对应着另外一组GPIO管脚。这种排列使得当任意单个按键闭合时,其所在的行列交汇点会产生电平变化信号传送给微控制器进行识别处理。 #### 编写扫描算法 接下来编写相应的固件代码上传至Arduino开发板完成逻辑运算部分的工作。这里给出一段简单的C++语言源码片段用于演示基本思路: ```cpp const byte ROWS = 4; // 行数 const byte COLS = 4; // 列数 char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {9, 8, 7, 6}; // 定义各行对应的Arduino GPIO编号 byte colPins[COLS] = {5, 4, 3, 2}; // 定义各列对应的Arduino GPIO编号 void setup(){ Serial.begin(9600); for (int i=0;i<ROWS;++i){ pinMode(rowPins[i], OUTPUT); } for(int j=0;j<COLS;++j){ pinMode(colPins[j], INPUT_PULLUP); } } void loop() { char key = scanMatrix(); if(key != NO_KEY){ Serial.println(key); } } ``` 此段程序实现了对整个键盘状态周期性的轮询检测功能,一旦发现有新的有效按键事件发生,则立即将该字符发送给串口监视器显示出来[^3]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值