求一个15单片机与TM1652显示的例程
那位大师有15单片机控制TM1652,显示5位LED数码管的例程,参考学习一下。TM1652没用过 只用过1727 haiyang201 发表于 2025-2-26 15:33
TM1652没用过 只用过1727
1727是什么通信接口? 看看一样不 用串口1的模式3就可以简单控制 你好,这个例程你找到了吗,我也想学习下。 lhj 发表于 2025-4-6 14:21
你好,这个例程你找到了吗,我也想学习下。
这是我在网上买的模块,根据它提供的资料,结合AI生成的。
用模块厂家资料+豆包+自己修改生成的STC89C51单片机+TM1652 5位LED二键增减计数器,实际调试OK,献给大家。
//51单片机+TM1652二按键增减计数5位LED显示C代码//
//普通显示,无中断,调试OK
#include "REG51.h"
unsigned char KEY_NUM = 0;
typedef unsigned char u8;
typedef unsigned int u16;
u16 count = 0; //按键计数值
sbit up = P3^6; //增加按键
sbit down = P3^7; //减少按键
sbit D_out = P0^0; //模拟UART数据输出端,连接TM1652数据输入端D_in
const u8 CODE = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};//共阴数码管0~F字型码
void Delay52us()//@11.0592MHz
{
unsigned char i;
i = 21;
while (--i);
}
void Delay5ms()//@11.0592MHz
{
unsigned char i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
void Delay104us()//@11.0592MHz
{
unsigned char i;
i = 45;
while (--i);
}
void tm1652_send_data(u8 sdat) //向TM1652发送数据
{
unsigned char i = 0, sfalg = 0;
//起始位
D_out = 0;
Delay52us(); //保持52us
//发送8位数据
for (i = 0; i < 8; i++)
{
if (sdat & 0x01)
{
D_out = 1;
sfalg++;
}
else
{
D_out = 0;
}
Delay52us();
sdat >>= 1;
}
//校验位,按照发送数据中1的个数来判断
if (sfalg % 2 == 0)
{
D_out = 1;
}
else
{
D_out = 0;
}
Delay52us();
//停止位
D_out = 1;
Delay104us();
}
void TM_Digtal_Display(u16 num)
{
tm1652_send_data(0x08);
// 确保能正确显示五位数
tm1652_send_data(CODE);
tm1652_send_data(CODE);
tm1652_send_data(CODE);
tm1652_send_data(CODE);
tm1652_send_data(CODE);
Delay5ms();
tm1652_send_data(0x18); //向TM1652发送显示控制命令
tm1652_send_data(0xFE); //设置位占空比为 15/16,设置段驱动电流为 8/8,最大亮度。
}
// 延时函数,用于按键消抖
void delay(unsigned int time)
{
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
//主函数
void main()
{
u16 delaytick = 0;
// 开机显示00000
TM_Digtal_Display(0);
while (1)
{
// 检测上按键是否按下
if (up == 0) {
delay(20);// 消抖
if (up == 0)
{
if (count < 99999) {
count++;
}
while (up == 0) {
delay(10); // 持续检测按键释放,避免重复触发
}
delay(20); // 释放后再次消抖
}
}
// 检测下按键是否按下
if (down == 0) {
delay(20);// 消抖
if (down == 0) {
if (count > 0) {
count--;
}
while (down == 0)
{
delay(10); // 持续检测按键释放,避免重复触发
}
delay(20); // 释放后再次消抖
}
}
if (++delaytick == 50) // 提高显示刷新频率
{
delaytick = 0;
TM_Digtal_Display(count);
}
Delay5ms();
}
}
cjtdz 发表于 2025-4-6 19:26
这是我在网上买的模块,根据它提供的资料,结合AI生成的。
用模块厂家资料+豆包+自己修改生成的STC89C51单 ...
谢谢楼主 参考tm1637把
这个好像不支持硬件I2C
用软件模拟I2C
vb2002 发表于 2025-4-7 09:26
参考tm1637把
这个好像不支持硬件I2C
用软件模拟I2C
TM1652这个是UART串口协议,只有接收,没有发送,所以只要一个数据线。整个芯片只需要电源VCC,接地GND和数据线DIN.
页:
[1]
2