简 介: 基于Arduino UNO对于常见到的矩阵按键,LED电专显示以及汉字库的读写进行了测试,并且给出了相应的实验程序。这为后面制作完整的电路板的原理设计以及相应的测试打下了基础。

关键词ArduinoTM1640矩阵按键汉字库

§01 汉字库GT32L32


1、基本介绍

  这颗 GT32L32S0140 GB2312 多字号多字体 可读写 标准点阵字库芯片 是从TB(¥6.25)购买到的。 GT32L32S0140 标准电站汉字库芯片 数据手册 中给出GT32L32S0140的基本描述。

  GT32L32S0140是一款内部包含有12×12,、16×16、24×24、32×32点阵的汉字字库,支持GB2312国标简体汉字以及ASCII字符。排列格式为恒指横排。同时内部包含有512k字节的可以自由读写的空间。地址为: 0x0000000x007FFFF

2、管脚定义

  下面的信息是来自于数据手册相关内容。具体内容可以直接参照前面的 GT32L32S0140的数据手册

▲ GT32L32基本信息

▲ 管脚定义

▲ GT32L32 读取时序

▲ GT32L32 基本连接

▲ GT32L32 的封装形式

3、建立AD元件库

  • 元器件库: MISCLIB\LIB\SCH.SCHLIB\GT23L32S0140
  • PCB封装库: SOP-8B

▲ 原理图以及封装图库

4、测试转接小板1

  在这个设计中,最终重要的测试,是该芯片是否可以在3.3V工作电压,能够接驳5V单片机Arduino系统。所以在SISCLKCS#都增加了串接的电阻。

▲ 测试小板的 原理图

▲ 快速制版焊接后的电路板

§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点阵。因此,在增加上GNDVCC引脚,对于四个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_nn=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软件开发环境搭建

  1. GT32L32S0140测试小板AD工程文件:AD\Test\2021\ZYK\Test1.SchDoc ↩︎

Arduino基本人机接口:点阵LED、汉字库、键盘相关推荐

  1. Arduino开发板点阵Led屏自动生成想要的图案教程--附【PCtoLCD】字模生成软件

    第一步:确保点阵屏与Arduino正确连接 首先点阵屏幕一定要正确连接上Arduino开发板,并通过上传代码,能够正确点亮Led屏幕. 第二步:用自动生成字模软件生成字模 在点阵屏显示文字教程的代码中 ...

  2. Arduino Uno 使用MAX7219驱动单个8*8点阵LED模块

    还记得之前做的一个怦然心动的8*8点阵实验吗? 很多小伙伴都会觉得,插口都用完了还能用其他的功能吗? 现在使用MAX7219这个驱动模块 只占用3个IO口,就可以控制8*8点阵的显示,非常实用,简单. ...

  3. 8*8led矩阵的滚动广告幕的c语言程序,基于89C51单片机的8#215;8点阵LED字符显示器的设计...

    8×8点阵LED字符显示器的设计能显示"电子技校欢迎你"七个文字. 显示方式可由K1.K2.K3.K4选择,K1为逐字显示,K2为向上滚动显示,K3为向左滚动显示,K4为向右滚动显 ...

  4. 嵌入式Linux LED,键盘,AD驱动程序开发

                  LED,键盘,AD驱动程序开发 原文: http://blog.sina.com.cn/s/blog_4083b2d70100bnlf.html 一:硬件平台及系统平台 C ...

  5. Arduino Mega/Uno制作宏定义键盘(不需刷firmware!!)

    本人机械专业大一编程小白一枚,接触编程不到半年.近期开始自学Arduino.这应该是本人第一篇博客,有错误之处敬请斧正! - 心路&思路 家住武汉,这个年嘛,大家应该都懂,被迫宅化.年前从网上 ...

  6. ASCII字符点阵和汉字库点阵显示

    字符编码方式有ASCII,GBK和Unicode等,ASCII编码方式用 1 byte来表示一个字符,ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符.标准ASC ...

  7. linux下ad键盘驱动,led、键盘、ADC驱动程序

    LED,键盘,AD驱动程序开发 一:硬件平台及系统平台 CPU: S3C2410A SDRAM: 64M FLASH: K9F1208(64MB) NET: CS8900 友善之臂2410,优龙241 ...

  8. 51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)

    文章目录 前言 一.protues仿真 安装软件 绘制原理图 二.keil程序编写 1. 三.仿真示例 前言 本次任务:基于protues仿真实现at89c51控制16×16点阵led屏实现流水文字滚 ...

  9. 单片机点阵 LED 设计显示屏,超详细!

    LED点阵的介绍 点阵 LED 显示屏作为一种现代电子媒体,具有灵活的显示面积(可任意分割和拼装).高亮度.长寿命.数字化.实时性等特点,应用非常广泛. 前边学了 LED 小灯和 LED 数码管后,学 ...

最新文章

  1. 50%人使用视听设备音量超标,如何正确佩戴耳机?
  2. 获取对话框当前cfont_自绘对话框
  3. [蓝桥杯][算法训练VIP]接水问题(思维)
  4. LeetCode--Sum Root to Leaf Numbers
  5. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...
  6. python文件操作的方法_python中文件操作的基本方法
  7. c语言 int操作bit,C语言,使用共用体和结构体 查看int型的bit散布
  8. 五线谱音名和组别对照表_五线谱简谱对照表(五线谱1234567表示图)
  9. tiup cluster restart
  10. Mac如何通过远程控制其他Mac
  11. linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路
  12. 全面演示springboot发送QQ邮件过程(复杂邮件+简单邮件)图片、附件
  13. 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单
  14. 量化投资常用技能——指标篇3:详解RSI指标,及其代码实现和绘图
  15. AR初体验:使用HP Reveal制作Aura进行presentation
  16. 对于网站设计和开发公司日益增长的需求
  17. tortoisegit配置ssh 和 ppk
  18. 使用Aosp源码编译安卓ROM(小米,一加,三星,中兴等)
  19. FOMO3D白话游戏规则
  20. 6轴机械臂正逆解运算实现

热门文章

  1. easyui英文提示变中文
  2. 普通程序员如何转向AI方向(转)
  3. 解决ReSharper自动删除换行
  4. windows篇-第四章 安装和配置Windows域
  5. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
  6. 用日志记录LINQ中的所有增删改的SQL语句的方法
  7. MySQL出现同步延迟有哪些原因?如何解决?
  8. windows 下实现函数打桩:拦截API方式
  9. Hive导出复杂数据到csv文件
  10. Nginx配置文档具体解释