用STC89C52的点阵屏写一个笑脸,要求只用点阵屏与矩阵
时间: 2024-01-21 12:19:02 浏览: 24
为了实现这个功能,需要先了解STC89C52的点阵屏与矩阵的工作原理。
点阵屏是由多个LED点阵组成的,每个LED点阵都可以独立控制,并且可以通过行列扫描的方式进行控制。矩阵则是由多个按键组成的,每个按键都有独立的引脚,并且可以通过行列扫描的方式进行读取。
因此,我们可以通过点阵屏和矩阵的行列扫描方式,实现一个简单的笑脸图案。
具体实现步骤如下:
1. 定义点阵屏和矩阵的引脚连接方式。
2. 初始化点阵屏和矩阵的引脚状态,并设置扫描周期。
3. 定义一个二维数组,表示笑脸的图案。
4. 在主循环中,循环扫描矩阵按键,如果有按键按下,则将对应的LED点亮,并显示笑脸图案。如果没有按键按下,则清除所有LED点阵的状态。
以下是示例代码:
```c
#include <STC89C5xRC.H>
// 定义点阵屏引脚连接方式
#define LED_COM P1
#define LED_DAT P0
// 定义矩阵引脚连接方式
#define KEY_COM P2
#define KEY_DAT P3
// 定义扫描周期
#define SCAN_PERIOD 5
// 定义笑脸图案
unsigned char smiley_face[8][8] = {
{0x00, 0x38, 0x7C, 0xEE, 0xC7, 0xEE, 0x7C, 0x38},
{0x00, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0x7C},
{0x00, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE},
{0x00, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7},
{0x00, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE},
{0x00, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0x7C},
{0x00, 0x38, 0x7C, 0xEE, 0xEE, 0xEE, 0x7C, 0x38},
{0x00, 0x10, 0x38, 0x6C, 0x44, 0x6C, 0x38, 0x10}
};
// 初始化点阵屏
void init_led() {
LED_COM = 0xff;
LED_DAT = 0xff;
}
// 初始化矩阵
void init_key() {
KEY_COM = 0xff;
KEY_DAT = 0xff;
}
// 扫描矩阵
void scan_key() {
static unsigned char key_state[4][4] = {
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
unsigned char i, j;
// 扫描行
for (i = 0; i < 4; i++) {
KEY_COM = ~(1 << i);
for (j = 0; j < 4; j++) {
if (!(KEY_DAT & (1 << j))) {
key_state[i][j] = 0;
}
}
}
// 扫描列
for (j = 0; j < 4; j++) {
KEY_COM = 0xff;
KEY_DAT = ~(1 << j);
for (i = 0; i < 4; i++) {
if (!(KEY_DAT & (1 << j)) && key_state[i][j]) {
// 如果有按键按下,则点亮对应的LED点阵,并显示笑脸图案
LED_COM = ~(1 << i);
LED_DAT = smiley_face[i][j];
}
}
}
// 清除所有LED点阵的状态
LED_COM = 0xff;
LED_DAT = 0xff;
}
void main() {
init_led();
init_key();
while (1) {
scan_key();
delay(SCAN_PERIOD);
}
}
```