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

【经验分享】STM32或GD32驱动TM1637

[复制链接]
STMCU小助手 发布时间:2022-4-20 20:40
一、TM1637介绍
TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于电磁炉、微波炉及小家电产品的显示屏驱动。采用DIP/SOP20的封装形式。
功能特点:
   采用功率CMOS 工艺
   显示模式(8 段×6 位),支持共阳数码管输出
   键扫描(8×2bit),增强型抗干扰按键识别电路
   辉度调节电路(占空比 8 级可调)
   两线串行接口(CLK,DIO)  振荡方式:内置RC 振荡
   内置上电复位电路
   内置自动消隐电路
   封装形式:DIP20/SOP20
二、时序介绍

$EX7KA)6U0P11OYC_M@IY`U.png
PIX0(BP@`BMW7G(8DBEF3VV.png

三、寄存器介绍

20210616151702141.png

四、驱动程序
main.c

  1. #include "sys.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "led.h"
  5. #include "tm1637.h"
  6. #include "string.h"

  7. int main(void)
  8. {
  9. u8 sendData[6];
  10. Cache_Enable();                                        //打开L1-Cache
  11. HAL_Init();                                                //初始化HAL库
  12. Stm32_Clock_Init(160,5,2,4);        //设置时钟,400Mhz
  13. delay_init(400);                                //延时初始化
  14. uart_init(115200);                                //串口初始化
  15. led_init();                                                //初始化LED时钟
  16. tm1637_init();
  17. while(1)
  18. {

  19.         turn_g_led();
  20.         memset(sendData,0xff,sizeof(sendData));
  21.         tm1637_show_data(sendData,sizeof(sendData));
  22.         delay_ms(500);

  23.         turn_g_led();
  24.         memset(sendData,0x00,sizeof(sendData));
  25.         tm1637_show_data(sendData,sizeof(sendData));
  26.         delay_ms(500);
  27.         printf("key=0x%02x\r\n",tm1637_read_key());
  28. }
  29. }
复制代码

tm1637.c

  1. #include "tm1637.h"
  2. #include "delay.h"

  3. void tm1637_init(void)
  4. {
  5. GPIO_InitTypeDef GPIO_Initure;
  6. __HAL_RCC_GPIOC_CLK_ENABLE();                                        //开启GPIOB时钟

  7. GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8;                        //PB0,1
  8. GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;                  //推挽输出
  9. GPIO_Initure.Pull=GPIO_PULLUP;                                 //上拉
  10. GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;          //高速
  11. HAL_GPIO_Init(GPIOC,&GPIO_Initure);                     //初始化GPIOB.0和GPIOB.1

  12. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);        //PB0置0
  13. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);        //PB1置1


  14. GPIO_Initure.Pin=GPIO_PIN_6;            //PA0
  15. GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
  16. GPIO_Initure.Pull=GPIO_PULLUP;        //上拉
  17. GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;     //高速
  18. HAL_GPIO_Init(GPIOC,&GPIO_Initure);
  19. }

  20. //产生IIC起始信号
  21. void tm1637_start(void)
  22. {
  23. DIO_OUT();     //sda线输出
  24. led_dio(1);
  25. led_clk(1);
  26. delay_us(4);
  27. led_dio(0);//START:when CLK is high,DATA change form high to low
  28. delay_us(4);
  29. led_clk(0);//钳住I2C总线,准备发送或接收数据
  30. }
  31. //产生IIC停止信号
  32. void tm1637_stop(void)
  33. {
  34. DIO_OUT();//sda线输出
  35. led_clk(0);
  36. led_dio(0);//STOP:when CLK is high DATA change form low to high
  37. delay_us(4);
  38. led_clk(1);
  39. led_dio(1);//发送I2C总线结束信号
  40. delay_us(4);                                                           
  41. }
  42. //等待应答信号到来
  43. //返回值:1,接收应答失败
  44. //        0,接收应答成功
  45. u8 tm1637_wait_ack(void)
  46. {
  47. u8 ucErrTime=0;
  48. DIO_IN();      //SDA设置为输入
  49. led_dio(1);delay_us(1);
  50. led_clk(1);delay_us(1);
  51. while(READ_DIO)
  52. {
  53. ucErrTime++;
  54. if(ucErrTime>250)
  55. {
  56. tm1637_stop();
  57. return 1;
  58. }
  59. }
  60. led_clk(0);//时钟输出0
  61. return 0;
  62. }
  63. //产生ACK应答
  64. void tm1637_ack(void)
  65. {
  66. led_clk(0);
  67. DIO_OUT();
  68. led_dio(0);
  69. delay_us(2);
  70. led_clk(1);
  71. delay_us(2);
  72. led_clk(0);
  73. }
  74. //不产生ACK应答
  75. void tm1637_nack(void)
  76. {
  77. led_clk(0);
  78. DIO_OUT();
  79. led_dio(1);
  80. delay_us(2);
  81. led_clk(1);
  82. delay_us(2);
  83. led_clk(0);
  84. }
  85. //IIC发送一个字节
  86. //返回从机有无应答
  87. //1,有应答
  88. //0,无应答
  89. void tm1637_send_byte(u8 txd)
  90. {
  91. u8 t;
  92. DIO_OUT();
  93. led_clk(0);//拉低时钟开始数据传输
  94. for(t=0;t>=1;
  95. delay_us(2);   //对TEA5767这三个延时都是必须的
  96. led_clk(1);
  97. delay_us(2);
  98. led_clk(0);
  99. delay_us(2);
  100. }
  101. }
  102. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  103. u8 tm1637_read_byte(unsigned char ack)
  104. {
  105. unsigned char i,receive=0;
  106. DIO_IN();//SDA设置为输入
  107. for(i=0;i
复制代码


收藏 评论0 发布时间:2022-4-20 20:40

举报

0个回答

所属标签

相似分享

官网相关资源

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