.设计一LCD1602左移滚动显示系统。且休票求. (1)在LCD1602的某行(试卷中指定)自右向左滚动显示字符串 2 “I love 51 SCM!”,要求显示过程字符串从无到有自右边出现,直 到从左边完全消失,然后循环显示该过程; (2)数字滚动速度由某定时器(试卷中指定)定时中断实现(1~10秒滚动一位,试卷中指定): (3)系统中所用到的引脚端口试卷中指定。
时间: 2023-06-25 18:03:37 浏览: 320
这里给出一份基于51单片机和C语言的LCD1602左移滚动显示系统代码,供参考:
```c
#include <reg51.h>
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_E P2_2
#define LCD_DATA P0
unsigned char code display_string[] = "I love 51 SCM!";
unsigned char display_index = 0;
unsigned char display_position = 0;
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 125; j++);
}
void lcd_write_cmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
LCD_E = 1;
delay_ms(5);
LCD_E = 0;
}
void lcd_write_data(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = dat;
LCD_E = 1;
delay_ms(5);
LCD_E = 0;
}
void lcd_init()
{
lcd_write_cmd(0x38);
lcd_write_cmd(0x0c);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);
}
void lcd_display_string(unsigned char row, unsigned char col, unsigned char *str)
{
unsigned char i;
if (row == 0)
lcd_write_cmd(0x80 | col);
else
lcd_write_cmd(0xc0 | col);
for (i = 0; str[i] != '\0'; i++)
lcd_write_data(str[i]);
}
void timer_init()
{
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x66;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void timer_isr() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x66;
if (++display_position > 15)
{
display_position = 0;
if (++display_index >= sizeof(display_string) - 1)
display_index = 0;
}
lcd_display_string(0, 0, display_string + display_index);
}
void main()
{
lcd_init();
timer_init();
while(1);
}
```
代码解释:
1. 定义了LCD1602的引脚端口,以及显示用的字符串和相关变量。
2. 定义了延迟函数 `delay_ms()`,用于实现定时器中断中的时间延迟。
3. 定义了LCD1602的基本操作函数 `lcd_write_cmd()` 和 `lcd_write_data()`,用于向LCD发送指令和数据。
4. 定义了初始化函数 `lcd_init()`,用于初始化LCD的工作模式。
5. 定义了显示函数 `lcd_display_string()`,用于在LCD上指定位置显示字符串。
6. 定义了定时器初始化函数 `timer_init()`,用于初始化定时器以及中断相关的配置。
7. 定义了定时器中断函数 `timer_isr()`,用于实现LCD的滚动显示效果。
8. 在 `main()` 函数中初始化LCD和定时器,并进入死循环等待中断事件的发生。
使用时,只需要将代码烧录到51单片机上,按照试卷中指定的引脚端口连接LCD1602即可。代码中还可以根据需要调整定时器中断的时间间隔和滚动速度。