你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动TM1652代码分享

[复制链接]
STMCU小助手 发布时间:2022-4-24 17:00
一、简介
TM1652 是一款LED(发光二极管、数码管、点阵屏)驱动控制专用芯片,内部集成了数字通讯电路、
解码电路、数据锁存器、震荡器、LED驱动电路。通讯方式采用异步串口通信(UART)协议,因芯片只
接收单片机发来的数据,仅需要单片机的一个TX端口发送数据给芯片即可,实现单线通讯;在显示驱动
方面,芯片采用动态扫描方式,两种显示模式可选,8级段驱动电流可调,16级位占空比可调;TM1652
内置消隐处理优化电路
二、驱动方式
本芯片采用异步串口通信(UART)协议,工作原理是将传输数据的每个字符以串行方式一位接一位
的传输。下图给出了其工作模式:
TM1652 每一位的时间为:52us。
其中每一位(bit)的意义如下:
▲起始位:为由高变低,低电平时间为一位的时间,表示传输字符的开始。
▲数据位:紧跟起始位之后,D0-D7,低位先发。
▲校验位:为一位的时间,如果 8 位数据位中 1 的个数为奇数,该位设为 0(置低电平),否则为 1(置
高电平)。
▲停止位:置高。时间为一位的时间,它是发送完一个字符数据的结束标志。
▲空闲位:置高。如果空闲位置高的时间大于 3ms,TM1652 就认为本次数据帧结束,本次数据从暂存器
打入相应寄存器开始控制芯片输出。如果一帧数据传输没有结束,那么建议设置空闲位时间范围在
0-0.5ms 以内。
TM1652 的一帧数据包括以下两种形式:
⑴ 显示地址命令+显示数据;
⑵ 显示控制命令+显示控制调节命令。
波特率:是衡量数据传输速率的指针。表示为每秒钟传送的二进制位数(bit 数)。例如资料传送速率
为 120 字符/秒,而每一个字符为 11 位,则其传送的波特率为 11×120=1320 bit/秒=1320
波特。TM1652 支持波特率范围为:17500bps~21200bps,这里我们建议用 19200bps 即每位的时间为:1s(秒)/19200≈52us(微秒)。所以 TM1652 支持的每位的时间范围为:47us~57us。
在用 IO 模拟 UART 通讯时候,SDA 数据的位宽应该满足提供的位宽范围。

三、驱动源码

  1. #include "tm1652.h"
  2.         

  3. void tm1652_init()
  4. {
  5.         GPIO_InitTypeDef  GPIO_InitStructure;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                 
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  10.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                       
  11.         GPIO_SetBits(GPIOB,GPIO_Pin_10);        

  12. }

  13. void tm1652_send_data(u8 sdat)
  14. {
  15.         unsigned char i=0, sfalg=0;
  16.         
  17.         //起始位
  18.         TX=1;   TX=0;   delay_us(52);    //保持52us
  19.         
  20.    //发送8位数据
  21.         for(i=0; i<8; i++)
  22.         {
  23.                 if(sdat & 0x01)
  24.                 {
  25.                         TX=1;
  26.                         sfalg++;
  27.                 }else
  28.                 {
  29.                         TX=0;
  30.                 }
  31.                 delay_us(52);
  32.                 sdat >>=1;
  33.         }

  34.         //校验位,按照发送数据中1的个数来判断
  35.         if(sfalg%2==0)                                 
  36.         {
  37.                 TX=1;
  38.         }
  39.         else                                
  40.         {
  41.                 TX=0;
  42.         }
  43.         delay_us(52);
  44.         
  45.         //停止位
  46.         TX=1;  delay_us(52);   
  47. }
复制代码

main.c

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "tm1652.h"


  6.                 tm1652_send_data(0x08);
  7.                 tm1652_send_data(0xff);
  8.                 tm1652_send_data(0xff);
  9.                 tm1652_send_data(0xff);
  10.                 tm1652_send_data(0x00);
  11.                 tm1652_send_data(0x00);
  12.                 tm1652_send_data(0x00);
  13.                 tm1652_send_data(0x18);
  14.                 tm1652_send_data(0x4f);
  15.                 turn_green_led();
  16.                 delay_ms(1000);
复制代码



收藏 评论0 发布时间:2022-4-24 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版