最近买了块LED数码管显示模块,板上焊接8个数码管,8个独立LED灯,8个独立按键。TM1638驱动芯片,五芯信号接口,5V供电。如下图:

        电路图如下:

商家提供的演示代码显示混乱,代码有错误,网上找到TM1638数据手册,用ARDUINO写了个驱动代码,封装成CLASS对象。提供数码管显示、秒点显示、独立LED灯显控制功能,提供显示开关功能和模块测试功能及以上功能演示代码。现将代码分享在下面。

模块文件:TM1638.C

#ifndef TM1638_H  //避免重复定义.#define TM1638_Hclass TM1638{private://在我的ESP32模块上,所有”delayMicroseconds(TM1637_DELAY_US)”(延时)语句都是可以删除的,但为了使更高主频的MCU可以适应总线速度,建议还是加上延时.#define TM1637_DELAY_US 1uint8_t STB = 17;uint8_t CLK = 16;uint8_t DIO = 4;//TM1638模块引脚定义.//LED_CODE_COUNT表示LED数码管可显示字符编码的总量.如要扩展编码字符,修改下面两行就可以了.#define LED_CODE_COUNT 19uint8_t LED_CODE[LED_CODE_COUNT]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x74,0x5C};//数字编码0~f加"-""h""o".uint8_t brightnessData=0;//亮度值.uint8_t ledData=0;//LED显存(每一个Bit位对应一只LED灯珠),默认全部熄灭.uint8_t pointData=0;//小数点显存(第一个Bit位对应一只数码管的小数点),默认全部熄灭.uint8_t displayData[8];//数码管显存.protected:void init(void){uint8_t i;pinMode(STB,OUTPUT);pinMode(CLK,OUTPUT);digitalWrite(STB,HIGH);digitalWrite(CLK,HIGH);com_Write(0x88);com_Write(0x40);digitalWrite(STB,LOW);bus_Write(0xc0);for(i=0;i<16;i++){bus_Write(0x00);}digitalWrite(STB,HIGH);}//初始化.uint8_t bus_Read(void){uint8_t i;uint8_t temp=0;pinMode(DIO,INPUT);delayMicroseconds(TM1637_DELAY_US);for(i=0;i<8;i++){temp>>=1;digitalWrite(CLK,LOW);delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK,HIGH);delayMicroseconds(TM1637_DELAY_US);if(digitalRead(DIO)==HIGH){temp|=0x80;}}return temp;}//从总线上读一个字节.void bus_Write(uint8_t Data){uint8_t i;pinMode(DIO,OUTPUT);for(i=0;i<8;i++){delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK,LOW);digitalWrite(DIO,Data&0x01);delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK,HIGH);Data>>=1;}}//向总线上写一个字节.void com_Write(uint8_t in_Com){digitalWrite(STB,LOW);delayMicroseconds(TM1637_DELAY_US);bus_Write(in_Com);delayMicroseconds(TM1637_DELAY_US);digitalWrite(STB,HIGH);}//写命令字.void add_Write(uint8_t Add,uint8_t Data){com_Write(0x44);digitalWrite(STB,LOW);bus_Write(0xc0|Add);bus_Write(Data);digitalWrite(STB,HIGH);}//指定地址写入数据.public:TM1638(void){;}TM1638(uint8_t in_STB,uint8_t in_CLK,uint8_t in_DIO){STB=in_STB;CLK=in_CLK;DIO=in_DIO;}void    begin(void){init();}void    begin(uint8_t in_STB,uint8_t in_CLK,uint8_t in_DIO){STB=in_STB;CLK=in_CLK;DIO=in_DIO;init();}void    test(void){uint8_t index=0;uint8_t count=0;uint8_t tem=0;com_Write(0x8f);for(index=0;index<16;index+=2){com_Write(0xc0);add_Write(0xc0|index,0xff);add_Write(0xc0|index+1,0xff);delay(50);}for(count=0;count<6;count++){com_Write(0x87|(count%2)<<3);delay(100);}delay(500);}//测试(用于展示LED是否可以点亮,该过程会破坏先前的显示内容).void    brightness(uint8_t in_Data){brightnessData=in_Data&0x07;com_Write(0x88|brightnessData);}//亮度设置(0~7).uint8_t brightness(void){return brightnessData;}//返回亮度设置(0~7).uint8_t key(void){uint8_t c[4],i,key_value=0;digitalWrite(STB,LOW);bus_Write(0x42);for(i=0;i<4;i++){c[i]=bus_Read();}digitalWrite(STB,HIGH);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;}//获取按键值(0~8,8表示未按键),本系统8根按键线都接在K3端口,不支持组合键.void    led(uint8_t index,boolean state){if(index>7){return;}if(state){ledData=ledData|(0x01<<index);}else{ledData=ledData&(~(0x01<<index));}add_Write(2*index+1,state);}//控制指定的LED亮/灭状态.void    led(uint8_t in_ledData){uint8_t i;ledData=in_ledData;for(i=0;i<8;i++){if(ledData&(0x01<<i)){add_Write(2*i+1,1);}else{add_Write(2*i+1,0);}}}//以一个字节数据控制8个LED灯珠,参数的每一位控制一个LED灯珠的亮/灭状态.uint8_t led(void){return ledData;}//返回一个字节的数据,其每个Bit位表示相应LED的亮/灭状态.void    point(uint8_t index,boolean state){if(index>=8){return;}if(state){pointData=pointData|(0x01<<index);add_Write(2*index,LED_CODE[displayData[index]]|0x80);}else{pointData=pointData&(~(0x01<<index));add_Write(2*index,LED_CODE[displayData[index]]&0x7f);}}//改变指定LED数码管小数点状态.void    point(uint8_t in_pointData){uint8_t i;pointData=in_pointData;for(i=0;i<8;i++){if(pointData&(0x01<<i)){add_Write(2*i,LED_CODE[displayData[i]]|0x80);}else{add_Write(2*i,LED_CODE[displayData[i]]&0x7f);}}}//设置所有小数点的亮/灭,参数的每一个Bit位对应一个数码管的小数点.uint8_t point(void){return pointData;}//以单字节数据返回小数点显示状态.每个位对应一个小数点.void    display(uint8_t index,int in_Data){uint8_t Data;Data=uint8_t(in_Data);if(index>=8||in_Data>=LED_CODE_COUNT){return;}if(in_Data<0){add_Write(2*index,0x00);return;}displayData[index]=Data;if(pointData&(0x01<<index)){add_Write(2*index,LED_CODE[displayData[index]]|0x80);}else{add_Write(2*index,LED_CODE[displayData[index]]&0x7f);}}//指定数码管显示数据,负数参数表示熄灭.uint8_t display(uint8_t index){if(index>=8){return 0;}return displayData[index];}//返回指定LED数码管的十六进制值(含小数点).void    close(){com_Write(0x80);}//关闭显示.void    open(){com_Write(0x88|brightnessData);}//打开显示.};
#endif

演示代码:TM1638.INO

#include "TM1638.C"
TM1638 tm1638;
void setup ()
{Serial.begin(115200);tm1638.begin(14,26,32);//引脚设置.}
void loop(){uint8_t Tem;uint32_t timeval;Tem=tm1638.key();if(Tem<8){tm1638.led(Tem,true);//点亮与按键对应的LED.tm1638.display(0,Tem);//显示键号.}else{tm1638.led(0);//熄灭全部LED.tm1638.display(0,-1);//熄灭键号显示数码管(表示按键释放).}timeval=millis();Tem=timeval%1000;//启动计时的秒数.for(uint8_t i=7;i>4;i--){tm1638.display(i,Tem%10);Tem=Tem/10;}timeval=timeval/1000;Tem=timeval%60;//启动计时的秒数.tm1638.display(4,Tem%10);tm1638.point(4,true);tm1638.display(3,Tem/10);tm1638.display(2,16);//显示横线.timeval=timeval/60;Tem=timeval%60;//启动计时的分数.tm1638.display(1,Tem%10);
}

本人使用ESP32连接本模块,烧写程序(注意通信线引脚设置)后,ESP32重启,会看到测试效果,按不同按键,对应LED会亮起,数码管会显示对应按键的键值。

TM1638 LED数码显示模块ARDUINO驱动代码相关推荐

  1. 【雕爷学编程】Arduino动手做(47)---七段LED数码管模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  2. led数码显示控制plc实验_一种LED数码显示的PLC控制程序及方法与流程

    本发明涉及程序控制技术领域,特别是一种简单高效.安全可靠.逻辑性强.响应时间短的一种LED数码显示的PLC控制程序及方法. 背景技术: LED数码显示管可以显示数字或字母,通常也用来显示时间.速度.系 ...

  3. PLC实验:LED 数码显示控制

    实验项目名称:LED 数码显示控制 一.实验控制要求 置位启动开关 K0 为 ON 时,LED 数码显示管依次循环显示 0.1.2.3-9.A.B.C- F: 二.端口分配 三.实验程序梯形图 PLC ...

  4. led数码显示控制plc实验_实验三 LED数码显示控制 PLC实验报告

    广州大学学生实验报告 开课学院及实验室:工程北 529 2015 年 5 月 28 日 学院 机械与电气 工程 年级. 专 业.班 姓名 学号 实验课程名称 电气控制与可编程控制器 成绩 实验项目名称 ...

  5. led数码显示控制plc实验_实验三led数码显示控制plc实验报告

    开课学院及实验室:工程北 529 2015 年 5 月 28 日 学院 机械与电气 工程 年级. 专 业.班 姓名 学号 实验课程名称 电气控制与可编程控制器 成绩 实验项目名称 实验三 LED 数码 ...

  6. led数码显示控制plc实验_实验三LED数码显示控制PLC实验报告.doc

    实验三LED数码显示控制PLC实验报告 广州大学学生实验报告 开课学院及实验室:工程北529 2015年 5 月28 日 学院机械与电气工程年级.专业.班姓名学号实验课程名称 电气控制与可编程控制器成 ...

  7. 利用4位led显示本机秒表时间的单片机c语言程序,基于单片机的一个2位的led数码显示作为_秒表_设计.doc...

    基于单片机的一个2位的led数码显示作为_秒表_设计 PAGE 1 PAGE 29 工程技术学院 课程设计 题 目:用单片机AT89C51设计一个2位的LED数码显示作为"秒表" ...

  8. at89s51数码管秒表c语言程序,基于AT89C51单片机的一个2位的LED数码显示作为“秒表”设计【基于单片机系统的00-99s的定时器】...

    基于AT89C51单片机的一个2位的LED数码显示作为"秒表"设计[基于单片机系统的00-99s的定时器] 工程技术学院 课程设计 题 目:用单片机AT89C51设计一个2位的LE ...

  9. Arduino 学习笔记 | 单片机控制驱动MAX7219 8*8 LED点阵显示模块

    第一部分 8 x 8点阵模块 不带MAX7219驱动的8×8 點矩陣LED(如下图),从左侧有写字的一侧开始,L接正电,C接负电. 列L (1.2.3.4.5.6.7.8) 行C(1.2.3.4.5. ...

最新文章

  1. spring中的JdbcTemplate——JdbcTemplate的最基本用法
  2. 【采用】风控模型评估方法以及大数据风控模型概念
  3. P4068 [SDOI2016]数字配对
  4. Bigtable 论文翻译
  5. selenium使用js进行点击
  6. mysql自增字段_MySQL自增字段的常用语句
  7. ASP.NET版在线客服系统源码 带服务端
  8. php 取出多重数组中的一列_PHP提取多维数组指定一列的方法大全
  9. Day5 - 前端高频面试题之计算机网络相关
  10. QLable——标签
  11. Go游戏框架初探《一》
  12. Zabbix 安装教程
  13. php网站登录界面验证码打不开,php网站无法显示验证码
  14. SD内存卡禁止写入只读怎么办?另类SPI模式修复坏卡
  15. 丐帮 beggar gangs
  16. 使用流报错:stream has already been operated upon or closed
  17. stroj uplink
  18. 如何截取音频片段并制作成手机铃声
  19. wget通过代理下载之错误解决1(Proxy tunneling failed: Forwarding failureUnable to establish SSL connection.)
  20. 电脑wifi网络连接,可以上QQ和微信但是无法浏览器无法使用解决方法

热门文章

  1. php 代替each()函数写法
  2. Surface Go无法访问windows store的解决心得
  3. js实现全屏与退出全屏,解决F11进入全屏后退出全屏API方法失效(chrome)
  4. 大数据量查询视图应用
  5. IOS下载资源zip到本地然后读取
  6. 【知识点】单片机USB转TTL模块的相关知识
  7. WPF基础系列二:控件简介
  8. 文章摘要生成(Summarizing Text with Amazon Reviews)
  9. 迭代决策树GBDT(MART)【理论】
  10. 【Pandas入门教程】如何读取和写入表格数据