hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1092|回复: 0

自学AVR单片机十五(4X4矩阵键盘的硬件实现)

[复制链接]

498

主题

498

帖子

1524

积分

大司空

Rank: 5Rank: 5

积分
1524
发表于 2024-2-7 22:28:08 | 显示全部楼层 |阅读模式
通过前面的例子我们分别学习了AVR单片机的I/O口作为输入和输出口的检测和控制,而一般的单片机系统中,I/O口是很少单独进行输入或者输出控制的,基本上都是既有输出又有输入,今天我们就来学习I/O口的输入和输出的综合应用。
       上一例子中我们实现了独立按键的检测,从电路图中可以看出,独立按键每个按键都要占用一个I/O口,在按键数目不是很多,系统I/O口资源比较充裕的情况下,这种一个按键占用一个I/O口的方法是行之有效的,但是如果系统I/O口资源有限,按键数目有比较多的情况下,这种方案就显得不太适合了。
       在按键数目比较多、I/O资源有限的情况下,有几种方法实现多按键检测:
    端口扩展:采用端口扩展芯片实现单片机I/O口的扩展;使用专门的键盘芯片;使用矩阵键盘。

      其中矩阵键盘是一种比较常用的方法。本实例中矩阵键盘的电路图如下

矩阵式键盘由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,单片机通过检测行或列线上的电平变化可以确定哪个按键被按下。

矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。
    矩阵键盘的检测方法有多种,常见的有:逐点扫描法、逐行扫描法、全局扫描法。
    在本实例中我们采用逐行扫描法来实现按键检测,其中PD0-PD3作为列线,PD4-PD7作为行线。识别过程如下:
    1、判断键盘中是否有键按下。设置所有行线为输出口,并输出低电平;设置列线为输入口,读取列线上的电平状态,只要有一列的电平为低,就表示有按键按下,并且被按下的键位于电平为低的列线与4跟行线相交叉的4个按键中,若所有列线都为高电平,表示没有按键按下;
    2、判断被按下按键所在的位置。在确认有键按下后(进行按键消抖处理后),接下来就是确定具体哪个案件被按下,方法是:依次将每根行线设置为输出口,并输出低电平(同时剩余行线输出高电平),然后逐列检查每根列线的电平状态,若某列为低电平,则该列线与设置为输出低电平的行线交叉处的按键就是被按下的按键。


      3、按键位置确定后,接下来就要给矩阵键盘中的每个按键进行编号,也就是进行按键编码,程序设计中常用计算法和查表法两种方式对按键进行编码,本实例采用计算法编码。

     从上面的电路图中我们可以看到,键盘的所有行线和列线都接了上拉电阻,这是为了确保在没有按键按下的时候,I/O口的电平状态始终为高电平,从而消除外界干扰。
       对于AVR单片机来说,我们已经知道在I/O口输入状态下,可以使能其内部上拉电阻,所以上面电路图中连接4根列线的上拉电阻可以不用,直接使能内部上拉电阻即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-9 16:18 , Processed in 0.063524 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表