Arduino应用相对于单片机开发人员来讲并不陌生,现在许多MCU厂商设计开发板都会预留相对应的Arduino接口,管脚分布非常规范。适合Arduino应用开发有许多芯片型号,可以从Arduino IDE中可查询,本次讲解是以ATMEGA328P做为Arduino UNO主控,通过杜邦线与TM1638按键控制数码管显示模块进行通讯。
关于ATMEGA328P型与Arduino UNO端口引脚对应图见如下:
在使用该开发板前,我们当然得先安装arduino-ide,这里笔者安装的版本如下:
TM1638模块带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调、家庭影院等产品的高段位显示屏驱动。
TM1638模块特性如下:
采用功率CMOS 工艺
显示模式 10 段×8 位
键扫描(8×3bit)
辉度调节电路(占空比8 级可调)
串行接口(CLK,STB,DIO)
振荡方式:RC 振荡(450KHz+5%)
内置上电复位电路
采用SOP28封装
TM1638模块集成以下资源:
①、8个按键开关
②、8颗LED指示灯
③、8位数码管(共阴极LED数码管)
④、外部通讯扩展接口
TM1638模块的电路原理图如下:
启动Arduino IDE后需要在“工具”菜单栏下的“开发板管理器”中搜索“TM1638plus”,并点击安装。连接Arduino UNO开发板,选择“Arduino Uno”,并选择对应的串口。
编写Arduino驱动TM1638模块的程序,实现LED自锁,按键计数。Arduino UNO与TM1638模块的连线关系如下:
Arduino UNO | TM1638模块 |
5V | VCC |
GND | GND |
4 | STB |
6 | CLK |
7 | DIO |
编写Arduino程序如下:
#include <TM1638plus.h> #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; unsigned char num; init_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[i]=TM1638_Read(); } digitalWrite(STB,HIGH); //4个字节数据合成一个字节 for(i=0;i<4;i++) { key_value|=c[i]<<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); }
程序下载到Arduino NUO开发板中,然后通过TM1638模块上的按键进行操作,可成功点亮各数码管。
分享到最后,提供一下关于本次成功驱动TM1638模块Arduino源码与参考资料。
Arduino_URO端口与AtMega328p引脚对应图.doc