标题: 求一个STC15单片机与TM1652显示的例程 [打印本页]
作者: cjtdz 时间: 2025-2-26 15:10
标题: 求一个STC15单片机与TM1652显示的例程
那位大师有STC15单片机控制TM1652,显示5位LED数码管的例程,参考学习一下。
作者: cedtek 时间: 2025-2-27 03:09
以下内容由 DeepSeek R1 生成
以下是基于STC15单片机驱动TM1652数码管显示的示例代码,综合了多个搜索结果中的技术要点(如UART模拟时序、命令格式、硬件配置等),并针对5位数码管显示需求进行了适配和优化。代码注释中包含了关键逻辑说明,方便学习和移植。
STC15单片机驱动TM1652示例代码 #include "STC15F2K60S2.H"
#include <intrins.h>
// 定义TM1652通信引脚(假设使用P3.0作为数据线)
sbit TM1652_SDA = P3^0;
// 延时函数(适应11.0592MHz晶振,调整延时以满足52us/位的时序要求)
void delay_us(unsigned int us) {
while (us--) {
_nop_(); _nop_(); _nop_(); _nop_(); // 约1us延时
}
}
// TM1652发送单字节函数
void TM1652_SendByte(unsigned char dat) {
unsigned char i;
unsigned char parity = 0; // 奇偶校验计数器
// 起始位(高→低,持续52us)
TM1652_SDA = 1;
delay_us(5);
TM1652_SDA = 0;
delay_us(52);
// 发送8位数据(低位优先)
for (i = 0; i < 8; i++) {
if (dat & 0x01) {
TM1652_SDA = 1;
parity++;
} else {
TM1652_SDA = 0;
}
dat >>= 1;
delay_us(52);
}
// 校验位(若数据中1的个数为奇数,则校验位为0)
TM1652_SDA = (parity % 2 == 0) ? 1 : 0;
delay_us(52);
// 停止位(高电平,持续52us)
TM1652_SDA = 1;
delay_us(52);
}
// 初始化TM1652(设置显示模式、亮度等)
void TM1652_Init() {
// 显示控制命令:开启显示,亮度级别4(共8级)
TM1652_SendByte(0x48); // 命令格式:0x4X(X为亮度值+显示开关)
}
// 显示5位数字(支持0-9)
void TM1652_Display5Digits(unsigned char *digits) {
// 发送显示地址命令:从第一个数码管开始(地址0x00)
TM1652_SendByte(0x00); // 地址命令
// 发送5位数据(每位对应一个数码管)
for (unsigned char i = 0; i < 5; i++) {
TM1652_SendByte(digits); // 需根据段码表转换数字到TM1652编码
}
// 发送结束命令(可选)
TM1652_SendByte(0x0F); // 结束帧
}
// 主函数示例
void main() {
unsigned char display_data[5] = {0x3F, 0x06, 0x5B, 0x4F, 0x66}; // 显示"12345"
TM1652_Init(); // 初始化TM1652
TM1652_Display5Digits(display_data); // 更新显示
while(1) {
// 动态更新显示内容(如需)
}
}
关键说明与注意事项
扩展功能如需完整工程或更详细的移植说明,可参考以下资源:
作者: 飞云居士 时间: 2025-2-27 10:52
#include <STC15F2K60S2.h>
#define TM1652_DIO P1_0 // DIO连接口
#define TM1652_CLK P1_1 // CLK连接口
// 定义命令
#define CMD_WRITE 0x40
#define CMD_DISPLAY_ON 0x88
void DelayMs(unsigned int ms)
{
while (ms--) {
unsigned int i = 123; // 大约1ms
while (i--);
}
}
void TM1652_SendByte(unsigned char dat)
{
unsigned char i;
// 发送数据
for (i = 0; i < 8; i++) {
TM1652_DIO = dat & 0x01; // 发送最低位
dat >>= 1; // 右移
TM1652_CLK = 1; // 时钟高电平
DelayMs(1); // 小延时
TM1652_CLK = 0; // 时钟低电平
}
}
void TM1652_Init(void)
{
TM1652_CLK = 0; // CLK初始化
TM1652_DIO = 0; // DIO初始化
TM1652_SendByte(CMD_WRITE); // 发送写命令
TM1652_SendByte(CMD_DISPLAY_ON); // 打开显示
}
void TM1652_Display(unsigned char pos, unsigned char data)
{
// pos: 位置 (0-4) 对应于 5 位数码管
// data: 显示的数据
TM1652_SendByte(0xC0 | pos); // 设置起始地址
TM1652_SendByte(data); // 发送数据
}
void main(void)
{
TM1652_Init(); // 初始化TM1652
while (1) {
TM1652_Display(0, 0x01); // 显示第0位数据
TM1652_Display(1, 0x02); // 显示第1位数据
TM1652_Display(2, 0x03); // 显示第2位数据
TM1652_Display(3, 0x04); // 显示第3位数据
TM1652_Display(4, 0x05); // 显示第4位数据
DelayMs(1000); // 延时1秒
TM1652_Display(0, 0x06); // 改变显示内容
TM1652_Display(1, 0x07);
TM1652_Display(2, 0x08);
TM1652_Display(3, 0x09);
TM1652_Display(4, 0x0A);
DelayMs(1000); // 延时1秒
}
}
//参考,按思路去修改
作者: lkc8210 时间: 2025-2-27 11:32
用串口1的模式3就可以简单控制
作者: xiaobendan001 时间: 2025-2-28 07:39
居然只用一个脚通信?我记得好像18B20
作者: lkc8210 时间: 2025-2-28 11:38
这芯片是串口通信的,只收不发
一个TxD就够
作者: xiaobendan001 时间: 2025-2-28 12:38
哦,没用过,那就是不能带按键 了
我用过1650带几个按键,还是很方便的,显示与主控分体时节省不少线。
作者: cjtdz 时间: 2025-2-28 17:32
1652只有一个接收口,一线的
作者: WL0123 时间: 2025-3-1 08:35
地板正解!使用单片机串口,只发不收。波特率19200.
TM1652.PDF
(369.46 KB, 下载次数: 0)
作者: yslsdas 时间: 2025-5-7 13:58
有hal 的 显示例程么 我 跟著 网上的一篇显示成功的配置 愣是没有显示成功
"基于STM32CUBE的UART串口驱动TM1652程序"
http://www.51hei.com/bbs/dpj-239955-1.html
作者: yslsdas 时间: 2025-5-8 14:30
破案了一把直接用到坏芯片啊 可以正常显示
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |