cjtdz 发表于 2025-2-26 14:46:34

求一个15单片机与TM1652显示的例程

那位大师有15单片机控制TM1652,显示5位LED数码管的例程,参考学习一下。

haiyang201 发表于 2025-2-26 15:33:42

TM1652没用过 只用过1727

cjtdz 发表于 2025-2-26 15:36:35

haiyang201 发表于 2025-2-26 15:33
TM1652没用过 只用过1727
1727是什么通信接口?

haiyang201 发表于 2025-2-27 07:58:03

看看一样不

Lkck8210 发表于 2025-2-27 13:29:11

用串口1的模式3就可以简单控制

lhj 发表于 2025-4-6 14:21:42

你好,这个例程你找到了吗,我也想学习下。

cjtdz 发表于 2025-4-6 19:26:09

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();
    }
}

lhj 发表于 2025-4-7 07:57:24

cjtdz 发表于 2025-4-6 19:26
这是我在网上买的模块,根据它提供的资料,结合AI生成的。
用模块厂家资料+豆包+自己修改生成的STC89C51单 ...

谢谢楼主

vb2002 发表于 2025-4-7 09:26:46

参考tm1637把
这个好像不支持硬件I2C
用软件模拟I2C

cjtdz 发表于 2025-4-7 10:10:35

vb2002 发表于 2025-4-7 09:26
参考tm1637把
这个好像不支持硬件I2C
用软件模拟I2C

TM1652这个是UART串口协议,只有接收,没有发送,所以只要一个数据线。整个芯片只需要电源VCC,接地GND和数据线DIN.
页: [1] 2
查看完整版本: 求一个15单片机与TM1652显示的例程