Arduino基本人机接口:点阵LED汉字库键盘

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino基本人机接口:点阵LED汉字库键盘相关的知识,希望对你有一定的参考价值。

简 介: 基于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 读取时序

▲ 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点阵显示模块

▲ 8×8共阳双色LED点阵显示模块

  对外接口如下表所示:

【表1 点阵LED的接口】
PIN名称功能
PIN1GND电源地
PIN2VCC电源+5V
PIN3DATA输入数据
PIN4CLK时钟信号

2、四个LED点阵接口

  根据在 Grove Beginner Kits基础实验 对于基于人脸识别智能锁接口设计,利用四个IO口控制四个LED点阵。因此,在增加上GNDVCC引脚,对于四个LED点阵接口设计成PIN6的外部接口。

▲ 四个LED外部接口设计

▲ 四个LED外部接口设计

  下面是设计的四个LED点阵模块的共同的接口。使用四个IO接口控制四个LED接口。

▲ 测试接口SCH

▲ 测试接口SCH

  设计快速制版的测试PCB图。利用快速制版方法制作测试电路板。

▲ 设计的快速制版的PCB

▲ 设计的快速制版的PCB

 

§03 用Arduino测试模块


  用在 Grove Beginner Kits基础实验 所使用的Arduino UNO对于上述模块进行测试。所使用的开发软件利用 Arduino 的 IDE

1、测试按键

▲ 测试4×4按键

▲ 测试4×4按键

(1)将4×4按键连接在PD0-8

▲ 将按键的8Pins放置在PD2-PD9

▲ 将按键的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           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汉字库键盘的主要内容,如果未能解决你的问题,请参考以下文章

单片机与控制实验——LED点阵显示屏

单片机与控制实验——LED点阵显示屏

基于Proteus仿真的Arduino学习——LED点阵探究A(LED点阵基础)

单片机综合实验 - 04 | 键盘数码管与点阵管实验

Arduino实现8*8LED点阵显示爱心显示和Proteus仿真

单片机LED16*16点阵显示实验