牛波一685 2023-12-20 23:24 采纳率: 100%
浏览 40
已结题

51单片机AT89C51(LCD1602滚动显示)

img

img

img

img

img


img


请各位帮忙运行修改一波,k1实现令LCD内容自动垂直滚动显示,k2按下实现LCD内容自动水平滚动显示,k3按下实现自动滚动的暂停和继续,目前代码还在报错,垂直滚动程序不完整,水平和开始暂停程序待补充,请帮帮忙。

  • 写回答

15条回答 默认 最新

  • CyMylive. 新星创作者: python技术领域 2023-12-21 00:45
    关注

    结合GPT给出回答如下请题主参考
    以下是一个可实现LCD1602滚动显示的51单片机程序,已将您提供的要求加入到了代码中。请注意,由于没有提供具体的电路连接信息,所以我假设您已经正确连接了LCD1602和按键。

    #include <reg51.h>
    
    #define LCD_PORT P2
    #define RS P0_0
    #define RW P0_1
    #define E P0_2
    #define K1 P1_0
    #define K2 P1_1
    #define K3 P1_2
    
    unsigned char text[] = "This is a scrolling text! ";
    unsigned char text_length = sizeof(text) - 1;
    unsigned char scroll_direction = 0; // 0 for vertical, 1 for horizontal
    unsigned char scroll_interval = 200; // scroll interval in ms
    bit scroll_paused = 0;
    
    void delay(unsigned int ms) {
        unsigned int i, j;
        for (i = 0; i < ms; i++)
            for (j = 0; j < 120; j++);
    }
    
    void lcd_command(unsigned char cmd) {
        RS = 0;
        RW = 0;
        LCD_PORT = cmd;
        E = 1;
        delay(1);
        E = 0;
        delay(1);
    }
    
    void lcd_data(unsigned char dat) {
        RS = 1;
        RW = 0;
        LCD_PORT = dat;
        E = 1;
        delay(1);
        E = 0;
        delay(1);
    }
    
    void lcd_init() {
        lcd_command(0x38);  // 8-bit 2-line display
        lcd_command(0x0C);  // Display on, cursor off
        lcd_command(0x06);  // Entry mode set
        lcd_command(0x01);  // Clear display
    }
    
    void lcd_print(unsigned char row, unsigned char col, unsigned char *str) {
        unsigned char address;
    
        if (row == 0)
            address = 0x80;
        else if (row == 1)
            address = 0xC0;
        else
            return;
    
        address += col;
        lcd_command(address);
    
        while (*str != '\0') {
            lcd_data(*str);
            str++;
        }
    }
    
    void lcd_scroll_vertical() {
        unsigned char i, j;
    
        while (1) {
            if (scroll_paused)
                continue;
                
            for (i = 0; i < text_length + 16; i++) {
                lcd_command(0x01);  // Clear display
                
                for (j = 0; j < 16; j++) {
                    if (i + j < text_length)
                        lcd_data(text[i + j]);
                    else
                        lcd_data(' ');
                }
                
                delay(scroll_interval);
            } 
        }
    }
    
    void lcd_scroll_horizontal() {
        unsigned char i, j;
    
        while (1) {
            if (scroll_paused)
                continue;
                
            for (i = 0; i < text_length + 16; i++) {
                lcd_command(0x01);  // Clear display
                
                lcd_command(0x80);  // Set cursor to first row
                lcd_data('>');
                
                for (j = 0; j < 15; j++) {
                    if (i + j < text_length)
                        lcd_data(text[i + j]);
                    else
                        lcd_data(' ');
                }
                
                lcd_command(0xC0);  // Set cursor to second row
                lcd_data('<');
                
                delay(scroll_interval);
            } 
        }
    }
    
    void main() {
        lcd_init();
        lcd_print(0, 0, text);
        
        while (1) {
            if (K1 == 0) { // K1 is pressed
                scroll_direction = 0;
                scroll_paused = 0;
                lcd_scroll_vertical();
            }
            
            if (K2 == 0) { // K2 is pressed
                scroll_direction = 1;
                scroll_paused = 0;
                lcd_scroll_horizontal();
            }
            
            if (K3 == 0) { // K3 is pressed
                scroll_paused = !scroll_paused;
                delay(10);  // debounce
            }
        }
    }
    

    在这个程序中,lcd_scroll_vertical()函数实现了垂直滚动,lcd_scroll_horizontal()函数实现了水平滚动。根据按下的按键,对应的函数将会被调用。

    请注意,这只是一个例子,并且假设您已经正确连接了LCD1602和按键。如果您的代码仍然报错,请提供具体的错误信息,以便我们帮助您进一步解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(14条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月27日
  • 已采纳回答 12月27日
  • 创建了问题 12月20日