找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 772|回复: 2
收起左侧

大佬们,怎么用atc89c51写程序用串口助手显示诗

[复制链接]
ID:1125585 发表于 2024-12-7 18:13 来自手机 | 显示全部楼层 |阅读模式
要求是用矩阵键盘控制,按一个按键显示一行诗,16个按键显示16个诗
回复

使用道具 举报

ID:860926 发表于 2024-12-9 10:42 | 显示全部楼层
串口发送程序,按键你写好,检测到了就发送就行了
void Uart_SendByte(unsigned char byte)
{
          SBUF =  byte;
          while(!UartSendFlag);
          UartSendFlag = 0;                                   
}
void Uart_SendString(unsigned char *str,unsigned char strlen)
{
    unsigned char i;
          for(i=0;i<strlen;i++)
    {
      Uart_SendByte(*str++);
    }
}
回复

使用道具 举报

ID:404160 发表于 2024-12-9 10:52 | 显示全部楼层
#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个诗句,按键所对应的索引与诗句数组一致。
按键处理:当检测到按键按下时,显示对应的诗句。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表