





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






关注结合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和按键。如果您的代码仍然报错,请提供具体的错误信息,以便我们帮助您进一步解决问题。