STM32 HAL TM1638读取24个按键

本文分享一下天微电子的另一款数码管按键驱动芯片TM1638的单片机C语言驱动程序。

笔者采用的MCU是STM32单片机,STM32CubeMX + Keil5开发,使用了HAL库。

一、TM1638介绍

1、基础信息

TM1638属于一款LED驱动控制专用电路,其特性如下:

引脚定义如下

        在实际使用中,我们只需要使用三个单片机引脚就可以进行控制。分别是DIO、STB、CLK

在进行连接单片机时,建议单片机使用开漏模式,因为还需要给三个引脚接上拉电阻,其电路推荐接法如下:

2、串行数据传输格式

  

▲注意:读取数据时,从串行时钟CLK 的第8 个上升沿开始设置指令到CLK 下降沿读数据之间需要 一个等待时间Twait(最小1μS)。

3、TM1638寄存器

TM1638分为两种寄存器,一块是显示的寄存器,一块是按键读取的寄存器

3.1 显示寄存器

        该寄存器存储通过串行接口从外部器件传送到TM1638 的数据,地址从00H-0FH共16字节单元, 分别与芯片SGE和GRID管脚所接的LED灯对应,分配如下图:

写LED显示数据的时候,按照从显示地址从低位到高位,从数据字节的低位到高位操作。

        写LED显示数据的时候,按照从低位地址到高位地址,从字节的低位到高位操作;在运用中没有使 用到的SEG输出口,在对应的BIT地址位写0。

3.2 键扫描和键扫数据寄存器

按键扫描是通过K1\K2\K3配合KS1~KS8进行读取,其寄存器就BYTE1~BYTE4。

        键扫数据储存地址如下所示,先发读键命令后,开始读取按键数据BYTE1—BYTE4字节,读数 据从低位开始输出;芯片K和KS引脚对应的按键按下时,相对应的字节内的 BIT位为1。

二、TM1638驱动程序(读取按键)

1、CubeMX配置

        只需要将对应的三个引脚配置成开漏输出即可。

2、驱动代码

TM1638.C

#include "TM1638.h"/* DIO为输出 */
void gpio2_out()
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = TM1638_DIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(TM1638_DIO_GPIO_Port, &GPIO_InitStruct);
}
/* DIO为输入 */
void gpio2_in()
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = TM1638_DIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(TM1638_DIO_GPIO_Port, &GPIO_InitStruct);
}/******************************************************************************** 函数名:TM1638_WriteData* 功  能:TM1638写数据* 参  数:u8Data需要写入的数据* 返回值:无* 说  明:无
*******************************************************************************/
void TM1638_WriteData(uint8_t u8Data)
{uint8_t i;gpio2_out();//DIO设置为输出for(i = 0; i < 8; i++){TM1638_CLKReset();Delay_us(1);(u8Data & 0x01) ? (TM1638_DIOSet()):(TM1638_DIOReset());u8Data >>= 1;TM1638_CLKSet();Delay_us(1);}
}
/******************************************************************************** 函数名:TM1638_WriteCmd* 功  能:TM1638写命令字* 参  数:u8Cmd需要写入的命令* 返回值:无* 说  明:发送命令字时STB置0,发送完置1
*******************************************************************************/
void TM1638_WriteCmd(uint8_t u8Cmd)
{TM1638_STBReset();TM1638_WriteData(u8Cmd);TM1638_STBSet();Delay_us(2);
}
/******************************************************************************** 函数名:TM1638_ReadData* 功  能:TM1638读数据* 参  数:无* 返回值:读出的数据* 说  明:无
*******************************************************************************/
uint8_t TM1638_ReadData(void)
{uint8_t i;uint8_t Read_data=0;for(i = 0; i < 8; i++){TM1638_CLKReset();Delay_us(1);Read_data >>= 1;if(TM1638_DIORead() == 1){Read_data |= 0x80;			}TM1638_CLKSet();Delay_us(1);}return Read_data;
}/******************************************************************************** 函数名:TM1638_SetBrightness* 功  能:设置亮度* 参  数:u8Brt亮度,共8级,0~7* 返回值:无* 说  明:0x88为开显示
*******************************************************************************/
void TM1638_SetBrightness(uint8_t u8Brt)
{TM1638_WriteCmd(0x88 | u8Brt);
}/******************************************************************************** 函数名:TM1638_ReadKey* 功  能:TM1638读按键数据* 参  数:无* 返回值:读出的数据* 说  明:返回值为双字节共用体,每一个bit为一个按键;
*******************************************************************************/
uint8_t TM1638_ReadKey(void)
{uint8_t u8Data[4], i;TM1638_STBReset();TM1638_WriteData(0x42);Delay_us(3);gpio2_in();//DIO设置为输入for (i = 0; i < 4; i++){u8Data[i] = TM1638_ReadData();//读BYTE1~BYTE4的数据}Delay_us(1);TM1638_STBSet();if(u8Data[0]==0x04 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 1;}else if(u8Data[0]==0x40 && u8Data[1]==0x00 && u8Data[2]==0x00 && u8Data[3]==0x00){return 2;}else if(u8Data[0]==0x00 && u8Data[1]==0x04 && u8Data[2]==0x00 && u8Data[3]==0x00){return 3;}else if(u8Data[0]==0x00 && u8Data[1]==0x40 && u8Data[2]==0x00 && u8Data[3]==0x00){return 4;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x04 && u8Data[3]==0x00){return 5;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x40 && u8Data[3]==0x00){return 6;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x00 && u8Data[3]==0x04){return 7;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x40){return 8;}else if(u8Data[0]==0x02 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 9;}else if(u8Data[0]==0x20 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 10;}else if(u8Data[0]==0x00 && u8Data[1]==0x02 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 11;}else if(u8Data[0]==0x00 && u8Data[1]==0x20 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 12;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x02 &&u8Data[3]==0x00){return 13;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x20 &&u8Data[3]==0x00){return 14;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x02){return 15;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x20){return 16;}else if(u8Data[0]==0x01 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 17;}else if(u8Data[0]==0x10 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 18;}else if(u8Data[0]==0x00 && u8Data[1]==0x01 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 19;}else if(u8Data[0]==0x00 && u8Data[1]==0x10 && u8Data[2]==0x00 &&u8Data[3]==0x00){return 20;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x01 &&u8Data[3]==0x00){return 21;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x10 &&u8Data[3]==0x00){return 22;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x01){return 23;}else if(u8Data[0]==0x00 && u8Data[1]==0x00 && u8Data[2]==0x00 &&u8Data[3]==0x10){return 24;}else{return 0xff;}
}	
/* 根据返回的键值与自己的键值操作进行修改 */
uint8_t number_out(uint8_t key_hex,uint8_t num)
{if((key_hex == KEY_0) && (num == 1)){return 0;}else if((key_hex == KEY_1) && (num == 1)){return 1;}else if((key_hex == KEY_2) && (num == 1)){return 2;}else if((key_hex == KEY_3) && (num == 1)){return 3;}else if((key_hex == KEY_4) && (num == 1)){return 4;}else if((key_hex == KEY_5) && (num == 1)){return 5;}else if((key_hex == KEY_6) && (num == 1)){return 6;}else if((key_hex == KEY_7) && (num == 1)){return 7;}else if((key_hex == KEY_8) && (num == 1)){return 8;}else if((key_hex == KEY_9) && (num == 1)){return 9;}else if((key_hex == KEY_LAST) && (num == 1)){return 20;}else if((key_hex == KEY_NEXT) && (num == 1)){return 21;}else if((key_hex == KEY_LIFT) && (num == 1)){return 22;}else if((key_hex == KEY_RIGHT) && (num == 1)){return 23;}else if((key_hex == KEY_OK) && (num == 1)){return 24;}else if((key_hex == KEY_RETURN) && (num == 1)){return 25;}else if((key_hex == KEY_LINK1) && (num == 1)){return 27;}else if((key_hex == KEY_LINK2) && (num == 1)){return 28;}else if((key_hex == KEY_SILENCE) && (num == 1)){return 29;}else if((key_hex == KEY_SEARCH) && (num == 1)){return 30;}else if((key_hex == KEY_OK) && (num == 2)){return 40;}else if((key_hex == KEY_RETURN) && (num == 2)){return 41;}return 255;
}

TM1638.h

#ifndef __TM1638_H__
#define __TM1638_H__#include "Delay.h"
#include "main.h"
#include "stm32f1xx_hal.h"#define KEY_0		10
#define KEY_1		1
#define KEY_2		2
#define KEY_3		3
#define KEY_4		4
#define KEY_5		5
#define KEY_6		6
#define KEY_7		7
#define KEY_8		8
#define KEY_9		9
#define KEY_LAST		11
#define KEY_NEXT		19
#define	KEY_LIFT		14
#define KEY_RIGHT	16
#define KEY_OK 		15
#define KEY_RETURN	12
#define KEY_LINK1	13
#define KEY_LINK2	17
#define KEY_SEARCH 	18
#define KEY_SILENCE	20/*定义端口*/
#define TM1638_STBSet()					HAL_GPIO_WritePin(TM1638_STB_GPIO_Port, TM1638_STB_Pin, GPIO_PIN_SET)#define TM1638_STBReset()				HAL_GPIO_WritePin(TM1638_STB_GPIO_Port, TM1638_STB_Pin, GPIO_PIN_RESET)#define TM1638_CLKSet()					HAL_GPIO_WritePin(TM1638_CLK_GPIO_Port, TM1638_CLK_Pin, GPIO_PIN_SET)#define TM1638_CLKReset()				HAL_GPIO_WritePin(TM1638_CLK_GPIO_Port, TM1638_CLK_Pin, GPIO_PIN_RESET)#define TM1638_DIOSet()					HAL_GPIO_WritePin(TM1638_DIO_GPIO_Port, TM1638_DIO_Pin, GPIO_PIN_SET)#define TM1638_DIOReset()				HAL_GPIO_WritePin(TM1638_DIO_GPIO_Port, TM1638_DIO_Pin, GPIO_PIN_RESET)#define TM1638_DIORead()					HAL_GPIO_ReadPin(TM1638_DIO_GPIO_Port, TM1638_DIO_Pin)uint8_t TM1638_ReadKey(void);
uint8_t number_out(uint8_t key_hex,uint8_t num);#endif /* __TM1638_H__ */

目前项目需要用到的按键是20个,这里还有4个没有使用,从目前使用的情况来看,还是不错的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/328201.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【文献阅读】李井林等2021ESG促企业绩效的机制研究——基于企业创新的视角

ESG促进企业绩效的机制 摘要 0.引言与文献综述 1.理论分析与研究假设 1.1企业ESG表现与企业绩效 假设1a&#xff1a;企业的环境表现对企业绩效存在正向影响效应。 假设1b&#xff1a;企业的社会表现对企业绩效存在正向影响效应。 假设1c&#xff1a;企业的公司治理表现对企业…

PCIE V3.0物理层协议学习笔记

一、说明 PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准&#xff0c;它原来的名称为“3GIO”&#xff0c;是由英特尔在2001年提出的&#xff0c;旨在替代旧的PCI&#xff0c;PCI-X和AGP总线标准。 PCIe属于高速串行点对点双通道高…

JVM---垃圾回收

目录 一、C/C的内存管理 二、Java的内存管理 三、垃圾回收的对比 四、Java的内存管理和自动垃圾回收 五、方法区的回收 手动触发回收 六、堆回收 如何判断堆上的对象可以回收&#xff1f; 引用计数法 可达性分析算法 五种对象引用 软引用 软引用的使用场景-缓存 弱引用 虚…

【Python-爬虫】

Python-爬虫 ■ 爬虫分类■ 1. 通用网络爬虫&#xff1a;&#xff08;搜索引擎使用&#xff0c;遵守robots协议&#xff09;■ robots协议&#xff08;君子协议&#xff09; ■ 2. 聚集网络爬虫&#xff1a;自己写的爬虫程序 ■ urllib.request&#xff08;请求模块&#xff09…

详解typora配置亚马逊云科技Amazon S3图床

欢迎免费试用亚马逊云科技产品&#xff1a;https://mic.anruicloud.com/url/1333 当前有很多不同的博客社区&#xff0c;不同的博客社区使用的编辑器也不尽相同&#xff0c;大概可以分为两种&#xff0c;一种是markdown格式&#xff0c;另外一种是富文本格式。例如华为云开发者…

dfs记忆化搜索,动态规划

动态规划概念&#xff1a; 给定一个问题&#xff0c;将其拆成一个个子问题&#xff0c;直到子问题可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重复计算。再根据子问题的答案反推&#xff0c;得出原问题解。 821 运行时间长的原因&#xff1a; 重复大量计算…

Pencils Protocol Season 2 收官在即,Season 3 携系列重磅权益来袭

此前Scroll生态LaunchPad &聚合收益平台Pencils Protocol&#xff08;原Penpad&#xff09;&#xff0c;推出了首个资产即其生态代币PDD的Launch&#xff0c;Season 2活动主要是用户通过质押ETH代币、组件战队等方式&#xff0c;来获得Point奖励&#xff0c;并以该Point为依…

代码行数统计工具cloc

Release v2.00 AlDanial/cloc GitHub 代码量代码行数统计工具cloc的正确使用(windows平台亲测有效&#xff0c;本人踩过坑&#xff0c;文中提到&#xff01;)_cloc代码统计工具-CSDN博客

深入理解K8S【安全认证机制kubectlconfig】

深入理解K8S【安全认证机制】 1 核心概念 1.1 安全体系 对于大型系统来说&#xff0c;对业务的权限、网络的安全认证是必不可少的。 对于linux系统来说&#xff0c;用户和组、文件权限、SELinux、防火墙、pam、sudo等&#xff0c;究其核心的目的都是为了保证系统是安全的。 …

K8s 二进制部署 上篇

一 K8S按装部署方式&#xff1a; ① Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特 性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ② Kubeadmin Kubeadmin也是一个工…

解决 Content type ‘application/json;charset=UTF-8‘ not supported

文章目录 问题描述原因分析解决方案参考资料 问题描述 我项目前端采用vue-elementUi-admin框架进行开发&#xff0c;后端使用SpringBoot&#xff0c;但在前后端登录接口交互时&#xff0c;前端报了如下错误 完整报错信息如下 前端登录接口JS代码如下 export function login(…

素数筛详解c++

一、埃式筛法 代码 二、线性筛法&#xff08;欧拉筛法&#xff09; 主要的思想就是一个质数的倍数(倍数为1除外)肯定是合数&#xff0c;那么我们利用这个质数算出合数&#xff0c;然后划掉这个合数&#xff0c;下次就可以不用判断它是不是质数&#xff0c;节省了大量的时间。 …

RuoYi-Vue-Plus (Logback 和 logback-plus.xml 、p6spy)

项目后本地日志 一、logback依赖 打开最外层的 pom.xml,查看 SpringBoot的依赖配置。 <dependencyManagement><dependencies><!-- SpringBoot的依赖配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…

视频智能检测AI智能分析网关V4告警消息推送:公众号消息推送的配置步骤介绍

TSINGSEE青犀智能分析网关V4属于高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;目前拥有3种型号&#xff08;8路/16路/32路&#xff09;&#xff0c;支持Caffe/DarkNet/TensorFlow/PyTorch/MXNet/ONNX/PaddlePaddle等主流深度学习框架。硬件内部署了近40种AI算法模型…

淘系淘宝订单详情api接口(订单详情,订单列表,出售中,库存等属性)

淘系淘宝订单详情api接口&#xff08;订单详情&#xff0c;订单列表&#xff0c;出售中&#xff0c;库存等属性&#xff09;

GRFB-UNet:一种新的多尺度注意力网络,用于铺路分割

不同场景下的带注释的触觉铺装示例: GRFB-UNet网络结构: GRFB模块的结构: 铺路在视障人士的旅行中起着至关重要的作用。因此,识别铺装的形状和位置以支持视障人士的移动性是相当有意义的,而视觉分割技术就适合这项任务。为了有效提高触觉铺装分割的精度和鲁棒性,…

TCP四次挥手——断开连接 滑动窗口-流量控制

四次挥手 在TCP的四次挥手中&#xff0c;其重要作用就是释放客户端和服务器的连接。 这里的一些参数非常重要&#xff0c;因为这些参数的作用是为了表达TCP四次挥手断开连接的过程。 其中的参数如下 1.FIN&#xff1a;FIN (Finish) 是TCP协议中的一个标志位&#xff0c;用于…

使用TerraScan静态扫描KubernetsIaC文件

terrascan https://github.com/tenable/terrascan Terrascan 是基础架构即代码的静态代码分析器。Terrascan 允许&#xff1a; 将基础架构作为代码无缝扫描&#xff0c;以查找错误配置。监控已配置的云基础架构&#xff0c;以查找引入终端安全评估漂移的配置更改&#xff0…

使用图网络和视频嵌入预测物理场

文章目录 一、说明二、为什么要预测&#xff1f;三、流体动力学模拟的可视化四、DeepMind神经网络建模五、图形编码六、图形处理器七、图形解码器八、具有不同弹簧常数的轨迹可视化九、预测的物理编码和推出轨迹 一、说明 这是一篇国外流体力学专家在可视化流体物理属性的设计…

OpenAI新模型GPT-4o“炸裂登场” 响应速度堪比真人 关键还免费!

GPT-4o模型基于来自互联网的大量数据进行训练&#xff0c;更擅长处理文本和音频&#xff0c;并且支持50种语言。更值得一提的是&#xff0c;GPT-4o最快可以在232毫秒的时间内响应音频输入&#xff0c;几乎达到了人类的响应水平。 GPT-4o有多“炸裂”&#xff1f;核心能力有三 G…