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

2301_77114281 2024-12-12 18:17:43

#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]);
        }
    }
}

 

...全文
129 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
前言: 先来说说DSP吧,DSP就是用数值计算的方式对信号进行加工的理论和技术,它的英文原名叫digital signal processor,简称DSP,即数字信号处理器。国内做DSP收音机比较早的是凯隆,后来两德也跟进了,包括神机DE1103的新版本也采用了DSP技术。 DSP收音机方案介绍: 本次选用的是的美国Silicon Labs公司推出的高集成度AM/FM收音机芯片。 DSP原理图截图: 它的功能十分丰富,包括自动搜台、自动校准、数字调谐、自适应噪声抑制能力等。此制作为方便用的是某宝的小模块,集成了晶振和其它外围元件,有10个口引出来方便业余焊接。 控制采用单片机STC12LE5A60S2。此单片机的低压版本,可以在较低的电压下工作,方便使用一节锂电池供电。显示用的的LCD5110,此LCD能显示丰富的信息,包换信号强度,信噪比,音量,频率,电池电量等。 改变频率和音量都用一个飞梭来控制。用飞梭自带的开关来切换是调节音量还是频率,最大化地简化系统。 电路框图如图所示: DSP收音机电路工作原理分析: DSP收音机电路电路运用单片机对DSP芯片发出指令,对DSP内部寄存器进行读写(采用IIC总线方式),完成了接收模式、频率、音量等设置,再从中读出接收的状态,包括信号强度,接收信噪比等,然后将这些信息显示在LCD上面,再利用自身的AD对电池电压进行检测,计算出电池电量一同显示在LCD上面。 运用了飞梭来输入信号,默认状态飞梭是调节频率的,频率步进FM为0.1MHz,AM为9KHz。按一下飞梭进入音量调节模式,旋转飞梭即能改变音量。再按一下或者不动一定时间,会转换回频率调节模式。进入音量调节模式时,表示音量大小的数字会闪烁提示使用者此刻是音量调节模式。 电路设计了两个按键开关,一个是FM/AM模式切换的,一个是AM带宽切换的。DSP芯片处理完的信号是音频信号,利用X8003音频功率放大IC放大即可推动喇叭发出声音。 此收音机供电采用一节18650电池进行供电,充电采用4056E模块,如图6所示,充电状态红灯,充满后绿灯,如图7、图8所示。全机静态电流为40mA,比模拟方案的稍高一点,与单片机未做省电处理有关,选用低功耗的单片机静态电流应该能降到更低的水平。 DSP收音机电路截图: 视频演示: 该DSP收音机电路接收效果: 此收音机FM灵敏度很高,一根30cm的拉杆天线就能将所有强台清晰接收,比9700DX接近1M长的拉杆天线相当不相上下,对9700DX无能为力的弱电,也能清楚接收,信噪比3db.选择性上,因本地电台不多,没有相邻的电台,无法测试,但调偏0.1MHz信号强度和信噪比立马下降许多,还能听到一丝电台的声音,调偏0.2MHz就无法听到了。所以说FM是完胜。AM效果就很一般了,只能收到本地强台,其它的台都淹没在噪声中,不知是算法的原因还是些芯片的特点就是这样。所以AM是9700DX完胜。 DSP收音机实物效果图: 总结: 就接收性能而言,FM接收DSP有先天的优势,模拟的要做到DSP的指标恐怕需要的成本是相当高的,AM而言,传统的模拟方式的对业余的爱好者或许是个比较理想的选择。

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧