■ 相关文献链接:
§01 基于Arduino UNO门禁接口
1、前期的准备工作
- 在 Arduino基本人机接口:点阵LED、汉字库、键盘 初步对于基于Arduino的门禁系统中重要部件,进行了测试,包括键盘、点阵LED、汉字库(在一开始没有测试出结果)
- 在 Grove Beginner Kits基础实验 对于基于ESP8266的WiFi模块以及由它控制语音模块进行测测试。并给出了系统设计框图。
- 在 ESP8266访问网站-urequest get方法 进行了通过ESP8266访问网站的基本方法测试。
- 在 Arduio软件开发环境搭建 中给出了搭建Arduino的开发环境的过程。
▲ 门禁系统的系统框图
下面将基于前面的初步测试
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的端口定义
(2)PCB设计
为了使用快速制版,设计了适合单面制版的PCB图,通过快速制版形成测试的电路。
▲ 设计版图以及快速制版电路图
3、焊接与调试
(1)焊接之后的电路板
将焊接之后的电路板放置在Grove Beginner Kit上进行调试。
▲ 焊接之后的电路板
§02 电路调试
1、4×4按键矩阵
(1)测试代码
下面的代码是从 Arduino基本人机接口:点阵LED、汉字库、键盘 拷贝过来的。对于其中KEYLIN_n, KEYCODE_n重新进行了定义。
▲ 原理图中,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发送的按键编码值
2、测试点阵LED
测试点阵LED的代码来自于 Arduino基本人机接口:点阵LED、汉字库、键盘 。根据原理图中的设计,对应LED_DATA1,LED_DATA2,LED_CLK1,LED_CLK2定义与前面实验相同,所以所使用的代码可以直接使用。
▲ 原理图中关于点阵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字符
(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
//------------------------------------------------------------------------------
Arduino门禁系统AD设计工程文件:AD\Test\2021\ZYK\FaceLockVer1.PcbDoc ↩︎