原理篇2、按键扫描电路与驱动程序
目录
- 1、74HC595电路
- 引脚功能
- 电路连接
- 级联
- 2、按键矩阵原理
- 3、扫描驱动程序
- 引脚初始化
- 输出设置
- 扫描读取
- 3、参考资料
- 资料获取
.
1、74HC595电路
引脚功能
管脚序号 | 符号 | 管脚功能 |
---|---|---|
10 | SCLR‾\overline{SCLR}SCLR | 复位端(低电平有效) |
11 | SCK | 数据输入时钟端,上升沿移位 |
12 | RCK | 输出存储器锁存时钟端(下降沿,输出状态保持不变;上升沿,8 位锁存移位寄存器中的状态值并行输出) |
13 | G‾\overline{G}G | 输出使能端,为低电平使,输出选通;为高电平时,输出高阻态 |
14 | SER | 串行数据输入端 |
15、1~7 | Q0~Q7 | 八位数据并行输出端 |
9 | Q7` | 串行数据输出端 |
8 | GND | 电源地 |
16 | Vcc | 电源端 |
不同原理图对74HC595引脚符号的标注不同,但对应引脚的功能都是相同的。
.
电路连接
将输出使能引脚 G# 下拉,使之可以输出数据。
复位引脚 SCLR# 上拉,不需要进行复位。
ESP32的GPI/O33连接 数据输入端 SER ,输出串行数据。
ESP32的GPI/O26连接 数据输入时钟端 SCK ,产生发送数据时需要的时钟。
ESP32的GPI/O27连接 锁存寄存器时钟端 RCK ,控制数据输出状态的保持。
级联
级联方法
需要将其中一个595的串行数据输出引脚连接到另一个的数据输入引脚上。
两个595芯片的数据时钟引脚,锁存器引脚分别连接到相同的单片机控制引脚。
数据写入
先写入的数据往后移,例如输入 0000 0000 0000 0101
,若是从低位开始输入,则第一个数据应该是1,第二个是0,第三个是1,第四个是0,第五个是0,…
输入完成后对 RCK引脚发送一个上升沿,然后发送一个下降沿,使其输出的引脚状态保持。
OUT_0~OUT15的状态应为:0000 0000 0000 0101
。
.
.
在键盘的原理图设计时,为了在编程时方便写按键扫描驱动,将输出的位置对调了一下,即OUT_0设为OUT_15,OUT_1设为OUT_14,其余部分也是如此。
.
.
2、按键矩阵原理
以上为部分按键矩阵,通过二极管的单向导通特性实现按键放冲突(所有按键同时按下也不会高低电平直接连接)。
.
扫描方法
初始化:
74HC595芯片引脚全部输出低电平,即OUT0~OUT13全为低电平,
5个输入引脚设置为下拉输入。
扫描:
扫描时仅将其中一个的输出状态设为1,其余设为0,然后读取5个输入引脚的状态。
反复上述步骤13次即可扫描一遍键盘状态。
.
.
.
3、扫描驱动程序
引脚初始化
引脚初始化函数为 void pin_init();
输出设置
驱动程序 void write_hc595(uint8_t loc)
将 OUT_loc 设定为1,其余为0。
void write_hc595(uint8_t loc)
{//将锁存时钟引脚置低//原来为高电平,此时为低电平,产生下降沿//保持原来的数据状态,防止在写入新数据时输出引脚也随着新数据变化digitalWrite(STC_PIN, LOW);for (uint8_t j = 0; j < 16; j++){//将时钟引脚置低,//原来为高电平,此时为低电平,产生下降沿digitalWrite(SHC_PIN, LOW);//如果当前数据位需要置1if (j == loc){digitalWrite(OUT_PIN, HIGH);//数据引脚拉高,写入1}else//否则置0。{digitalWrite(OUT_PIN, LOW);//数据引脚拉低,写入0}digitalWrite(SHC_PIN, HIGH);//将时钟引脚置高,//原来为低电平,此时为高电平,产生上升沿,写入的数据向后移,并将数据引脚的状态保存。}//将锁存时钟引脚置高//原来为低电平,此时为高电平,产生上升沿//将8位锁存移位寄存器中保存的的状态值并行输出digitalWrite(STC_PIN, HIGH);delayMicroseconds(1); //此处需要延迟1us,保证输出状态稳定
}
扫描读取
示例
pin_init(); //引脚初始化iir_begin(); //开启IIR滤波uint8_t IN_P[5] = {IN0, IN1, IN2, IN3, IN4};uint8_t KEY_STATE[KEYBOARD_ROW][KEYBOARD_COLUMN] = {};for (;;){//如果允许键盘读取get_scan_keyboard()返回1,否则返回0if (get_scan_keyboard() == 1){//逐列扫描for (int i = 0; i < KEYBOARD_ROW; i++){//逐行读取for (int j = 0; j < KEYBOARD_COLUMN; j++){//将对应列置1,其余列置0。write_hc595(j);//读取对应行的输入引脚状态KEY_STATE[i][j] = digitalRead(IN_P[i]);}}//由于回车键单独使用一个GPI/O引脚检测,所以KEY_STATE[ENTER_X][ENTER_Y] = !digitalRead(ENTER_PIN);//将扫描得出的状态写入队列,提供给其他任务读取。xQueueOverwrite(KEYBOARD_SATE_QUEUE, &KEY_STATE);}}
.
.
3、参考资料
1、百度百科 74HC595
https://baike.baidu.com/item/74HC595/9886491?fr=aladdin
.
.
资料获取
全部工程文件进ESP32工程群(483217976)自行下载,所有文件在 ESP32键盘 目录下。
原理篇2、按键扫描电路与驱动程序相关推荐
- TM1650和AIP650 按键扫描、LED驱动程序
摘要:按键扫描.LED驱动二合一 TM1650和AIP650两款芯片 拥有LED驱动显示以及按键扫描的功能.并且在使用上可以随意替换,驱动程序也是同一个. 驱动程序:需要自行修改init函数: 按键获 ...
- 以STC的单片机为例A/D做按键扫描应用原理介绍
以STC单片机为例A/D做按键扫描应用原理介绍 矩阵按键扫描或者是多个按键扫描,我们通常想到的可能大多是通过多个IO口来搭建按键扫描电路,例如下面的4X4矩阵按键,今天来介绍的是通过引入模拟量信号采集 ...
- STM32矩阵按键扫描冲突问题
最近做了一个项目,有个部分用到了矩阵扫描的原理,要检测按键是否按下去执行一个动作.一开始硬件工程师的原理图实现是设计成传统矩阵按键方式,大致原理如下所示: 这种硬件实现方式当去检测单个按下.一整行按下 ...
- 【摘录】MTK按键扫描原理及相关代码
一.MTK按键扫描原理: 不同的MTK平台内部提供的按键数目各有不同,但是扫描原理大致一样,这里以MTK6253为例来讲解记录. MTK提供6*7共42个矩阵键盘,加上Power键总共43个按键,其中 ...
- 2.8 STM32_按键扫描_安富莱
1.程序优点 扩展性非常强,功能比较齐全: bsp_key按键驱动程序用于扫描独立按键,具有软件滤波机制,采用FIFO机制保存键值.可以检测如下事件: 按键按下. 按键弹起. 长按键. 长按时自动连发 ...
- Android卡顿掉帧问题分析之原理篇
当用户抱怨手机在使用过程中存在卡顿问题的时候,会严重影响用户对手机品牌的好感和应用APP的体验,从而导致用户对手机品牌的忠诚度降低或应用APP的装机留存率下降.所以无论是手机设备厂商还是应用APP开发 ...
- HAL库STM32CuBe实现按键扫描芯片STM32F407
芯片STM32F407ZGT6 注意:这芯片的按键不是矩阵按键 分类: 按结构原理分: 触点式开关按键 无触点开关按键 接入方式 独立式按键 矩阵式键盘 ----------------------- ...
- 木马冰河之原理篇(深入浅出看木马)
主题:木马冰河之原理篇(转载) 在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之一 冰河为例,向大家剖 ...
- 内存映射和多功能LED控制器驱动芯片/带按键扫描的LED驱动芯片(IC)-VK16K33A/B/C,内置RC振荡器,最大16seg和8com
品牌:永嘉微电/VINKA 工程服务,技术支持 型号:VK16K33A/B/C 封装:SOP28/24/20 年份:新年份 概述: VK16K33是一个内存映射和多功能LED控制器驱动程序.VK16 ...
最新文章
- Hive查询结果输出文件
- 屏蔽基于对话框的MFC程序中按下ESC关闭窗口的功能
- 计算机网络与通信02339,4月全国高等教育自学考试计算机网络与通信试题及答案解析.docx...
- mysql执行代码段_mysql的event schedule 可以让你设置你的mysql数据库再某段时间执行你想要的动作...
- python如何创建工程预设_新手如何发布第一个 Python 项目开源包?
- ps批量修改名片文字_PS批量制作多项字幕条
- 计算机声卡的步骤,声卡调试教程
- 手把手教你 VSCode搭建STM32开发环境
- 声事件识别之时域短时过零率
- 乐优商城_第5章_-vue入门
- Pandas + Pyecharts | ADX游戏广告投放渠道综合分析
- 《失业七个月,面试六十家公司》的深圳体验
- 查看患者信息java_Java通过反射查看类的信息示例
- NPOI写Excel,Microsoft.Office.Interop.excel.dll 转换Excel为PDF
- shell脚本明文密码隐藏且加密
- Node中间件和路由器
- 乌班图服务器账号密码忘了,如何在Ubuntu 20.04 LTS服务器中重置Sudo密码
- 祝全天下老师教师节快乐
- 《23种设计模式之单例模式(4种实现)》
- codewars练习(5)backwardsPrime--提交失败-Execution Timed Out (12000 ms)
热门文章
- IHT发布全球首个房产ATO项目,加速进入酒店和旅游房产市场
- 总结两个Javascript的哈稀对象的一些编程技巧
- 多传感器融合定位 第六章 惯性导航结算及误差模型
- 20多岁女人14件事决定一生
- 阿里云服务器云盘在线扩容
- [源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice
- android平板电脑怎么才能连接电脑,怎么将安卓平板电脑装在车上 主板又是怎么连接上去的...
- Microsoft Visual Studio 2019 下载与离线安装教程
- SAP 外向交货的包装功能
- CityGML标准文档(8)(正文——CityGML概述)