首页 » 互联网 » Arduino情形运用TM1638扩展版_函数_数据

Arduino情形运用TM1638扩展版_函数_数据

神尊大人 2024-09-21 15:39:58 0

扫一扫用手机浏览

文章目录 [+]

本文通过大略示例先容Arduino环境中利用ESP32开拓板驱动TM1638的方法。
个中也包含作者本人踩过的坑,希望可以对读者有些帮助。

连接UNO D1 R32和TM1638扩展板

下图的连法不是必须,只是后续程序的根本,由于拍照角度,笔墨和端口位置轻微有些偏差,实际的接法往后面的连接表为准。

Arduino情形运用TM1638扩展版_函数_数据 Arduino情形运用TM1638扩展版_函数_数据 互联网

连接表

Arduino情形运用TM1638扩展版_函数_数据 Arduino情形运用TM1638扩展版_函数_数据 互联网
(图片来自网络侵删)

Arduino D1 R32TM1638 Led Key Board3V3VCCGNDGNDIO16STBIO17CLKIO25DIO

代码解释

首先定义利用的每个引脚。
如果读者希望利用其他的引脚,只要代码中的定义和前面的接续办法同等即可。

const int strobe = 16;const int clk = 17;const int dio = 25;

从连接办法该当可以看出,数据线只有一根,也便是说所有的数据都因此串行办法传送的。
第一段代码便是以串行办法写入数据的函数,内容便是从低位开始的移位和输出操作。

void writeByte(int value) //write a byte.{ unsigned char i; pinMode(dio,OUTPUT); for(i=0;i<8;i++) { digitalWrite(clk,LOW); if(value&0X01){ digitalWrite(dio,HIGH); } else{ digitalWrite(dio,LOW); } value>>=1; digitalWrite(clk,HIGH); } digitalWrite(clk,LOW);}

发送命令的函数便是在发送数据操作的前后有增加了strobe真个掌握。

void sendCommand(uint8_t value){ digitalWrite(strobe, LOW); writeByte(value); digitalWrite(strobe, HIGH);}

初始化TM1638。
首先发送两个命令:一个是设天命码管和LED的亮度;另一个是设定地址自动增加模式,这样可以简化连续/接管数据时的操作。
末了TM1638的所有寄存器。

void reset(){ sendCommand(0x8b); //set light,0x88-0x8f sendCommand(0x40); // set auto increment mode digitalWrite(strobe, LOW); writeByte(0xc0); // set starting address to 0 for(uint8_t i = 0; i < 16; i++) { writeByte(0x00); } digitalWrite(strobe, HIGH);}

接下来是数据读入函数,内容是从DIO端口按位接管数据并合成为一个字节。

int readByte(void) //read a byte.{ unsigned char i; int value=0;; pinMode(dio,INPUT);//set input mode. for(i=0;i<8;i++) { value>>=1; digitalWrite(clk,LOW); delay(1); //if CUP is veryfast. if(digitalRead(dio)==HIGH) value|=0x80; digitalWrite(clk,HIGH); } digitalWrite(clk,LOW); pinMode(dio,OUTPUT);//set output mode. return value;}

这里作者碰着了本文开头时提到的那个坑:显示都正常,只是读按钮函数只能检测到S1到S4,S5到S8无论如何也检测不到。
后来经由剖析以为该当是发出clk之后,立时去读数据,由于间隔太短导致一个字节中的后面几位不能精确读出(别问为什么,我真不知道),因此在这个地方增加的一个1ms等待,就所有都OK了。
缘故原由可能是CPU太快,也可能是连线状态不好,也可能是芯片本身的问题。
总之加了个1毫秒的等待就统统都好了。
这个问题无论是国外还是海内的资料都没提到。

实际上可能不须要1ms,但是没有找到更短的delay函数,先凑合着用。

读按键操作会调用这个readByte函数,读出4个字节并合成一个字节。

int readButtons(void){ int buttons = 0; digitalWrite(strobe, LOW); pinMode(dio, OUTPUT); shiftOut(dio, clk, LSBFIRST, 0x42); pinMode(dio, INPUT); for (uint8_t i = 0; i < 4; i++) { int v = readByte() << i; buttons |= v; } pinMode(dio, OUTPUT); digitalWrite(strobe, HIGH); return buttons;}

指定位置设定LED状态。
LED的地址在0xC1开始的奇数地址。

void setLed(int value, int position){ pinMode(dio, OUTPUT); sendCommand(0x44); digitalWrite(strobe, LOW); writeByte(0xC1 + (position << 1)); writeByte(value); digitalWrite(strobe, HIGH);}

在数码管上显示数字。
数码管的地址在0xC0开始的偶数地址。
本函数将数字按照10进制位拆分并显示在数码管上。

void showNumber(int number){ const int digital[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int pos = 7; while(pos >=0){ digitalWrite(strobe, LOW); writeByte(0xc0 + pos 2); if(number > 0){ int dig = number % 10; writeByte(digital[dig]); number /= 10; } else{ writeByte(0); } digitalWrite(strobe, HIGH); pos--; }}

buttonLoop读出8个按键状态并显示在对应的LED上。

void buttonLoop(){ int buttons = readButtons(); for(int position = 0; position < 8; position++) { int mask = 0x1 << position; setLed(buttons & mask ? 1 : 0, position); }}

setup和loop就大略了。

void setup(){ pinMode(strobe, OUTPUT); pinMode(clk, OUTPUT); pinMode(dio, OUTPUT); reset();}

loop函数根据利用数码管显示循环变量同时读按键并显示到LED上。

void loop(){ for(int i = 0;i < 10000000; i++) { showNumber(i); buttonLoop(); }}

国外的网页利用shiftIn和shiftOut函数实现数据的写入和读出,这两个函数和readByte/writeByte是一回事。
如果不是由于加那个1ms等待,shiftIn/shiftOut也很好。

动作状态

参考资料

UNO D1 R32开拓环境准备:

https://github.com/xueweiguo/EmbeddedCpp/blob/master/Arduino/ESP32/Startup/ESP32Startup.md

USING A TM1638 BASED BOARD WITH ARDUINO:

https://blog.3d-logic.com/2015/01/10/using-a-tm1638-based-board-with-arduino/

TM1638芯片资料

http://www.titanmec.com/index.php/project/download/id/532.html

原文链接:

https://github.com/xueweiguo/EmbeddedCpp/blob/master/Arduino/TM1638/TM1638.md

以为本文有帮助?请分享给更多人。

更多精彩文章欢迎关注微信"大众年夜众号【面向工具思考】!

面向工具开拓,面向工具思考!

相关文章

再跌14%GPU价格今年已跌去57%_价钱_落了

自 2022 年初以来的变革更加剧烈,均匀低落了 57%。今年年初大多数显卡的零售供应量险些不存在。GPU 挖矿仍旧有利可图,任何...

互联网 2025-01-22 阅读0 评论0