单片机实现4X4矩阵键盘控制项目_第1页
单片机实现4X4矩阵键盘控制项目_第2页
单片机实现4X4矩阵键盘控制项目_第3页
单片机实现4X4矩阵键盘控制项目_第4页
单片机实现4X4矩阵键盘控制项目_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、整理课件1第第13章章 单片机实现单片机实现4*4矩阵键矩阵键盘控制项目盘控制项目 整理课件2学习内容 13.1 项目需求 13.2 项目工作原理分析 13.3 项目硬件电路设计 13.4 项目软件程序设计 13.5系统调试结果总结整理课件313.1 项目需求项目需求矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成矩阵键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。项目要求:设定矩阵键盘编号,按下键盘中的某个按键,可以通过数码管看到显示对应的键盘编号值。 (4*4)矩阵键盘实物

2、图 整理课件413.2 项目工作原理分析项目工作原理分析 4*4矩阵键盘的行信号分别接P2.0P2.3,列信号分别接P2.4P2.7,无按键闭合时,P2.0P2.3与 P2.4P2.7开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断矩阵键盘有按键按下方法如下:先让P2.0P2.3输出低电平,监测P2.4P2.7的状态,如果P2.4P2.7输出为高电平则没有按键闭合,如果检测到P2.4P2.7输出为低电平则表示有按键按下发生闭合状态,以上只是说明有按键闭合,具体是哪个按键闭合好需要进一步检测。 整理课件5 一旦确定有按键已经稳定闭合后,接着判断为哪一个按键闭合,采用对按键进行扫描的

3、方式,依次给每一条列线送低电平,其余各列都为高电平,并检测每次扫描的行状态。每当扫描输出某一列为低电平时,相继读入行线状态。若全为高电平,表示为低电平的这列没有按键闭合。否则行线不全部为高电平,表示为低电平的这列上有按键闭合。确定闭合按键的位置后,计算出按键值,产生按键码。整理课件6 在矩阵按键处理过程中,一旦检测到有按键闭合与确认按键已经稳定闭合期间,通过调用10-20ms延时子程序避开按键抖动问题。由于按键是机械器件,按下或者松开时有固定的机械抖动,抖动图如图所示。整理课件7 按键去抖分为硬件去抖和软件去抖,硬件去抖最简单的是按键两端并联电容,容量根据实验而定。软件去抖使用方便不增加硬件成

4、本,容易调试,所以现在处理按键抖动问题大部分选择软件去抖。软件去抖操作步骤如下: 检测到按键按下后进行10-15ms延时,用于跳过这个抖动区域。 延时后再检测按键状态,如果没有按下表明是抖动或者干扰造成,如果仍旧按下,可以认为是真正的按下。并进行对应的操作。 同样按键释放后也要进行去抖动延时,延时后检测按键是否真正松开。整理课件8 采用单片机控制矩阵按键实现按键键码值显示的电路结构由51单片机最小系统、数码显示电路、数码驱动电路、矩阵键盘电路和电源供电电路组成。 单片机控制矩阵键盘电路结构图 整理课件913.3 项目硬件电路设计项目硬件电路设计 矩阵键盘电路的行信号分别接P2.0P2.3,列信

5、号分别接P2.4P2.7,进行按键检测时,假设查询到P25为低电平,P24 P26 P27为高电平,那么可能按下的按键为S2 S6 S10 S14。进一步探测,先把P20设置为低电平,P21 P22 P23为高电平,如果此时P25一直为低电平,就是S2按键被按下。如果P25为高电平,令其P21设为低电平,P20 P22 P23为高电平,如果此时P25为低电平,表明S6按键被按下。依此类推,可以确定S1-S16中哪个按键被按下。整理课件10单片机控制矩阵键盘硬件电路原理图 Y111.0592MC230PC130PC410uFC50.1uFC310uFVCC5VR110KP1.01P1.12P1.

6、23P1.34P1.45P1.5/MOSI6P1.6/MISO7P1.7/SCK8RST9P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P3.6/WR16P3.7/RD17XTAL218XTAL119GND20A8/P2.021A9/P2.122A10/P2.223A11/P2.324A12/P2.425A13/P2.526A14/P2.627A15/P2.728PSEN29PROG/ALE30EA/VPP31P0.732P0.633P0.534P0.435P0.336P0.237P0.138P0.039VCC40U15

7、1单片机VCC5VVCC5VSS112J1供电电源电路R21KD1S112S23S34S45S56S67S78S89S9AS10BS11CS12DS13ES14ES15FS16P20P21P22P23P24P25P26P27P20P21P22P23P24P25P26P27abcgddpabfcgdedpabfcgdedpabfcgdedpfee1d2h3c4g5com46b7com38com29f10a11com112DS1123456781615141312111091KP00P01P02P03P04P05P06P07P00P01P02P03P04P05P06P07AABBCCDDEEFFG

8、GDPDPOC1C111D22D33D44D55D66D77D88D91Q192Q183Q174Q165Q156Q147Q138Q12GND10VCC20U274HC573VCC5VCOM1COM1COM4COM3COM2COM2COM3COM4P10P11P12P13P10P11P12P13VCC5V整理课件1113.4 项目软件程序设计项目软件程序设计 矩阵键盘行线P20P23为输出线,列线P24P27为输入线。单片机将行线(P20P23)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此

9、时读入列线数据还是有低电平,则说明确实有键按下,再来进一步确定键值。 整理课件12系统软件设计流程图 整理课件13程序代码#include /包含头文件,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint unsigned intunsigned char const table=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8, 0 x80,0 x90,0 x88,0 x83,0 xa7,0 xa1,0 x86,0 x8e;/定义共阳数码管段码表0-Fuchar keyscan(void)

10、;/键盘扫描函数声明void delay(void); /延时函数声明uchar keyscan(void) /键盘扫描函数 uchar key_h,key_l;/行列值中间变量 P2=0 xf0; /行线输出全为0 key_h=P2&0 xf0; /读入列线值 if(key_h!=0 xf0) /先检测有无按键按下 delay(); /去抖 if(key_h!=0 xf0) key_h=P2&0 xf0; /读入列线值 P2=key_h|0 x0f; /输出当前列线值 key_l=P2&0 x0f; /读入行线值 return(key_h+key_l);/键盘最后组合

11、码值 return(0 xff); /返回该值 void delay(void) /延时函数unsigned char i,j;for(i=0;i20;i+)for(j=0;j250;j+);整理课件14void main() /定义主函数 uchar key; P1=0 xff; /设置数码管位码端电平,显示按键上的按键码 while(1) key=keyscan(); /调用键盘扫描, switch(key) case 0 xee:P0=table0;break; /显示按键码“0” case 0 xde:P0=table1;break; /显示按键码“1” case 0 xbe:P0=t

12、able2;break; /显示按键码“2” case 0 x7e:P0=table3;break; /显示按键码“3” case 0 xed:P0=table4;break; /显示按键码“4” case 0 xdd:P0=table5;break; /显示按键码“5” case 0 xbd:P0=table6;break; /显示按键码“6” case 0 x7d:P0=table7;break; /显示按键码“7” case 0 xeb:P0=table8;break; /显示按键码“8” case 0 xdb:P0=table9;break; /显示按键码“9” case 0 xbb:

13、P0=table10;break; /显示按键码“a” case 0 x7b:P0=table11;break; /显示按键码“b” case 0 xe7:P0=table12;break; /显示按键码“c” case 0 xd7:P0=table13;break; /显示按键码“d” case 0 xb7:P0=table14;break; /显示按键码“e” case 0 x77:P0=table15;break; /显示按键码“f” 整理课件15void send_char(unsigned char txd) / 传送一个字符SBUF = txd;while(!TI);/ 等特数据传送TI = 0;/ 清除数据传送标志void send_str() / 传送字串unsigned char i = 0;uint j;while(stri !=0 x00)SBUF = stri;while(TI=0);/ 等特数据传送TI = 0;/ 清除数据传送标志i+;/ 下一个字符for(j=0;j500

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论