当前位置:   article > 正文

STM32 HAL TM1637使用

STM32 HAL TM1637使用

TM1637属于一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路。

本文主要使用MCU是STM32 ,CubeMX+Keil5进行开发,使用HAL库

简介:TM1637可以带动16个按键以及做数码管驱动

TM1637.C

  1. #include "TM1637.h"
  2. void gpio_out()
  3. {
  4. GPIO_InitTypeDef GPIO_InitStruct = {0};
  5. GPIO_InitStruct.Pin = TM1637_DIO_Pin;
  6. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  7. GPIO_InitStruct.Pull = GPIO_NOPULL;
  8. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  9. HAL_GPIO_Init(TM1637_DIO_GPIO_Port, &GPIO_InitStruct);
  10. }
  11. void gpio_in()
  12. {
  13. GPIO_InitTypeDef GPIO_InitStruct = {0};
  14. GPIO_InitStruct.Pin = TM1637_DIO_Pin;
  15. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  16. GPIO_InitStruct.Pull = GPIO_PULLUP;
  17. HAL_GPIO_Init(TM1637_DIO_GPIO_Port, &GPIO_InitStruct);
  18. }
  19. ///======================================
  20. void TM1637_I2CStart(void) //1637 开始
  21. {
  22. TM1637_CLK(1);
  23. TM1637_DIO(1);
  24. Delay_us(2);
  25. TM1637_DIO(0);
  26. }
  27. void TM1637_I2CStop(void) // 1637 停止
  28. {
  29. TM1637_CLK(0);
  30. Delay_us(2);
  31. TM1637_DIO(0);
  32. Delay_us(2);
  33. TM1637_CLK(1);
  34. Delay_us(2);
  35. TM1637_DIO(1);
  36. }
  37. void TM1637_I2Cask(void) //1637 应答
  38. {
  39. TM1637_CLK(0);
  40. Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号
  41. gpio_in();
  42. while(TM1637_DIO_State);
  43. gpio_out();
  44. TM1637_CLK(1);
  45. Delay_us(2);
  46. TM1637_CLK(0);
  47. }
  48. ///=========================================
  49. void TM1637_I2CWrByte(uint8_t oneByte) //写一个字节
  50. {
  51. uint8_t i;
  52. for(i=0;i<8;i++)
  53. {
  54. TM1637_CLK(0);
  55. if(oneByte&0x01) //低位在前
  56. {
  57. TM1637_DIO(1);
  58. }
  59. else
  60. {
  61. TM1637_DIO(0);
  62. }
  63. Delay_us(3);
  64. oneByte=oneByte>>1;
  65. TM1637_CLK(1);
  66. Delay_us(3);
  67. }
  68. }
  69. //-------------------------------------------------
  70. uint8_t ScanKey(void) //读按键
  71. {
  72. uint8_t rekey = 0,i=0;
  73. TM1637_I2CStart();
  74. TM1637_I2CWrByte(0x42); //读按键命令
  75. TM1637_I2Cask();
  76. TM1637_DIO(1); // 在读按键前拉高数据线
  77. gpio_in();
  78. for(i=0;i<8;i++) //从低位开始读
  79. {
  80. TM1637_CLK(0);
  81. rekey=rekey>>1;
  82. Delay_us(30);
  83. TM1637_CLK(1);
  84. if(TM1637_DIO_State)
  85. {
  86. rekey=rekey|0x80;
  87. }
  88. else
  89. {
  90. rekey=rekey|0x00;
  91. }
  92. Delay_us(30);
  93. }
  94. gpio_out();
  95. TM1637_I2Cask();
  96. TM1637_I2CStop();
  97. return (rekey);
  98. }
  99. //================================================
  100. void SmgDisplay(uint8_t add, uint8_t data, uint8_t brightness) //写显示寄存器
  101. {
  102. TM1637_I2CStart();
  103. TM1637_I2CWrByte(0x44); // 40H 地址自动加 1 模式,44H 固定地址模式
  104. TM1637_I2Cask();
  105. TM1637_I2CStop();
  106. TM1637_I2CStart();
  107. TM1637_I2CWrByte(add); //设置首地址,
  108. TM1637_I2Cask();
  109. TM1637_I2CWrByte(data); //送数据
  110. TM1637_I2Cask();
  111. TM1637_I2CStop();
  112. TM1637_I2CStart();
  113. TM1637_I2CWrByte(brightness); //开显示 ,设置亮度
  114. TM1637_I2Cask();
  115. TM1637_I2CStop();
  116. }
  117. //===========end==================================

TM1637.h

  1. #ifndef __TM1637_H__
  2. #define __TM1637_H__
  3. #include "Delay.h"
  4. #include "main.h"
  5. /*定义端口*/
  6. #define TM1637_CLK(x) do{ x ? \
  7. HAL_GPIO_WritePin(TM1637_CLK_GPIO_Port, TM1637_CLK_Pin, GPIO_PIN_SET) : \
  8. HAL_GPIO_WritePin(TM1637_CLK_GPIO_Port, TM1637_CLK_Pin, GPIO_PIN_RESET); \
  9. }while(0)
  10. #define TM1637_DIO(x) do{ x ? \
  11. HAL_GPIO_WritePin(TM1637_DIO_GPIO_Port, TM1637_DIO_Pin, GPIO_PIN_SET) : \
  12. HAL_GPIO_WritePin(TM1637_DIO_GPIO_Port, TM1637_DIO_Pin, GPIO_PIN_RESET); \
  13. }while(0)
  14. #define TM1637_DIO_State HAL_GPIO_ReadPin(TM1637_DIO_GPIO_Port, TM1637_DIO_Pin)
  15. /*外部接口函数*/
  16. void SmgDisplay(uint8_t add, uint8_t data, uint8_t brightness); //写显示寄存器
  17. #endif /* __TM1637_H__ */

        注意:TM1637在进行读写时需要应该应答信号反馈,当没有应答时容易则一直while循环,这是一个弊端。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/578082
推荐阅读
相关标签
  

闽ICP备14008679号