Arduino门禁人机接口调试 Version 1.0


 


■ 相关文献链接:

 

§01 于Arduino UNO门禁接口


1、前期的准备工作

▲ 门禁系统的系统框图

▲ 门禁系统的系统框图

下面将基于前面的初步测试

2、系统硬件设计1

(1)原理图设计

▲ 系统详细原理图

▲ 系统详细原理图

下面给出自制电路板功能说明:

Ⅰ.ESP8266 WiFI模块接口:
串口接口:软件UART,IO2-RX,IO3-TX
TTS接口:ESP8266中的TXD1。
舵机接口:ESP8266中的GPIO4
Ⅱ.4×4按键接口:
Arduino数字接口:IO4,5,6,7,8,9,18,19
Ⅲ.LED模块接口:
Arduino数字接口:IO14,15,16,17
Ⅳ.汉字库模块接口:
Arduino数字接口:MOSI,MISO,SCK,SS
Ⅴ.人脸识别接口:
Arduino数字接口:UART:RX,TX

为了参考方便,将 Grove Beginner Kits基础实验 中关于Arduino的数字口的配置显示如下:

▲ Arduino UNO的端口定义

▲ Arduino UNO的端口定义

(2)PCB设计

为了使用快速制版,设计了适合单面制版的PCB图,通过快速制版形成测试的电路。

▲ 设计版图以及快速制版电路图

▲ 设计版图以及快速制版电路图

3、焊接与调试

(1)焊接之后的电路板

将焊接之后的电路板放置在Grove Beginner Kit上进行调试。

▲ 焊接之后的电路板

▲ 焊接之后的电路板

 

§02 路调试


1、4×4按键矩阵

(1)测试代码

下面的代码是从 Arduino基本人机接口:点阵LED、汉字库、键盘 拷贝过来的。对于其中KEYLIN_n, KEYCODE_n重新进行了定义。

▲ 原理图中,4×4键盘对应的接口

▲ 原理图中,4×4键盘对应的接口

代码中,在 #define KEYLINE_n, KEY_CODE_n 分别定义了4×4键盘矩阵连接到Arduino数字接口的端口。

/*
**==============================================================================
** TESTKEY.C:             -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*/

//------------------------------------------------------------------------------

#define KEYLINE_1       4
#define KEYLINE_2       5
#define KEYLINE_3       6
#define KEYLINE_4       7
#define KEYCODE_1       8
#define KEYCODE_2       9
#define KEYCODE_3       18
#define KEYCODE_4       19

#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)串口监视器

使用“工具栏”中的“串口监视器”,可以看到程序发送的读到的按键的二进制编码。 在没有按键的时候,读出的编码为0xff。其它的按键编码在上面的代码中前面进行了宏定义。

▲ 使用串口监视器获得Arduino发送的按键编码值

▲ 使用串口监视器获得Arduino发送的按键编码值

2、测试点阵LED

测试点阵LED的代码来自于 Arduino基本人机接口:点阵LED、汉字库、键盘 。根据原理图中的设计,对应LED_DATA1,LED_DATA2,LED_CLK1,LED_CLK2定义与前面实验相同,所以所使用的代码可以直接使用。

▲ 原理图中关于点阵LED以及汉字库接口

▲ 原理图中关于点阵LED以及汉字库接口

(1)测试代码
/*
**==============================================================================
** 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);
}


//==============================================================================
//                END OF THE FILE : TESTLED.C
//------------------------------------------------------------------------------
(2)运行效果

根据前面程序的逻辑,点阵LED显示的内容如下图所示。

▲ 程序运行结果

▲ 程序运行结果

(3)显示字符

▲ 显示FONT字符

▲ 显示FONT字符

(4)显示按键数值

▲ 显示按键编码数值

▲ 显示按键编码数值

▲ 显示按键字符

▲ 显示按键字符

/*
**==============================================================================
** TESTLED.C:             -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*/

//------------------------------------------------------------------------------

#define KEYLINE_1       4
#define KEYLINE_2       5
#define KEYLINE_3       6
#define KEYLINE_4       7
#define KEYCODE_1       8
#define KEYCODE_2       9
#define KEYCODE_3       18
#define KEYCODE_4       19

#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;
}



//------------------------------------------------------------------------------
const unsigned char F6x8[][6] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
    { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
    { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %
    { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
    { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
    { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
    { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
    { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *
    { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +
    { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   // ,
    { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -
    { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
    { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
    { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0
    { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1
    { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
    { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3
    { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4
    { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
    { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6
    { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
    { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
    { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9
    { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
    { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
    { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
    { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
    { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
    { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
    { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   // @
    { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   // A
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C
    { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F
    { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G
    { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H
    { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I
    { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J
    { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K
    { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L
    { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M
    { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P
    { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q
    { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R
    { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // S
    { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T
    { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U
    { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V
    { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W
    { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // X
    { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y
    { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z
    { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [
    { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55
    { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]
    { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
    { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
    { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
    { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
    { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
    { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   // d
    { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
    { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f
    { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   // g
    { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h
    { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i
    { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },   // j
    { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k
    { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l
    { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
    { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   // p
    { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   // q
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r
    { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
    { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t
    { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u
    { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v
    { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w
    { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
    { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   // y
    { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z
    { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }    // horiz lines
};


//------------------------------------------------------------------------------

#define LED_DATA1       14
#define LED_DATA2       15
#define LED_CLK1        16
#define LED_CLK2        17

//------------------------------------------------------------------------------
unsigned char g_ucLEDBuffer[4][16];

void ledClearBuffer(void) {
    int i, j;
    for(i = 0; i < 4; i ++) {
        for(j = 0; j < 16; j ++) {
            g_ucLEDBuffer[i][j] = 0x0;
        }

    }
    
}

void ledSetup(void) {
    ledClearBuffer();
    
    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();
}


//------------------------------------------------------------------------------
void ledSetPoint(unsigned char x, unsigned char y, unsigned char ucColor) {
    unsigned char ucLED, ucMask;
        
    ucLED = x/8;
    x = x - ucLED * 8;
    
    if(ucLED >= 4)  return;
    if(y >= 8)      return;
    y = 7 - y;
    
    ucMask = 1 << x;
    
    g_ucLEDBuffer[ucLED][y*2] &= ucMask^0xff;
    g_ucLEDBuffer[ucLED][y*2+1] &= ucMask^0xff;
    if(ucColor & 0x1) g_ucLEDBuffer[ucLED][y*2] |= ucMask;
    if(ucColor & 0x2) g_ucLEDBuffer[ucLED][y*2+1] |= ucMask;
    
}

//------------------------------------------------------------------------------
void ledSetASCII(unsigned char x, unsigned char ucColor, unsigned char ucASCII) {
    unsigned char i, j, ucMask, ucFont, p;

    if(ucASCII < ' ')   return;
    ucASCII -= ' ';
    if(ucASCII >= 80)   return;
    
    for(i = 0; i < 6; i ++) {
        ucMask = 0x1;
        ucFont = F6x8[ucASCII][i];
        for(j = 0; j < 8; j ++) {
            if(ucFont & ucMask) p = ucColor;
            else p = 0x0;
            
            ledSetPoint(x+i, j, p);
            ucMask <<= 1;
        }
    }
}

//------------------------------------------------------------------------------
void ledSetString4(char * p, unsigned char ucColor) {
    int i;
    char c;
    
    for(i = 0; i < 4; i ++) {
        c = *(p + i);
        if(c == 0) break;
        
        ledSetASCII(i*8, ucColor, c);
    }

}

unsigned char Hex2Text(unsigned char ucCode) {
    if(ucCode < 10) {
        return '0' + ucCode;
    }
    
    return 'A' + ucCode - 10;

}


//------------------------------------------------------------------------------
#define LED_PIN         13
void setup(void) {
    ledSetup();    
    keySetup();
    pinMode(LED_PIN, OUTPUT);
    
}


//------------------------------------------------------------------------------
unsigned char ucCount = 0;
void loop(void) {
    char szShowBuffer[5];
    unsigned char ucKey;
    
    ucCount ++;
    if(ucCount & 0x1) digitalWrite(LED_PIN, HIGH);
    else digitalWrite(LED_PIN, LOW);
    
    ucKey = keyReadCode();
//    if(ucKey != KEY_NULL) 
    {
        szShowBuffer[0] = Hex2Text(ucCount >> 4);
        szShowBuffer[1] = Hex2Text(ucCount & 0xf);
        szShowBuffer[2] = Hex2Text(ucKey >> 4);
        szShowBuffer[3] = Hex2Text(ucKey & 0xf);
        
        ledClearBuffer();
        ledSetString4(szShowBuffer, 0x3);
        ledWriteBuffer();
    }

    delay(150);
}


//==============================================================================
//                END OF THE FILE : TESTLED.C
//------------------------------------------------------------------------------

  1. Arduino门禁系统AD设计工程文件:AD\Test\2021\ZYK\FaceLockVer1.PcbDoc ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值