#include <reg52.h> // 包含STC89C51寄存器定义
#include <string.h>
#define LCD_PORT P2 // LCD使用的端口
#define ROWS 4 // 矩阵键盘行数
#define COLS 4 // 矩阵键盘列数
// 矩阵键盘行列定义
unsigned char key_map[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// 诗句数组
const char *poems[16] = {
"床前明月光",
"疑是地上霜",
"举头望明月",
"低头思故乡",
"无边落木萧萧下",
"不尽长江滚滚来",
"浮天水送",
"白云愁思随意飞",
"月落乌啼霜满天",
"江枫渔火对愁眠",
"姑苏烟雨朦胧夜",
"白墙红瓦映长空",
"子规夜半犹啼血",
"聽取蛙声一片",
"霞光万道舞翩跹",
"几番风雨几度秋"
};
// 函数声明
void delay(unsigned int ms);
void lcd_command(unsigned char cmd);
void lcd_data(unsigned char data);
void lcd_init();
void lcd_print(const char *str);
unsigned char scan_key();
void main() {
lcd_init(); // 初始化LCD
while (1) {
unsigned char key = scan_key(); // 扫描按键
if (key != 0xFF) { // 检测到按键
if (key >= 0 && key < 16) {
lcd_print(poems[key]); // 显示对应的诗句
}
delay(200); // 防抖
}
}
}
// 延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 120; j++);
}
// LCD命令
void lcd_command(unsigned char cmd) {
LCD_PORT = cmd;
P0 &= ~0x04; // 选择指令寄存器
P0 |= 0x04; // 发送命令
delay(1);
}
// LCD数据
void lcd_data(unsigned char data) {
LCD_PORT = data;
P0 |= 0x04; // 选择数据寄存器
P0 |= 0x04; // 发送数据
delay(1);
}
// LCD初始化
void lcd_init() {
lcd_command(0x38); // 8位数据,2行,5x7点阵
lcd_command(0x0C); // 显示开,光标关
lcd_command(0x06); // 输入模式设置
lcd_command(0x01); // 清屏
delay(2);
}
// 输出字符串到LCD
void lcd_print(const char *str) {
while (*str) {
lcd_data(*str++);
}
}
// 矩阵键盘扫描
unsigned char scan_key() {
unsigned char row, col;
for (row = 0; row < ROWS; row++) {
P1 = ~(0x01 << row); // 设置一行为低电平
for (col = 0; col < COLS; col++) {
if (!(P1 & (0x01 << (col + 4)))) { // 检查列
return row * COLS + col; // 返回按键索引
}
}
}
return 0xFF; // 没有按键被按下
}
代码说明
LCD配置:该代码使用 P2 口控制LCD1602显示。相应的LCD初始化、命令发送和数据发送函数均已实现。
矩阵键盘:通过 scan_key 函数扫描4x4矩阵键盘,返回相应按键的索引。
诗句数组:定义了16个诗句,按键所对应的索引与诗句数组一致。
按键处理:当检测到按键按下时,显示对应的诗句。 |