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

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参考开源代码

 

 

复制代码
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百零二: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块

1、安装库:IDE-工具-管理库-搜索TM1638plus-安装

2、项目:TM1638模块的演示文件库(LED和键)

3、接脚:

VCC  → 5V

GND → GND

STROBE_TM  D4

CLOCK_TM  D6

DIO_TM    D7

*/



#include <TM1638plus.h>

// GPIO I/O pins on the Arduino connected to strobe, clock, data,

//pick on any I/O you want.

#define  STROBE_TM 4

#define  CLOCK_TM 6

#define  DIO_TM 7

//Constructor object

TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM);

void setup() {

  // Test 0 reset test

  tm.setLED(0, 1);

  delay(1000);

  tm.reset();

  

  // Test 1  Brightness and reset

  for (uint8_t brightness = 0; brightness < 8; brightness++)

  {

      tm.brightness(brightness);

      tm.displayText("00000000");

      delay(1500);

  }

  tm.reset();

  

  // restore default brightness

  tm.brightness(0x02);

  

  //Test 2 ASCII display 2.348

  

  tm.displayASCIIwDot(0, '2');

  tm.displayASCII(1, '3');

  tm.displayASCII(2, '4');

  tm.displayASCII(3, '8');

  delay(2000);

  

  //TEST 3 single segment

  //In this case  segment g (middle dash) of digit position 7

  tm.display7Seg(7,0b01000000);

  delay(2000);

  

  // Test 4 Hex digits.

  tm.displayHex(0, 1);

  tm.displayHex(1, 2);

  tm.displayHex(2, 3);

  tm.displayHex(3, 4);

  tm.displayHex(4, 5);

  tm.displayHex(5, 6);

  tm.displayHex(6, 7);

  tm.displayHex(7, 8);

  delay(2000);

  tm.displayHex(0, 8);

  tm.displayHex(1, 9);

  tm.displayHex(2, 10);

  tm.displayHex(3, 11);

  tm.displayHex(4, 12);

  tm.displayHex(5, 13);

  tm.displayHex(6, 14);

  tm.displayHex(7, 15);

  delay(2000);

  // Test 5 TEXT  with dec point

  // abcdefgh with decimal point for c and d

  tm.displayText("abc.d.efgh");

  delay(3000);

  

  // Test6  TEXT + ASCII combo

  // ADC=2.548

  char text1[]= "ADC=.";

  tm.displayText(text1);

  tm.displayASCIIwDot(4, '2');

  tm.displayASCII(5, '5');

  tm.displayASCII(6, '4');

  tm.displayASCII(7, '8');

  delay(2000);

  

  //Test 7 buttons and LED test

  tm.displayText("EAGLER8 ");

}

void loop() {

  uint8_t buttons = tm.readButtons();

  doLEDs(buttons);

}

// scans the individual bits of value

void doLEDs(uint8_t value) {

  for (uint8_t position = 0; position < 8; position++) {

  tm.setLED(position, value & 1);

  value = value >> 1;

  }

}
复制代码

(2)实验场景图

 

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

(1)Arduino参考开源代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/*
 
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 
实验一百零二: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
 
1、安装库:IDE-工具-管理库-搜索TM1638-安装
 
2、项目:自锁LED,按键计数器
 
3、接脚:
 
VCC  → 5V
 
GND → GND
 
STROBE_TM  D4
 
CLOCK_TM  D6
 
DIO_TM    D7
 
 
 
*/
 
#define    DATA_COMMAND    0X40
 
#define    DISP_COMMAND    0x80
 
#define    ADDR_COMMAND    0XC0
 
//TM1638模块引脚定义
 
int DIO = 7;
 
int CLK = 6;
 
int STB = 4; //这里定义了那三个脚
 
//共阴数码管显示代码
 
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
 
                  0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
 
unsigned char num[8];        //各个数码管显示的值             
 
void setup ()
 
{
 
  pinMode(STB,OUTPUT);
 
  pinMode(CLK,OUTPUT);
 
  pinMode(DIO,OUTPUT); //让三个脚都是输出状态
 
}
 
void loop()
 
  {
 
    unsigned char i;
 
    init_TM1638();                      //初始化TM1638
 
    for(i=0;i<8;i++)
 
    Write_DATA(i<<1,tab[0]);              //初始化寄存器   
 
    while(1)
 
    {
 
        i=Read_key();                  //读按键值
 
        if(i<8)
 
        {
 
          num++;
 
          while(i==Read_key());              //等待按键释放
 
          if(num>15)
 
          num=0;
 
          Write_DATA(i*2,tab[num]);
 
          Write_allLED(1<<i);
 
        }
 
    }
 
}
 
void TM1638_Write(unsigned char    DATA)            //写数据函数
 
{
 
    unsigned char i;
 
      pinMode(DIO,OUTPUT);
 
    for(i=0;i<8;i++)
 
    {
 
        digitalWrite(CLK,LOW);
 
        if(DATA&0X01)
 
          digitalWrite(DIO,HIGH);
 
        else
 
          digitalWrite(DIO,LOW);
 
        DATA>>=1;
 
        digitalWrite(CLK,HIGH);
 
    }
 
}
 
unsigned char TM1638_Read(void)                    //读数据函数
 
{
 
    unsigned char i;
 
    unsigned char temp=0;;   
 
      pinMode(DIO,INPUT);//设置为输入
 
    for(i=0;i<8;i++)
 
    {
 
          temp>>=1;
 
        digitalWrite(CLK,LOW);
 
          if(digitalRead(DIO)==HIGH)
 
          temp|=0x80;
 
        digitalWrite(CLK,HIGH);
 
           
 
    }
 
    return temp;
 
}
 
void Write_COM(unsigned char cmd)        //发送命令字
 
{
 
      digitalWrite(STB,LOW);
 
    TM1638_Write(cmd);
 
      digitalWrite(STB,HIGH);
 
}
 
unsigned char Read_key(void)
 
{
 
    unsigned char c[4],i,key_value=0;
 
      digitalWrite(STB,LOW);
 
    TM1638_Write(0x42);                //读键扫数据 命令
 
    for(i=0;i<4;i++)       
 
      {
 
        c=TM1638_Read();
 
      }
 
      digitalWrite(STB,HIGH);                            //4个字节数据合成一个字节
 
    for(i=0;i<4;i++)
 
    {
 
        key_value|=c<<i;
 
      }   
 
      for(i=0;i<8;i++)
 
      {
 
        if((0x01<<i)==key_value)
 
        break;
 
      }
 
    return i;
 
}
 
void Write_DATA(unsigned char add,unsigned char DATA)        //指定地址写入数据
 
{
 
    Write_COM(0x44);
 
      digitalWrite(STB,LOW);
 
    TM1638_Write(0xc0|add);
 
    TM1638_Write(DATA);
 
      digitalWrite(STB,HIGH);
 
}
 
void Write_allLED(unsigned char LED_flag)                    //控制全部LED函数,LED_flag表示各个LED状态
 
{
 
    unsigned char i;
 
    for(i=0;i<8;i++)
 
    {
 
        if(LED_flag&(1<<i))
 
        Write_DATA(2*i+1,1);
 
        else
 
        Write_DATA(2*i+1,0);
 
      }
 
}
 
//TM1638初始化函数
 
void init_TM1638(void)
 
{
 
    unsigned char i;
 
    Write_COM(0x8b);    //亮度 (0x88-0x8f)8级亮度可调
 
    Write_COM(0x40);    //采用地址自动加1
 
      digitalWrite(STB,LOW);                //
 
    TM1638_Write(0xc0);  //设置起始地址
 
    for(i=0;i<16;i++)      //传送16个字节的数据
 
      TM1638_Write(0x00);
 
      digitalWrite(STB,HIGH);
 
}

  (2)实验场景图

 

posted @   行者花雕  阅读(875)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示