【雕爷学编程】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)实验场景图
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性