#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個詩句,按鍵所對應的索引與詩句數組一致。
按鍵處理:當檢測到按鍵按下時,顯示對應的詩句。 |