微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 跟我学51单片机(四):独立-矩阵键盘应用与设计

跟我学51单片机(四):独立-矩阵键盘应用与设计

时间:02-06 来源:互联网 点击:

的关键。然而,矩阵键盘中的每条行线与4 条列线相交,交点的按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,键分析时必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。

  值得注意的是本文介绍的矩阵键盘,在传统的矩阵键盘的输出端加了一个四输入与门芯片74HC21。当四路输入有一个为低电平的时候,输出为低电平。将74HC21 的输出端接到单片机的外部中断0(P32 管脚)上,这样在实时性要求较高的情况下,设P00~P03 为全低等待按键触发,当任何一个按键按下的情况下,系统都会进入中断服务程序,提高了键盘响应时间,在系统实时性要求较高的情况下非常实用。本文的全部源程序见www.ele169.com。

  三、程序设计

  本文设计实例关键程序如下。

  独立按键程序

  ……

  #define keyio P0 ( 1)

  #define key1 P0_3 ( 2)

  ……

  keyio|=0X0F; ( 3)

  if(key1==0) ( 4)

  {

  delay_nms(20); ( 5)

  if(key1==0) ( 6)

  {

  while(key1==0); ( 7)

  return 1; ( 8)

  }

  }

程序说明:

  (1)定义按键管脚。

  (2)定义按键连接管脚。

  (3)将按键连接管脚输出高电平,从而接收输入。

  (4)如果此时管脚所连接按键被按下。

  (5)延时一段时间,去抖作业。

  (6)如果此时按键仍然被按下,此时按键有效。

  (7)等待按键抬起,死循环,如果按键一直按下则一直等待。

  (8)返回键值。矩阵键盘程序

  ……

  #define KEYIO P0 ( 1)

  ……

  code ksp[4]={0x7F,0xBF,0xDF,0xEF}; ( 2)

  unsigned char keypad_scan() ( 3)

  {

  char key,i; ( 4)

  KEYIO=0xF0; ( 5)

  if (KEYIO!=0xF0) ( 6)

  {

  for(i=0;i=3;i++) ( 7)

  {

  delaykey(10); ( 8)

  KEYIO=ksp[i]; ( 9)

  delaykey(10); ( 10)

  if(KEYIO!=ksp[i]) ( 11)

  {

  delaykey(10); ( 12)

  key=KEYIO; ( 13)

  while(KEYIO==key); ( 14)

  return(key); ( 15)

  }

  }

  }

  }

程序说明:

  (1)定义矩阵键盘管脚。

  (2)将扫描时用到的管脚四种输出电平状态定义成一个数组。

  (3)按键扫描程序。

  (4)定义两个临时变量key,i。

  (5)让键盘管脚的高四位输出高电平,第四位为低电平,为扫描按键准备。

  (6)如果此时管脚状态电平发生变化。

  (7)将之前定义的数组中的值赋予管脚,开始逐次扫描。

  (8)延时一段时间,去抖。

  (9)输出扫描按键的电平。

  (10)再延时一段时间。

  (11)如果此时按键管脚电平依旧不是输出的默认电平,表示有键按下。

  (12)延时一段时间,让电平稳定。

  (13)读取当前按键管脚电平,即键值。

  (14)等待按键抬起,死循环,如果按键一直按下则一直等待。

  (15)返回键值。

  四、调试要点与实验现象

  接好硬件,通过冷启动方式将程序所生成的。hex文件下载到单片机运行后,打开串口调试助手软件,设置好波特率9600,复位单片机,然后按下板上的4×4按键中的任意一个,并注意观串口调试助手上的显示。(见图3),可以观察到在接收窗口有按键的数据显示。

图3 按键通过串口调试助手显示界面

  此外,在本文所附的实验程序中,其中与串口通信中调用了发送字符函数与发送字符串函数。在没有仿真器和遇到需要显示一些提示信息的时候,可以采用串口打印的方式,这样不仅直观方便而且不增加其他成本。

  五、总结

  本文介绍了单片机外接键盘的工作原理并给出了实例,通过该文,我们可以知道一个完善的键盘控制程序应具备以下功能:

  (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。

  (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。

  (3) 准确输出按键值(或键号),以满足按键功能要求。对于矩阵键盘而言,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。

  此外,按键的扫描方式有多种,本文中所述的是程序扫描方式,另外常见的还有定时扫描方式和中断扫描方式,这些方式均可以在本学习板上实现,因此希望读者结合前几讲的知识,自行进行程序的编写与调试。下讲将讲述单片机动态驱动数码管原理与实例,敬请期待。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top