前言:在做MCU的外部按键扫描时,74HC164是一种不错的选择。笔者在使用它的过程中,遇到了一些问题,在这里整理记录下。

74HC164的特性

  • 如下图所示,74HC164是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出(即串入并出)。数据通过两个输入端(A 或 B)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
  • 时钟 (CLK) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(A 和 B)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
  • 主复位 (CLR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。

74HC164按键扫描思想

  • 在使用74HC164用作按键扫描时,74HC164的8个输出端QA~QH可以连接8个按键,8个按键则可以同时串联在一个或者多个公共端上,公共端可以直接是MCU的输入引脚。这时就会出现两种情况:

  • 1)公共端接地,74HC164定时扫描出高电平

    这时,如果进行扫描时,公共端出现高电平,那么结合这时74HC164扫描到哪一位,就可以判断出是这个公共端上哪个按键被短路,即被按下。

  • 2)公共端上拉,74HC164定时扫描出低电平

    这时,如果进行扫描时,公共端出现低电平,那么结合这时74HC164扫描到哪一位,就可以判断出是这个公共端上哪个按键被短路,即被按下。

74HC164按键扫描实现

74HC164需要结合定时器来进行按键扫描,这里将定时器的定时时间定为2.5ms,即每2.5ms调用一次该函数,将i++。这里选择的接法是按键公共端上拉,74HC164定时扫描出低电平。

/*74HC164是传入并出的8位寄存器,想要定时扫描出低电平,可以将建立如下的扫描值表*/
const uint8_t Tab_74HC164[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
/*
* keyBuff:传入按键值缓冲区的地址
* tab:传入扫描键值表,为上述的Tab_74HC164
* i:扫描一个字节中的哪一位,作为tab的索引使用
*/
void Key_74HC164(uint8_t *keyBuff,uint8_t const *tab,uint8_t i)
{uint8_t j = i - 1,temp = tab[i];if(!i) j = 7;/*进行公共端扫描*/if(!(Key_Com0_Port&Key_Com0_Pin))keyBuff[0] |= (1<<j);if(!(Key_Com1_Port&Key_Com1_Pin))keyBuff[1] |= (1<<j);if(!(Key_Com2_Port&Key_Com2_Pin))keyBuff[2] |= (1<<j);if(!(Key_Com3_Port&Key_Com3_Pin))keyBuff[3] |= (1<<j);/*进行74HC164扫描*/j = 8; do{Clk164_Port &= ~Clk164_Pin;Ser164_Port &= ~Ser164_Pin;if(temp&0x80) Ser164_Port |= Ser164_Pin; //从最高位开始传输DelayTimes(10); //作延迟,等待信号稳定传输Clk164_Port |= Clk164_Pin;DelayTimes(10); //作延迟,等待信号稳定传输j--;temp <<= 1;}while(j);
}/*延迟函数*/
void DelayTimes(uint16_t nLoop)
{while(nLoop--);
}

代码分析

  • 1.端口和引脚
  • 上面提到的一些端口和引脚都可以根据自己的需要进行更改和重命名。如:Key_Com0_Port,Key_Com0_Pin,Key_Com1_Port,Key_Com1_Pin,Key_Com2_Port,Key_Com2_Pin,Key_Com3_Port,Key_Com3_Pin,Clk164_Port,Clk164_Pin,Ser164_Port,Ser164_Pin。
  • 2.公共端扫描和164扫描谁先进行

  • 上面是某型号74HC164手册中的图,可知想要让数据信号稳定的输出,在不同的电压下需要的时间不同。因此,对于定时扫描来说最好不要先扫描74HC164输出电平,紧接着扫描公共端。这样很可能因为数据没有稳定输出造成误差。比较稳妥的一种做法是,先扫秒74HC164输出目标电平,等待下次定时器中断到来时,再针对上一次的74HC164扫描数据进行公共端扫描,这样可以保证有足够的延迟时间。(注:这里只是建议先进行74HC164扫描,再进行公共端扫描,并不一定说反之不可行)。
    所以上面的j=i-1的做法是指对上一次74HC164扫面结果做出处理。
  • 3.延迟函数的使用
  • 通过上面的图可以知道,74HC164的电平信号干扰抖动时间是纳秒级别的,如果以系统时钟24MHz来计算,MCU的时钟周期约为41ns,对于上述图中某些低电压时的延迟时间来说,它并不能够完全保证74HC164的信号可以稳定输出,更不用说当系统时钟频率更高的情况。因此,在74HC164传入并出移位时,在时钟移位信号和数据信号前可以适当的加上延迟函数,保证信号能够稳定输出。

总结:74HC164是一个串入并出的8位寄存器,在使用它进行按键扫描时需要分清它和公共端谁负责高电平,谁负责低电平。最后需要注意信号电平的延迟时间的问题。

按键扫描——74HC164驱动(一)相关推荐

  1. 按键扫描——74HC164驱动(二)

    前言:上一篇说到使用74HC164做按键扫描的实现,这篇就作为关于74HC164使用时遇到的问题记录帖. 关于二极管 在使用一些非按键专用的扫描芯片时,往往会在芯片的扫描端的每个端口都接上一个二极管, ...

  2. LED数显低功耗驱动芯片VK16K33,低功耗数码管LED驱动IC-SOP28/24/20,多封装选择,带按键扫描功能,兼容市面16K33

    品牌:永嘉微电/VINKA 型号:VK16K33 封装:SOP28/24/20 年份:新年份 概述: VK16K33是一个内存映射和多功能LED控制器驱动程序.VK16K33有28SOP.24SOP和 ...

  3. 74hc164驱动数码管c语言程序,74hc164应用电路图_74hc164驱动源程序

    74hc164是高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容.74hc164是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出.数据通过两个输入端(DSA ...

  4. 3、按键扫描检测处理

    说明:本文处理按键的短按.长按检测执行,非矩阵按键 硬件可以类似如下连接即可,无需放置上下拉电阻: 按键动作分长按.短按(弹起时执行)两种 按下不放执行长按,但松开按键时不予执行短按函数 多个按键可以 ...

  5. 2.8 STM32_按键扫描_安富莱

    1.程序优点 扩展性非常强,功能比较齐全: bsp_key按键驱动程序用于扫描独立按键,具有软件滤波机制,采用FIFO机制保存键值.可以检测如下事件: 按键按下. 按键弹起. 长按键. 长按时自动连发 ...

  6. 以STC的单片机为例A/D做按键扫描应用原理介绍

    以STC单片机为例A/D做按键扫描应用原理介绍 矩阵按键扫描或者是多个按键扫描,我们通常想到的可能大多是通过多个IO口来搭建按键扫描电路,例如下面的4X4矩阵按键,今天来介绍的是通过引入模拟量信号采集 ...

  7. 这个设计思想能启蒙你很多年,嵌入式裸机按键扫描

    这个设计思想能启蒙你很多年,嵌入式裸机按键扫描 摘要:本文目的是讲述一个按键扫描处理的面向对象开发的设计思想,适用于裸机开发,通过按键扫描,检测到按键是否按下,松开等状态,并将该状态通过其他形式反馈给 ...

  8. Proteus VSM Studio汇编 + 8位数码管+按键扫描

    Proteus VSM Studio汇编 + 8位数码管+按键扫描 Proteus构建演示 基于Proteus VSM Studio汇编代码(.asm) ;********************** ...

  9. TM1650和AIP650 按键扫描、LED驱动程序

    摘要:按键扫描.LED驱动二合一 TM1650和AIP650两款芯片 拥有LED驱动显示以及按键扫描的功能.并且在使用上可以随意替换,驱动程序也是同一个. 驱动程序:需要自行修改init函数: 按键获 ...

最新文章

  1. redhat7 Oracle 12C 安装
  2. PAT Basic 1069. 微博转发抽奖(20)
  3. 自动化生成 Openstack 新项目开发框架
  4. mysql删除数据表show_数据库与表显示、创建、删除
  5. fiddler如何设置过滤https_Google Analytics如何设置含有过滤器的帐户数据视图
  6. 简述HTML DOM及其节点分类
  7. java里ssm框架分页代码_SSM框架实现分页查询例子
  8. 【第1篇】Python爬虫实战-王者荣耀高清壁纸下载
  9. 共享端口445能改吗_模玩控:高达模型改圣斗士星矢五小强,大家能认出它们都是机体吗?...
  10. php 获取文件扩展名
  11. 面试题27 二叉搜索树转换为双向链表
  12. pc 浏览器最小字体12px
  13. idea抽取重复方法快捷键_idea 常用快捷键
  14. 原生js发送ajax请求
  15. 如何在手机上查看APP原型
  16. 智能电表无线(NB-IOT/LoRa)红外读表远程抄表器实施方案
  17. 天涯怎么引流到qq?天涯社区如何靠发帖子引流?
  18. 电脑蓝屏后的文件数据怎么恢复?电脑蓝屏的原因有哪些
  19. 关于Pearson相关系数的显著性p值如何计算以及背后原因的思考
  20. 理论篇:关注点分离(Separation of concerns, SoC)

热门文章

  1. 黑盒测试用例设计方法-正交试验
  2. 全网首发!老大众奥迪碟盒通信协议破解,可以模拟数码碟盒,外接AUX蓝牙U盘等音频设备
  3. Centos7,离线yum源下载,搭建
  4. idea修改css,js样式浏览器没更新问题
  5. 我们应该怎么去认识信贷
  6. 第4-8课:方块消除游戏
  7. java 俄罗斯方块消除整行,帮忙看下我的俄罗斯方块满行删除方法,为嘛一次只能删除1行。。...
  8. MIT线性代数笔记三 矩阵的乘法和逆矩阵
  9. 【JAVA】网页版登录注册系统2.0
  10. 华为OD机试 - 德州扑克(Java JS Python)