LCD亮了,但没有内容,不知什么原因

2301_77114281 2301_77114281 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#include <reg51.h>

sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;

// ?????????P2.3-P2.7
#define LCD1602_DATA P2

unsigned int speed = 0; // Speed (0-3000 r/min)
unsigned int angle = 0; // Angle (2-9999 deg)

void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 123; j++);
}

void lcd_command(unsigned char cmd) {
    LCD1602_DATA = cmd;
    RS = 0;
    RW = 0;
    EN = 1;
    delay(1);
    EN = 0;
}

void LCD1602_check_busy(void) {
    EA = 0;

    LCD1602_DATA = 0xff; // Set data port as input
    RS = 0;
    RW = 1;
    EN = 1;
    while (LCD1602_DATA & 0x80); // Wait until busy flag is cleared
    EN = 0;

    EA = 1;
}

void lcd_init() {
    delay(15); // Initial delay to ensure power stabilization
    lcd_command(0x38); // 8-bit mode, 2 lines, 5x7 dots
    delay(5);
    lcd_command(0x38); // Ensure correct initialization
    delay(1);
    lcd_command(0x38); // Final initialization command
    delay(1);
    lcd_command(0x0C); // Display on, cursor off, blink off
    delay(1);
    lcd_command(0x06); // Increment cursor, no shift
    delay(1);
    lcd_command(0x01); // Clear display, move cursor to home
    delay(2);
}

void lcd_char(unsigned char dat) {
    LCD1602_DATA = dat;
    RS = 1;
    RW = 0;
    EN = 1;
    delay(1);
    EN = 0;
}

void lcd_string(char *str) {
    while (*str) {
        lcd_char(*str++);
    }
}

void lcd_set_cursor(unsigned char row, unsigned char col) {
    unsigned char addr;
    if (row == 0)
        addr = 0x80 + col;
    else
        addr = 0xC0 + col;
    lcd_command(addr);
}

void step_motor(unsigned char pattern) {
    P1 = pattern;
    delay(speed / 10); // Control the speed by adjusting the delay
}

char key_scan() {
    unsigned char rows[] = {0xF7, 0xFB, 0xFD, 0xFE};
    unsigned char cols[] = {0xEF, 0xDF, 0xBF, 0x7F};
    unsigned char key_matrix[4][4] = {
        {'1', '2', '3', 'A'},
        {'4', '5', '6', 'B'},
        {'7', '8', '9', 'C'},
        {'*', '0', '#', 'D'}
    };
    unsigned char row, col;

    for (row = 0; row < 4; row++) {
        P3 = rows[row];
        for (col = 0; col < 4; col++) {
            if (!(P3 & cols[col])) {
                return key_matrix[row][col];
            }
        }
    }
    return '\0'; // No key pressed
}

void update_display() {
    lcd_set_cursor(0, 0);
    lcd_string("Speed:");
    lcd_char((speed / 1000) + '0');
    lcd_char(((speed % 1000) / 100) + '0');
    lcd_char(((speed % 100) / 10) + '0');
    lcd_char((speed % 10) + '0');
    lcd_string(" RPM");

    lcd_set_cursor(1, 0);
    lcd_string("Angle:");
    lcd_char((angle / 1000) + '0');
    lcd_char(((angle % 1000) / 100) + '0');
    lcd_char(((angle % 100) / 10) + '0');
    lcd_char((angle % 10) + '0');
    lcd_string(" DEG");
}

void main() {
    unsigned char patterns[] = {0x06, 0x0E, 0x1E, 0x3E, 0x3F, 0x2F};
    unsigned char key_pressed;
    unsigned char i;

    lcd_init();
    lcd_string("Init OK"); // Test message to check if LCD is working

    while (1) {
        key_pressed = key_scan();
        switch (key_pressed) {
            case '1':
                speed += 100;
                if (speed > 3000) speed = 3000;
                break;
            case '2':
                speed -= 100;
                if (speed < 0) speed = 0;
                break;
            case '3':
                angle += 10;
                if (angle > 9999) angle = 9999;
                break;
            case '4':
                angle -= 10;
                if (angle < 2) angle = 2;
                break;
            default:
                break;
        }

        update_display();

        for (i = 0; i < 6; i++) {
            step_motor(patterns[i]);
        }
    }
}

 

...全文

相关推荐

为何LCD1602只亮不显示数据,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

bug菌¹

产教融合实训基地与实践中心建设逻辑图-可编辑版

产教融合实训基地与实践中心建设逻辑图-可编辑版

龙猫与奥特曼

idea2025-free.zip

idea2025-free.zip

qq_45190508

sop基于灵敏度分析的有源配电网智能软开关优化配置升级1(Matlab代码实现)

内容概要:本文提出了一种基于灵敏度分析的有源配电网智能软开关(SOP)优化配置方法,旨在应对高比例分布式电源接入带来的电压波动与网络损耗加剧等问题。研究以IEEE33节点系统为算例,通过改进的灵敏度分析模型量化各节点对电压和功率流动的影响程度,进而构建SOP选址与定容的优化模型,实现降低网损、改善电压分布及提升系统运行灵活性的目标。全文详细阐述了灵敏度指标的数学推导、目标函数与约束条件的建模过程,并基于Matlab实现了完整的仿真求解流程,具备良好的工程实用性与学术参考价值。; 适合人群:电力系统及其自动化、电气工程等相关专业的硕士博士研究生、科研机构研究人员,以及从事智能配电网规划、运行与优化的工程技术人员。; 使用场景及目标:①研究分布式电源大规模接入背景下配电网的主动调控与优化策略;②指导智能软开关在实际配电网中的科学选址与容量配置;③为相关科研课题提供可复现的仿真案例,支撑学术论文撰写与算法验证。; 阅读建议:建议读者结合提供的Matlab代码与IEEE33节点标准模型进行动手实践,重点理解灵敏度指标的物理意义及其在优化模型中的应用逻辑,关注求解过程中的约束设置与算法收敛性,并可进一步拓展至SOP与储能联合配置、多时间尺度优化等复杂场景进行二次开发与研究。

荔枝科研社

Ubuntu安装Latex

关于Ubuntu安装Latex的详细记录和排错指南

Leers Ting
评论
收藏 已收藏
分享
返回顶部
2301_77114281
单片机/工控 27,522 成员 28,796 内容