Arduino基本人机接口:点阵LED、汉字库、键盘
简 介: 基于Arduino UNO对于常见到的矩阵按键,LED电专显示以及汉字库的读写进行了测试,并且给出了相应的实验程序。这为后面制作完整的电路板的原理设计以及相应的测试打下了基础。
关键词
: Arduino,TM1640,矩阵按键,汉字库
§01 汉字库GT32L32
1、基本介绍
这颗 GT32L32S0140 GB2312 多字号多字体 可读写 标准点阵字库芯片 是从TB(¥6.25)购买到的。 GT32L32S0140 标准电站汉字库芯片 数据手册 中给出GT32L32S0140的基本描述。
GT32L32S0140
是一款内部包含有12×12,、16×16、24×24、32×32点阵的汉字字库,支持GB2312
国标简体汉字以及ASCII
字符。排列格式为恒指横排。同时内部包含有512k
字节的可以自由读写的空间。地址为: 0x000000
~0x007FFFF
。
2、管脚定义
下面的信息是来自于数据手册相关内容。具体内容可以直接参照前面的 GT32L32S0140的数据手册 。
▲ GT32L32基本信息
▲ 管脚定义
▲ GT32L32 读取时序
▲ GT32L32 基本连接
▲ GT32L32 的封装形式
3、建立AD元件库
- 元器件库: MISCLIB\LIB\SCH.SCHLIB\GT23L32S0140
- PCB封装库: SOP-8B
▲ 原理图以及封装图库
4、测试转接小板1
在这个设计中,最终重要的测试,是该芯片是否可以在3.3V
工作电压,能够接驳5V
单片机Arduino
系统。所以在SI
,SCLK
,CS#
都增加了串接的电阻。
▲ 测试小板的 原理图
▲ 快速制版焊接后的电路板
§02 双色LED点阵
1、基本信息
控制芯片为 THM1640 ,它是LED
驱动控制专用电路。封装为SOP28
形式。
▲ 8×8共阳双色LED点阵显示模块
对外接口如下表所示:
【表1 点阵LED的接口】
PIN | 名称 | 功能 |
---|---|---|
PIN1 | GND | 电源地 |
PIN2 | VCC | 电源+5V |
PIN3 | DATA | 输入数据 |
PIN4 | CLK | 时钟信号 |
2、四个LED点阵接口
根据在 Grove Beginner Kits基础实验 对于基于人脸识别智能锁接口设计,利用四个IO
口控制四个LED
点阵。因此,在增加上GND
, VCC
引脚,对于四个LED
点阵接口设计成PIN6
的外部接口。
▲ 四个LED外部接口设计
下面是设计的四个LED
点阵模块的共同的接口。使用四个IO
接口控制四个LED
接口。
▲ 测试接口SCH
设计快速制版的测试PCB图。利用快速制版方法制作测试电路板。
▲ 设计的快速制版的PCB
§03 利用Arduino测试模块
利用在 Grove Beginner Kits基础实验 所使用的Arduino UNO对于上述模块进行测试。所使用的开发软件利用 Arduino 的 IDE 。
1、测试按键
▲ 测试4×4按键
(1)将4×4按键连接在PD0-8
▲ 将按键的8Pins放置在PD2-PD9
使用到了Arduino
的数字IO
2,3,4,...,9
。其中红色对应9
。
(2)测试代码
下面是测试的代码。按键上16
个按键对应的编码在下面代码中 KEY_n
,n=1,2,3
,……,F
定义的常量。
/*
**==============================================================================
** TESTKEY.C: -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*///------------------------------------------------------------------------------#define KEYLINE_1 2
#define KEYLINE_2 3
#define KEYLINE_3 4
#define KEYLINE_4 5
#define KEYCODE_1 6
#define KEYCODE_2 7
#define KEYCODE_3 8
#define KEYCODE_4 9#define KEY_NULL 0xff
#define KEY_1 0x47
#define KEY_2 0x4B
#define KEY_3 0x4D
#define KEY_4 0x37
#define KEY_5 0x3B
#define KEY_6 0x3D
#define KEY_7 0x27
#define KEY_8 0x2B
#define KEY_9 0x2D
#define KEY_0 0x17
#define KEY_A 0x4E
#define KEY_B 0x3E
#define KEY_C 0x2E
#define KEY_D 0x1E
#define KEY_E 0x1D
#define KEY_F 0x1Bvoid keyLineSet(unsigned char ucLine) {if(ucLine & 0x1) digitalWrite(KEYLINE_1, HIGH);else digitalWrite(KEYLINE_1, LOW);if(ucLine & 0x2) digitalWrite(KEYLINE_2, HIGH);else digitalWrite(KEYLINE_2, LOW);if(ucLine & 0x4) digitalWrite(KEYLINE_3, HIGH);else digitalWrite(KEYLINE_3, LOW);if(ucLine & 0x8) digitalWrite(KEYLINE_4, HIGH);else digitalWrite(KEYLINE_4, LOW);
}void keySetup(void) {pinMode(KEYLINE_1, OUTPUT);pinMode(KEYLINE_2, OUTPUT);pinMode(KEYLINE_3, OUTPUT);pinMode(KEYLINE_4, OUTPUT);pinMode(KEYCODE_1, INPUT_PULLUP);pinMode(KEYCODE_2, INPUT_PULLUP);pinMode(KEYCODE_3, INPUT_PULLUP);pinMode(KEYCODE_4, INPUT_PULLUP); keyLineSet(0x0);
}unsigned char keyReadCode(void) {keyLineSet(0xe);if(keyCode() != 0xf) return 0x10 | keyCode();keyLineSet(0xd);if(keyCode() != 0xf) return 0x20 | keyCode();keyLineSet(0xb);if(keyCode() != 0xf) return 0x30 | keyCode();keyLineSet(0x7);if(keyCode() != 0xf) return 0x40 | keyCode();return 0xff;
}unsigned char keyCode(void) {unsigned char ucCode;ucCode = 0x0;if(digitalRead(KEYCODE_1) == HIGH) ucCode |= 0x1;if(digitalRead(KEYCODE_2) == HIGH) ucCode |= 0x2;if(digitalRead(KEYCODE_3) == HIGH) ucCode |= 0x4;if(digitalRead(KEYCODE_4) == HIGH) ucCode |= 0x8;return ucCode;
}//------------------------------------------------------------------------------
unsigned char Hex2Text(unsigned char ucCode) {if(ucCode < 10) {return '0' + ucCode;}return 'A' + ucCode - 10;}void SendHEX8(unsigned char ucCode) {Serial.write(Hex2Text(ucCode >> 4));Serial.write(Hex2Text(ucCode & 0xf));
}//------------------------------------------------------------------------------
void setup(void) {Serial.begin(115200);keySetup();}//------------------------------------------------------------------------------
void loop(void) {delay(250);SendHEX8(keyReadCode());Serial.write("\r\n");
}//==============================================================================
// END OF THE FILE : TESTKEY.C
//------------------------------------------------------------------------------
2、测试点阵LED
(1)接口定义
- 点阵LED接口定义:
-
Data1
:IO14 - PC0
Data2
:IO15 - PC1
Clk1
:IO16 - PC2
Clk2
:IO17 - PC3
(2)测试代码
/*
**==============================================================================
** TESTLED.C: -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*/#define LED_DATA1 14
#define LED_DATA2 15
#define LED_CLK1 16
#define LED_CLK2 17//------------------------------------------------------------------------------
unsigned char g_ucLEDBuffer[4][16];void ledSetup(void) {int i, j;for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = 0x0;}}pinMode(LED_DATA1, OUTPUT);pinMode(LED_DATA2, OUTPUT);pinMode(LED_CLK1, OUTPUT);pinMode(LED_CLK2, OUTPUT); digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledSetData12(unsigned char ucData12) {if(ucData12 & 0x1) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);if(ucData12 & 0x2) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW);
}void ledClock1(void) {digitalWrite(LED_CLK1, HIGH); // clock up 7usdigitalWrite(LED_CLK1, LOW);
}void ledClock2(void) {digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_CLK2, LOW);
}void ledStart(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, LOW);digitalWrite(LED_CLK2, LOW);}void ledStop(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledWriteData(unsigned char ucChar1, unsigned char ucChar2,unsigned char ucChar3, unsigned char ucChar4) {unsigned char i;unsigned char ucMask;ucMask = 0x1;for(i = 0; i < 8; i++) {if(ucChar1 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW); if(ucChar2 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW); digitalWrite(LED_CLK1, HIGH); // clock up 7usdigitalWrite(LED_CLK1, LOW);if(ucChar3 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW); if(ucChar4 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW); digitalWrite(LED_CLK2, HIGH); // clock up 7usdigitalWrite(LED_CLK2, LOW);ucMask = ucMask << 1;}}//------------------------------------------------------------------------------
#define LEDCMD_ADD_INC 0x40
#define LEDCMD_ADD_SET 0x44
#define LEDCMD_MODE_CLOSE 0x80
#define LEDCMD_MODE_OPEN 0x8a//------------------------------------------------------------
void ledWriteByteAll(unsigned char ucChar) {ledWriteData(ucChar, ucChar, ucChar, ucChar);
}void ledWriteData16All(unsigned char ucData) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteByteAll(ucData);}ledStop();ledStart(); ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
void ledWriteBuffer(void) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteData(g_ucLEDBuffer[0][i],g_ucLEDBuffer[1][i],g_ucLEDBuffer[2][i],g_ucLEDBuffer[3][i]);}ledStop(); ledStart(); ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
#define LED_PIN 13
void setup(void) {ledSetup();pinMode(LED_PIN, OUTPUT);}//------------------------------------------------------------------------------
unsigned char ucCount = 0;
void loop(void) {int i, j;ucCount ++;if(ucCount & 0x1) digitalWrite(LED_PIN, HIGH);else digitalWrite(LED_PIN, LOW);for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = ucCount;}}ledWriteBuffer();delay(500);
}//==============================================================================
// END OF THE FILE : TESTLED.C
//------------------------------------------------------------------------------
(3)测试结果
经过测试,发现四个LED点阵显示中,有两个可以同时显示绿色,红色,但有两个只能显示红色。
将这LED点阵模块更换接头,结果仍然是相同的。这说明这个问题与软件以及和电路没有关系,是模块本身自身的问题。
▲ 测试结果
3、测试汉字库
(1)SPI 接口
MEGA358的SPI的接口:
- M328 SPI接口定义:
-
MOSI
:PB3(PIN15): IO11
MISO
:PB4(PIN16):IO12
SCK
:PB5(PIN17):IO13
/SS:
: PB2(PIN14):IO10
注意:
在Arduino中,include<file.h> 中的file名称需要注意大小写
参考信息: Arduino – SPI库 – transfer
/*
**==============================================================================
** TEST1.C: -- by Dr. ZhuoQing, 2021-05-26
**
**==============================================================================
*/
//------------------------------------------------------------------------------
void setup(void) {SPI.begin();SPI.setClockDivider(SPI_CLOCK_DIV4);Serial.begin(115200);
}
//------------------------------------------------------------------------------
void loop(void) {unsigned char receivedVal;receivedVal = SPI.transfer(0x55);Serial.write(receivedVal);
}
//==============================================================================
// END OF THE FILE : TEST1.C
//------------------------------------------------------------------------------
▲ MOSI(11),SCK(13)波形
可以看到SCK的周期为250ns,fosc=16MHzf_{osc} = 16MHzfosc=16MHz四分频(4Mhz)的周期。
(2)与汉字库相连
问题: 根据设计没有能够正确读取相应的数据。这部分的实验之后还需要进一步的完善。
※ 测试结果总结 ※
通过前面三个实验分别验证了基于Arduino对于4×4键盘矩阵,四个LED矩阵显示器以及汉字库的读写问题。这为之后进一步设计一体化的电路附加板奠定了基础。
■ 相关文献链接:
- GT32L32S0140 GB2312 多字号多字体 可读写 标准点阵字库芯片
- GT32L32S0140 标准电站汉字库芯片 数据手册
- THM1640
- Grove Beginner Kits基础实验
- Arduio软件开发环境搭建
GT32L32S0140测试小板AD工程文件:AD\Test\2021\ZYK\Test1.SchDoc ↩︎
Arduino基本人机接口:点阵LED、汉字库、键盘相关推荐
- Arduino开发板点阵Led屏自动生成想要的图案教程--附【PCtoLCD】字模生成软件
第一步:确保点阵屏与Arduino正确连接 首先点阵屏幕一定要正确连接上Arduino开发板,并通过上传代码,能够正确点亮Led屏幕. 第二步:用自动生成字模软件生成字模 在点阵屏显示文字教程的代码中 ...
- Arduino Uno 使用MAX7219驱动单个8*8点阵LED模块
还记得之前做的一个怦然心动的8*8点阵实验吗? 很多小伙伴都会觉得,插口都用完了还能用其他的功能吗? 现在使用MAX7219这个驱动模块 只占用3个IO口,就可以控制8*8点阵的显示,非常实用,简单. ...
- 8*8led矩阵的滚动广告幕的c语言程序,基于89C51单片机的8#215;8点阵LED字符显示器的设计...
8×8点阵LED字符显示器的设计能显示"电子技校欢迎你"七个文字. 显示方式可由K1.K2.K3.K4选择,K1为逐字显示,K2为向上滚动显示,K3为向左滚动显示,K4为向右滚动显 ...
- 嵌入式Linux LED,键盘,AD驱动程序开发
LED,键盘,AD驱动程序开发 原文: http://blog.sina.com.cn/s/blog_4083b2d70100bnlf.html 一:硬件平台及系统平台 C ...
- Arduino Mega/Uno制作宏定义键盘(不需刷firmware!!)
本人机械专业大一编程小白一枚,接触编程不到半年.近期开始自学Arduino.这应该是本人第一篇博客,有错误之处敬请斧正! - 心路&思路 家住武汉,这个年嘛,大家应该都懂,被迫宅化.年前从网上 ...
- ASCII字符点阵和汉字库点阵显示
字符编码方式有ASCII,GBK和Unicode等,ASCII编码方式用 1 byte来表示一个字符,ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符.标准ASC ...
- linux下ad键盘驱动,led、键盘、ADC驱动程序
LED,键盘,AD驱动程序开发 一:硬件平台及系统平台 CPU: S3C2410A SDRAM: 64M FLASH: K9F1208(64MB) NET: CS8900 友善之臂2410,优龙241 ...
- 51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)
文章目录 前言 一.protues仿真 安装软件 绘制原理图 二.keil程序编写 1. 三.仿真示例 前言 本次任务:基于protues仿真实现at89c51控制16×16点阵led屏实现流水文字滚 ...
- 单片机点阵 LED 设计显示屏,超详细!
LED点阵的介绍 点阵 LED 显示屏作为一种现代电子媒体,具有灵活的显示面积(可任意分割和拼装).高亮度.长寿命.数字化.实时性等特点,应用非常广泛. 前边学了 LED 小灯和 LED 数码管后,学 ...
最新文章
- 50%人使用视听设备音量超标,如何正确佩戴耳机?
- 获取对话框当前cfont_自绘对话框
- [蓝桥杯][算法训练VIP]接水问题(思维)
- LeetCode--Sum Root to Leaf Numbers
- 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...
- python文件操作的方法_python中文件操作的基本方法
- c语言 int操作bit,C语言,使用共用体和结构体 查看int型的bit散布
- 五线谱音名和组别对照表_五线谱简谱对照表(五线谱1234567表示图)
- tiup cluster restart
- Mac如何通过远程控制其他Mac
- linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路
- 全面演示springboot发送QQ邮件过程(复杂邮件+简单邮件)图片、附件
- 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单
- 量化投资常用技能——指标篇3:详解RSI指标,及其代码实现和绘图
- AR初体验:使用HP Reveal制作Aura进行presentation
- 对于网站设计和开发公司日益增长的需求
- tortoisegit配置ssh 和 ppk
- 使用Aosp源码编译安卓ROM(小米,一加,三星,中兴等)
- FOMO3D白话游戏规则
- 6轴机械臂正逆解运算实现