原创 【雕爷学编程】Arduino动手做(102)---TM1638按键数码管

2022-6-5 11:39 1494 7 7 分类: MCU/ 嵌入式 文集: 雕爷学编程

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百零二:TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块

TM1638
是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动、键盘扫描等电路。本模块质量可靠、稳定性好、抗干扰能力强。主要应用于冰箱、空调 、家庭影院等产品的高段位显示屏驱动。

TM1638
1、采用CMOS 工艺
2、显示模式 10段×8 位
3、键扫描(8×3bit)
4、辉度调节电路(占空比8 级可调)
5、串行接口(CLK,STB,DIO)
6、振荡方式:RC 振荡
7、内置上电复位电路
8、封装形式:SOP28

模块功能介绍,包括以下资源:

1、8个按键,

2、8个LED

3、8位数码管,共阴极LED数码管;

4、可以和STC等单片机直接连接;

5、开始实验ardiuno驱动程序

模块电原理图

该模块所用芯片为TM1638,集合了单片机常见外围电路,最大特点是只需占用单片机三个IO口即可驱动,扫描显示和按键扫描不需要单片机干预,只需要读写相关寄存器送显示数据或检测按键,节省MCU资源。试想下,我们平时使用单片机外接8个LED,8位数码管,8个按键这需占用多少个IO口,远不止3个IO口吧,但用这个模块就可以实现。经实际应用,按键灵敏显示效果良好。

接线方法:
VCC GND接5V电源, STB CLK DIO接单片机IO口。


实验程序一:TM1638模块的演示文件库(LED和键)

(1)Arduino参考开源代码

  1. /*
  2. 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3. 实验一百零二: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
  4. 1、安装库:IDE-工具-管理库-搜索TM1638plus-安装
  5. 2、项目:TM1638模块的演示文件库(LED和键)
  6. 3、接脚:
  7. VCC → 5V
  8. GND → GND
  9. STROBE_TM D4
  10. CLOCK_TM D6
  11. DIO_TM D7
  12. */
  13. #include <TM1638plus.h>
  14. // GPIO I/O pins on the Arduino connected to strobe, clock, data,
  15. //pick on any I/O you want.
  16. #define STROBE_TM 4
  17. #define CLOCK_TM 6
  18. #define DIO_TM 7
  19. //Constructor object
  20. TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM);
  21. void setup() {
  22. // Test 0 reset test
  23. tm.setLED(0, 1);
  24. delay(1000);
  25. tm.reset();
  26. // Test 1 Brightness and reset
  27. for (uint8_t brightness = 0; brightness < 8; brightness++)
  28. {
  29. tm.brightness(brightness);
  30. tm.displayText("00000000");
  31. delay(1500);
  32. }
  33. tm.reset();
  34. // restore default brightness
  35. tm.brightness(0x02);
  36. //Test 2 ASCII display 2.348
  37. tm.displayASCIIwDot(0, '2');
  38. tm.displayASCII(1, '3');
  39. tm.displayASCII(2, '4');
  40. tm.displayASCII(3, '8');
  41. delay(2000);
  42. //TEST 3 single segment
  43. //In this case segment g (middle dash) of digit position 7
  44. tm.display7Seg(7,0b01000000);
  45. delay(2000);
  46. // Test 4 Hex digits.
  47. tm.displayHex(0, 1);
  48. tm.displayHex(1, 2);
  49. tm.displayHex(2, 3);
  50. tm.displayHex(3, 4);
  51. tm.displayHex(4, 5);
  52. tm.displayHex(5, 6);
  53. tm.displayHex(6, 7);
  54. tm.displayHex(7, 8);
  55. delay(2000);
  56. tm.displayHex(0, 8);
  57. tm.displayHex(1, 9);
  58. tm.displayHex(2, 10);
  59. tm.displayHex(3, 11);
  60. tm.displayHex(4, 12);
  61. tm.displayHex(5, 13);
  62. tm.displayHex(6, 14);
  63. tm.displayHex(7, 15);
  64. delay(2000);
  65. // Test 5 TEXT with dec point
  66. // abcdefgh with decimal point for c and d
  67. tm.displayText("abc.d.efgh");
  68. delay(3000);
  69. // Test6 TEXT + ASCII combo
  70. // ADC=2.548
  71. char text1[]= "ADC=.";
  72. tm.displayText(text1);
  73. tm.displayASCIIwDot(4, '2');
  74. tm.displayASCII(5, '5');
  75. tm.displayASCII(6, '4');
  76. tm.displayASCII(7, '8');
  77. delay(2000);
  78. //Test 7 buttons and LED test
  79. tm.displayText("EAGLER8 ");
  80. }
  81. void loop() {
  82. uint8_t buttons = tm.readButtons();
  83. doLEDs(buttons);
  84. }
  85. // scans the individual bits of value
  86. void doLEDs(uint8_t value) {
  87. for (uint8_t position = 0; position < 8; position++) {
  88. tm.setLED(position, value & 1);
  89. value = value >> 1;
  90. }
  91. }


(2)实验场景图


实验程序二:自锁LED,按键计数器

(1)Arduino参考开源代码

  1. /*
  2. 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3. 实验一百零二: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
  4. 1、安装库:IDE-工具-管理库-搜索TM1638-安装
  5. 2、项目:自锁LED,按键计数器
  6. 3、接脚:
  7. VCC → 5V
  8. GND → GND
  9. STROBE_TM D4
  10. CLOCK_TM D6
  11. DIO_TM D7
  12. */
  13. #define DATA_COMMAND 0X40
  14. #define DISP_COMMAND 0x80
  15. #define ADDR_COMMAND 0XC0
  16. //TM1638模块引脚定义
  17. int DIO = 7;
  18. int CLK = 6;
  19. int STB = 4; //这里定义了那三个脚
  20. //共阴数码管显示代码
  21. unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  22. 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  23. unsigned char num[8]; //各个数码管显示的值
  24. void setup ()
  25. {
  26. pinMode(STB,OUTPUT);
  27. pinMode(CLK,OUTPUT);
  28. pinMode(DIO,OUTPUT); //让三个脚都是输出状态
  29. }
  30. void loop()
  31. {
  32. unsigned char i;
  33. init_TM1638(); //初始化TM1638
  34. for(i=0;i<8;i++)
  35. Write_DATA(i<<1,tab[0]); //初始化寄存器
  36. while(1)
  37. {
  38. i=Read_key(); //读按键值
  39. if(i<8)
  40. {
  41. num++;
  42. while(i==Read_key()); //等待按键释放
  43. if(num>15)
  44. num=0;
  45. Write_DATA(i*2,tab[num]);
  46. Write_allLED(1<<i);
  47. }
  48. }
  49. }
  50. void TM1638_Write(unsigned char DATA) //写数据函数
  51. {
  52. unsigned char i;
  53. pinMode(DIO,OUTPUT);
  54. for(i=0;i<8;i++)
  55. {
  56. digitalWrite(CLK,LOW);
  57. if(DATA&0X01)
  58. digitalWrite(DIO,HIGH);
  59. else
  60. digitalWrite(DIO,LOW);
  61. DATA>>=1;
  62. digitalWrite(CLK,HIGH);
  63. }
  64. }
  65. unsigned char TM1638_Read(void) //读数据函数
  66. {
  67. unsigned char i;
  68. unsigned char temp=0;;
  69. pinMode(DIO,INPUT);//设置为输入
  70. for(i=0;i<8;i++)
  71. {
  72. temp>>=1;
  73. digitalWrite(CLK,LOW);
  74. if(digitalRead(DIO)==HIGH)
  75. temp|=0x80;
  76. digitalWrite(CLK,HIGH);
  77. }
  78. return temp;
  79. }
  80. void Write_COM(unsigned char cmd) //发送命令字
  81. {
  82. digitalWrite(STB,LOW);
  83. TM1638_Write(cmd);
  84. digitalWrite(STB,HIGH);
  85. }
  86. unsigned char Read_key(void)
  87. {
  88. unsigned char c[4],i,key_value=0;
  89. digitalWrite(STB,LOW);
  90. TM1638_Write(0x42); //读键扫数据 命令
  91. for(i=0;i<4;i++)
  92. {
  93. c=TM1638_Read();
  94. }
  95. digitalWrite(STB,HIGH); //4个字节数据合成一个字节
  96. for(i=0;i<4;i++)
  97. {
  98. key_value|=c<<i;
  99. }
  100. for(i=0;i<8;i++)
  101. {
  102. if((0x01<<i)==key_value)
  103. break;
  104. }
  105. return i;
  106. }
  107. void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据
  108. {
  109. Write_COM(0x44);
  110. digitalWrite(STB,LOW);
  111. TM1638_Write(0xc0|add);
  112. TM1638_Write(DATA);
  113. digitalWrite(STB,HIGH);
  114. }
  115. void Write_allLED(unsigned char LED_flag) //控制全部LED函数,LED_flag表示各个LED状态
  116. {
  117. unsigned char i;
  118. for(i=0;i<8;i++)
  119. {
  120. if(LED_flag&(1<<i))
  121. Write_DATA(2*i+1,1);
  122. else
  123. Write_DATA(2*i+1,0);
  124. }
  125. }
  126. //TM1638初始化函数
  127. void init_TM1638(void)
  128. {
  129. unsigned char i;
  130. Write_COM(0x8b); //亮度 (0x88-0x8f)8级亮度可调
  131. Write_COM(0x40); //采用地址自动加1
  132. digitalWrite(STB,LOW); //
  133. TM1638_Write(0xc0); //设置起始地址
  134. for(i=0;i<16;i++) //传送16个字节的数据
  135. TM1638_Write(0x00);
  136. digitalWrite(STB,HIGH);
  137. }

(2)实验场景图


作者: 雕爷学编程, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3894459.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条