tm1650调试记录

  • 阅读芯片手册
  • 调试遇到的问题
    • 1:数据的写入
    • 2:数码管不亮
    • 3:数码管调试模式亮,正常运行不亮
  • TM1650的应用补充——仅适用于LED驱动
    • 亮度
    • 片选信号DIG
    • 配置顺序
  • 代码分享
    • dv_TM1650.h
    • dv_TM1650.c
  • 附件:数据手册PDF截图(共5页)

开发板:STM8L

阅读芯片手册

参考网址:https://item.szlcsc.com/45446.html#pdf-view
点击 “数据手册PDF” 栏目,就可以看到详细的介绍。

另一个较为详细的参考资料链接:https://max.book118.com/html/2022/0514/8041072017004101.shtm

调试遇到的问题

1:数据的写入

根据芯片手册所述,会有配置地址 0x48,正常理解不应该是这样的:
{bit[7] bit[6] bit[5] bit[4] bit[3] bit[2] bit[1] bit[0] ACK bit[7] bit[6] bit[5] bit[4] bit[3] bit[2] bit[1] bit[0] }
数据线上的波形表现是:start 0 1 0 0 1 0 0 0 0 set[7]…set[0] 0 stop
(注:斜体数字是来自芯片回复)
疑问:结束前倒数第二个时钟对应的数据被拉低了一截,这样反而代表是正确的,原因未知。示波器抓图如下:

2:数码管不亮

确定正确写入要显示的数据以后,数码管依旧不亮。
经过仔细观察,是硬件电阻选用错误导致数码管驱动电流太小亮的不明显。需要仔细的甄别。
也可以配合单步调试,测试芯片的8段输出电平,看是否与写入情况一致。只要一致芯片就是用起来了。
至于数码管不亮,是另外的分析环节。ps:相关帖子有人说采用共阳极的不行。没遇到过,不知真假。

3:数码管调试模式亮,正常运行不亮

首先确认单片机上电程序加载成功,其他代码也正常运行了。但是只有数码管不亮。
用示波器抓波也可以看到数据有在下发,然后就想到配置距离数字显示功能函数的时延太大了。把初始化提到数字显示前一步,显示正常。后面在显示数字功能函数前加了设置功能函数就好了。这点比较特殊。

TM1650的应用补充——仅适用于LED驱动

亮度

亮度设置从1~8级,级别越高,亮度越大。

片选信号DIG

低有效(低电平代表选中数码管)。可以用来测试配置是否成功。
以DIG4为例, 配置寄存器配置前,此引脚输出高电平。配置生效后,输出方波。经过测试是频率223.5Hz,占空比75%的方波,具体波形参考图:

配置顺序

必须先进行配置寄存器写入(此芯片也可用于矩阵按键的识别,是配置寄存器的不同将功能分化),再进行下一步显示数值的设置。关于这里补充一下,配置寄存器不是开机初始化一次后面直接写数据就可以的,而是最好每次写入显示数据前都重新配置一次。本人在STM8采用初始化配置,后期写数的情况出现了异常:调试模式显示数字没问题,断电重启就不显示数字,调了好久,特此提醒。

代码分享

开发板:STM8L
库函数版本

dv_TM1650.h

#ifndef DV_TM1650_H
#define DV_TM1650_H

// dv_TM1650
//IIC所有操作函数

void gpio_IIC_Start(void);
void gpio_IIC_Stop(void);
void gpio_IIC_Send_Byte(char dat);
char IIC_SDA_RD();
char gpio_IIC_Wait_Ack(void);

void TM1650_Init(void); //初始化IIC的IO口
void TM1650_Set(unsigned char light , unsigned char mode );
void TM1650_Show_Num(unsigned char pleft , unsigned char pright );
void TM1650_IIC_8addr8data(unsigned char regaddr , unsigned char param);
void TM1650_Set_Num(unsigned char addr , unsigned char value ,unsigned char point);

#endif /* DV_TM1650_H */

dv_TM1650.c

#include “stm8l10x.h”
#include <stdio.h>

#include “dv_TM1650.h”
#include <iostm8l101f3.h>

#include “delay_user.h”

//主机拉高拉低SCL
#define IIC_SCL_HIGH GPIO_SetBits(GPIOB , GPIO_Pin_6); //SCL out1
#define IIC_SCL_LOW GPIO_ResetBits(GPIOB , GPIO_Pin_6); //SCL out0
//主机拉高拉低SDA
#define IIC_SDA_HIGH GPIO_SetBits(GPIOB , GPIO_Pin_7);
#define IIC_SDA_LOW GPIO_ResetBits(GPIOB , GPIO_Pin_7); //输出 SDA

//参数bit为1时,主机拉高SDA,非1时,主机拉低SDA
#define IIC_SDA_WR(bit) do{if(bit) GPIO_SetBits(GPIOB,GPIO_Pin_7); else GPIO_ResetBits(GPIOB,GPIO_Pin_7); }while(0);

//#define I2C_SPEED 100000 //调试通过
unsigned char data; //全局变量,设置寄存器的值。

/*******************************************************************************
**函数名称:void TM1650_Init()
**功能描述:初始化TM1650的控制接口
**入口参数:
**输出:无 //调试通过
*******************************************************************************/
void TM1650_Init(void)
{
GPIO_Init(GPIOB , GPIO_Pin_6 , GPIO_Mode_Out_PP_High_Fast); // GPIO_Mode_In_FL_No_IT
GPIO_Init(GPIOB , GPIO_Pin_7 , GPIO_Mode_Out_PP_High_Fast); // SDA

IIC_SCL_HIGH; //设置PB6输出高电平
IIC_SDA_HIGH; //设置PB7输出高电平data= 0x01;   //全局变量,设置寄存器的值。
//TM1650_Set(8,8);

}

void gpio_IIC_Start(void) //发送IIC开始信号
{
IIC_SCL_HIGH;
IIC_SDA_HIGH;
delay_us(2);
IIC_SDA_LOW;
delay_us(2);
IIC_SCL_LOW;
}

void gpio_IIC_Stop(void) //发送IIC停止信号
{
IIC_SCL_LOW;
IIC_SDA_LOW;
delay_us(2);
IIC_SCL_HIGH;
delay_us(2);
IIC_SDA_HIGH;
}

void gpio_IIC_Send_Byte(char dat) //IIC主机向从机发送一个字节
{
char i;
char data_iic, data_bit;

              data_iic = dat;IIC_SCL_LOW;
for(i=0; i<8; i++){data_bit = (data_iic&0x80)>>7;IIC_SDA_WR(data_bit);data_iic = data_iic <<1;delay_us(1);IIC_SCL_HIGH;delay_us(1);IIC_SCL_LOW;delay_us(1);
}IIC_SDA_LOW;

}

char IIC_SDA_RD() //添加此函数会打乱周期,故未使用,未调试
{
char rack = 0;
GPIO_Init(GPIOB , GPIO_Pin_7 , GPIO_Mode_In_PU_No_IT); // 初始化KEY1,设置PA_3为上拉电阻输入并且禁止中断模式
delay_us(2);
rack = GPIO_ReadInputDataBit(GPIOA , GPIO_Pin_3); // 判断数据线的回复值
GPIO_Init(GPIOB , GPIO_Pin_7 , GPIO_Mode_Out_PP_Low_Fast);// 恢复SDA的输出方向
return rack;
}
char gpio_IIC_Wait_Ack(void) //IIC主机等待从机返回的ACK应答信号
{
//char ack = 0;

delay_us(1);
IIC_SCL_HIGH;
delay_us(1);IIC_SCL_LOW;//if(IIC_SDA_RD())
//  ack = 1;delay_us(2);
return 0;//ack;

}

/*******************************************************************************
**函数名称:void TM1650_IIC_8addr8data(unsigned char regaddr , unsigned char param)
**功能描述:向TM1650器件写配置数据,没有子设备地址的概念
**入口参数:
regaddr: 写的寄存器地址
param : 写的数据值
**输出:无 //调试通过
*******************************************************************************/
void TM1650_IIC_8addr8data(unsigned char regaddr , unsigned char param)
{
gpio_IIC_Start();
//gpio_IIC_Send_Byte(regaddr<<1);
gpio_IIC_Send_Byte(regaddr);
gpio_IIC_Wait_Ack();

gpio_IIC_Send_Byte(param);
gpio_IIC_Wait_Ack();
gpio_IIC_Stop();

}

/*******************************************************************************
**函数名称:void IIC_8addr8Read(unsigned char subaddr , unsigned char Byte_addr , unsigned char *buffer , unsigned short num)
**功能描述:向IIC器件读数据
**入口参数:
subaddr : 从器件地址
Byte_addr : 确定器件写地址的起始地址
*buffer : 读数据的缓冲区起始地址
num : 要读数据的个数
**输出:无
*******************************************************************************/
void IIC_8addr8Read(unsigned char subaddr , unsigned char Byte_addr , unsigned char *buffer , unsigned short num)
{

}

/*******************************************************************************
**函数名称:void TM1650_Set()
**功能描述:设置数码管显示的相关参数。
**入口参数:
light:亮度显示1~8级。8级最亮,其他数字按照4级亮度处理。
mode:7or8段显示。7是7段,8是8段,其他数字按照8段处理。
**输出:无 //调试通过
*******************************************************************************/
void TM1650_Set(unsigned char light , unsigned char mode )
{
unsigned char cmd;
cmd = 0x48; //置的固定指令

data &= 0x0F;       //先将高4位清0,//全局变量,设置寄存器的值。
switch(light){case 1:data |= 0x10; break;case 2:data |= 0x20; break;case 3:data |= 0x30; break;case 4:data |= 0x40; break;case 5:data |= 0x50; break;case 6:data |= 0x60; break;case 7:data |= 0x70; break;case 8:data |= 0x00; break;default:data |= 0x40;    break;}data &= 0xF7;       //先将data[3]清0
switch(mode){case 7:data |= 0x08;  break;case 8:data |= 0x00; break;default:data |= 0x00;    break;
}TM1650_IIC_8addr8data(cmd,data); //设置亮度和几段return;

}

/*******************************************************************************
**函数名称:void TM1650_Show_Num()
**功能描述:设置数码管显示的数值。
**入口参数:
pleft: 整数部分的数字。(0~99)
pright:小数部位的数字。(0~99)
**输出:无 //调试通过
*******************************************************************************/
void TM1650_Show_Num(unsigned char pleft , unsigned char pright )
{
unsigned char DIG1_num, DIG2_num, DIG3_num, DIG4_num;

TM1650_Set(8,8);
DIG1_num = pleft/10; //整数 十位数
TM1650_Set_Num(0x68,DIG1_num,0); //设置具体的数值
delay_ms(100);
DIG2_num = pleft%10; //整数 个位数,带小数点
TM1650_Set_Num(0x6A,DIG2_num,1);
delay_ms(100);
DIG3_num = pright/10; //小数 十位数
TM1650_Set_Num(0x6C,DIG3_num,0);
delay_ms(100);
DIG4_num = pright%10; //小数 个位数
TM1650_Set_Num(0x6E,DIG4_num,0);
delay_ms(100);

}

/*******************************************************************************
**函数名称:void TM1650_Set_Num()
**功能描述:设置数码管显示的数值。
**入口参数:
addr: 位选地址。
value:共阴极数码管显示的数字,和驱动数字不一致,需要编码转换。Byte[dp,g,f,e,d,c,b,a]
point: 是否点亮小数点
**输出:无 //调试通过
*******************************************************************************/
void TM1650_Set_Num(unsigned char addr , unsigned char value ,unsigned char point)
{
char write_num = 0x00;
char show_num[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6f}; //0~9
//共阴极的数码映射

if(value <=9)   // 0<= value &write_num = show_num[value];
elsewrite_num = 0x00;if(point)write_num |= 0x80;TM1650_IIC_8addr8data(addr,write_num);

}

附件:数据手册PDF截图(共5页)





【tm1650调试记录】相关推荐

  1. ROS上同时预览depth,IR,RGB 调试记录

    ROS上同时预览depth,IR,RGB 调试记录 用rviz同时显示RGB,IR,DEPTH(验证设备:astraprosm,canglong2,deeyea) 1.编译libuvc库 cd lib ...

  2. ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值——bug调试记录

    ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值--bug调试记录 目录 输出结果 1.增加XGBR算法 ...

  3. [Deepin - Pycharm调试记录] Pyinstaller索引系统库问题

    Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库 现象 在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示 OSError: Py ...

  4. RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案)

    RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案) 参考文章: (1)RAISR-ma ...

  5. SX1278 FSK 调试记录

    SX1278 FSK 调试记录 先挖个sx1278 FSK的坑慢慢填 手中有两个SX1278模组 是安信可的产品 采用主从模式 SPI访问 MCU是STM32F107 数据格式 说明收据接收的第一步就 ...

  6. 松下MINAS-A6伺服电机调试记录

    松下MINAS-A6伺服电机调试记录 因项目需求,进行松下MINAS-A6伺服电机调试 文章目录 松下MINAS-A6伺服电机调试记录 概述 一.手册数据 二.设备使用 1.驱动器及电机连接 2.设备 ...

  7. Xilinx AXI Crossbar相关调试记录

    Xilinx AXI Crossbar相关调试记录 本文记录在使用Xilinx AXI Crossbar IPcore现象 ** AXI Crossbar IPcore设置如下** 使用AXI Cro ...

  8. android pppd参数介绍,android 3G pppd 调试记录

    android 3G pppd 调试记录. 1.  JAVA 部分 android/development/data/etc/apns-conf_sdk.xml   --->  system/e ...

  9. RV1126 调试记录

    RV1126 调试记录 ######################################################################################## ...

最新文章

  1. 从CES Asia 2017看智能家居的发展趋势
  2. 云计算带来企业管理的革命
  3. php springboot,springboot是什么?
  4. 代码回滚:Reset、Checkout、Revert 的选择
  5. 基础加强:反射和注解
  6. HDU3507 Print Article —— 斜率优化DP
  7. Android输出签名的 SHA1 值
  8. Java.util.Date类型的转化成为数据库中的Date类型。
  9. git分支feature和hotfix分支
  10. Python内置函数sorted()高级排序用法
  11. android 3.10. 内核,编译android 3.10内核源码时出错
  12. java日历制作日期不对_在我的代码中,为什么Java日期或日历中的月份日期不同? - java...
  13. 八大机器学习框架对比及Tensorflow的优势
  14. FPGA学习记录(7)<巴特沃斯低通IIR滤波器FPGA实现>
  15. 高中信息技术html语言,高中信息技术Frontpage试题
  16. 网络电话是如何实现打到普通话机上的?
  17. 小srf的游戏 题解
  18. 这部纪录片带你重新认识中华神州大地,领略你不知道的中国
  19. Android检测手机是否安装app
  20. 【资源帖】漏洞平台(国内外)+企业SRC整理-持续更新

热门文章

  1. Android 8.0 添加HIDL
  2. JS实现鼠标中心放大图片功能原理及实例演示
  3. Linux各版本内核下载地址
  4. java 三点定位_GPS定位系统(三)——Java后端
  5. 移动、电信、联通、QQ币、游戏点卡快速秒充体验
  6. pacemaker和keepalived的区别
  7. 人脸识别之目标追踪识别
  8. freemarker字符串替换操作
  9. 巴特沃斯数字低通滤波器的设计
  10. Ubuntu拔掉挂载硬盘后一直卡在ubuntu的logo处以及windows强制关机会出现ubuntu出现系统恢复模式