使用Proteus仿真学习51单片机矩阵键盘控制(包含仿真和代码)

学习内容:通过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);
	} 
}

物联沃分享整理
物联沃-IOTWORD物联网 » 使用Proteus仿真学习51单片机矩阵键盘控制(包含仿真和代码)

发表评论