TM1637和8位数码管的学习
元器件(proteus)
共阳极八位数码管---7SEG-MPX1-CA 其中CA为共阳极,CC为共阴极
数码管驱动芯片---TM1637
单片机---STM32F103C6T6A
原理
完整电路图:
7SEG-MPX1-CA:
八个SEG引脚分别对应八段LED灯管;第九个引脚对应位选引脚,决定是否点亮
TM1637:
这款芯片用来同时控制多达6个数码管,对应GRID1~6引脚;SG1~SG8引脚对应八个段选,也可复用为按键控制(本实验未涉及);一个时钟输入和一个数据输入引脚,输入需要+5V,所以在本实验中需要使用开漏输出OD接上拉电阻和滤波电容;VDD输入需要+5V。
驱动详解
GPIO初始化:需要将输出置为开漏输出,本实验使用PA1作为时钟线输出口,PA2作为数据线输出口
TM1637驱动:
芯片的驱动基本为按顺序进行数据命令(command1)、地址命令(command2)、数据(点亮具体)、显示控制命令(command3)
数据命令:读写模式、地址增加模式等配置
地址命令:即位选,选择哪个数码管
数据:即根据数码管的段相应给出八位数据(可参考对应表)
// 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f // 0 1 2 3 4 5 6 7 8 9
显示控制:控制开关与否和亮度,PWM调制
数据传输协议
开始信号:保持时钟线高电平,数据下降沿触发开始信号
ACK:每个字节数据发送完后需要应答,保持数据线低电平,时钟线由低到高电平后低电平
结束信号:保持时钟线高电平,数据上升沿触发结束信号
代码实现
比较重要的是关于发送数据,本程序使用了8次循环进行移位与操作给出高/低电平,然后外部再嵌套一层for循环用来发送数据数组,代码如下。
uint8_t i,j; for(i=0;i<len;i++) { for(j=0;j<8;j++) //循环移位判断数据 { if((Data[i] & (0x01 << j)) != 0) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); } Delay_us(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); Delay_us(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); Delay_us(1); } HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); Delay_us(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); Delay_us(1); }
需要注意的是,只有在时钟线高电位时数据才有效,同时时钟高电平,数据电平都需要一定持续时间(本程序采用1μs),如图bit0,数据线先拉高电平,延迟1μs,然后时钟线再拉高电平,延迟1μs,然后数据位再进行下一轮改变。
参考链接
TM1637数据手册:半导小芯----https://www.semiee.com/file/TM/TM-TM1637.pdf
底层原理和程序设计:铁头山羊----https://www.bilibili.com/video/BV1Ma411v7ZF/?p=24&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=a79f8b058df1ea4087f67b7e1bf84bb2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」