Arduino基本人机接口:点阵LED汉字库键盘
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 0x1B
void 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 7us
digitalWrite(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 7us
digitalWrite(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 7us
digitalWrite(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以上是关于Arduino基本人机接口:点阵LED汉字库键盘的主要内容,如果未能解决你的问题,请参考以下文章
基于Proteus仿真的Arduino学习——LED点阵探究A(LED点阵基础)