51单片机lcd1602垂直滚动
时间: 2023-07-15 18:15:18 浏览: 58
51单片机LCD1602滚动显示
5星 · 资源好评率100%
要在51单片机的LCD1602上实现垂直滚动,需要使用LCD1602的自带滚动功能和51单片机的定时器中断。具体步骤如下:
1. 初始化LCD1602,设置显示模式为8位数据总线、2行显示、5x8点阵字体。
2. 在LCD1602上选定一个区域,设置该区域为可滚动区域,并设置滚动方向。
3. 在51单片机中开启定时器中断,设定一定的时间间隔。每次定时器中断时,在可滚动区域内写入新的数据,并将滚动地址向上移动一行,直到超出可滚动区域。
下面是一个简单的51单片机程序示例,实现LCD1602的垂直滚动:
```
#include <reg52.h>
#define LCD1602_DB P0
#define LCD1602_RS P2_0
#define LCD1602_RW P2_1
#define LCD1602_E P2_2
void lcd1602_init(void);
void lcd1602_command(unsigned char cmd);
void lcd1602_data(unsigned char dat);
void lcd1602_scroll(void);
void timer1_init(void);
unsigned char scroll_addr = 0xc0; // 可滚动区域的起始地址
void main()
{
lcd1602_init();
timer1_init();
while (1) {
lcd1602_scroll();
}
}
void lcd1602_init(void)
{
lcd1602_command(0x38); // 设置显示模式为8位数据总线、2行显示、5x8点阵字体
lcd1602_command(0x0c); // 设置显示模式为开显示、关光标、不闪烁
lcd1602_command(0x06); // 设置输入方式为增量、不移动
lcd1602_command(0x01); // 清屏
}
void lcd1602_command(unsigned char cmd)
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
void lcd1602_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
void lcd1602_scroll(void)
{
static unsigned char cnt = 0;
static unsigned char dat_buf[16] = {0}; // 可滚动区域的数据缓存
unsigned char i;
if (cnt == 0) {
for (i = 0; i < 16; i++) {
dat_buf[i] = i + 0x30; // 生成16个数字字符
}
}
lcd1602_command(scroll_addr); // 设置写入地址为可滚动区域的起始地址
for (i = 0; i < 16; i++) {
lcd1602_data(dat_buf[i]); // 写入新的一行数据
}
scroll_addr++; // 滚动地址向上移动一行
if (scroll_addr == 0xce) {
scroll_addr = 0xc0; // 在超出可滚动区域后,重新设置滚动地址为起始地址
}
cnt++;
if (cnt == 50) { // 定时器中断时间间隔为50ms
cnt = 0;
}
}
void timer1_init(void)
{
TMOD |= 0x10; // 设置定时器1为模式1
TH1 = 0xfc; // 设定定时器初值,50ms间隔
TL1 = 0x18;
TR1 = 1; // 启动定时器1
ET1 = 1; // 开启定时器1中断
EA = 1; // 开启总中断允许
}
void timer1_isr(void) interrupt 3
{
TF1 = 0; // 清除定时器1中断标志
}
```
这个程序会在LCD1602上显示16个数字字符,每隔50ms向上滚动一行。可以根据自己的需求修改垂直滚动的内容和时间间隔。
阅读全文