200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 二 51单片机 使用Proteus仿真掌握矩阵键盘(仿真及代码)

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

时间:2018-07-27 22:46:16

相关推荐

二 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 charsbit 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);} }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。