单片机控制LCD显示屏实现消息向上滚屏代码
时间: 2023-11-12 14:04:18 浏览: 50
以下是一个基于51单片机的LCD向上滚屏代码,具体实现过程如下:
```c
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//定义LCD引脚
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
//定义显示区域
#define ROW 2
#define COL 16
//定义消息缓冲区
uchar message[ROW][COL+1];
/**
* @brief LCD控制函数
*
* @param cmd 命令字节
*/
void LcdWriteCmd(uchar cmd)
{
RS=0;
RW=0;
P0=cmd;
EN=1;
_nop_();
EN=0;
}
/**
* @brief LCD写数据函数
*
* @param dat 数据字节
*/
void LcdWriteDat(uchar dat)
{
RS=1;
RW=0;
P0=dat;
EN=1;
_nop_();
EN=0;
}
/**
* @brief 显示初始化函数
*
*/
void LcdInit()
{
LcdWriteCmd(0x38); //设置16×2显示模式,5×7点阵,8位数据接口
LcdWriteCmd(0x0c); //显示器开,光标关,光标闪烁关
LcdWriteCmd(0x06); //光标右移,DDRAM地址加1
LcdWriteCmd(0x01); //清屏,DDRAM地址设为00H
}
/**
* @brief 清屏函数
*
*/
void LcdClear()
{
LcdWriteCmd(0x01);
}
/**
* @brief 光标移动函数
*
* @param row 行号
* @param col 列号
*/
void LcdMoveCursor(uchar row, uchar col)
{
uchar addr;
if(row==0)
addr=0x80+col;
else
addr=0xc0+col;
LcdWriteCmd(addr);
}
/**
* @brief 向LCD屏幕写入一行信息
*
* @param row 行号
* @param message 消息内容
*/
void LcdWriteLine(uchar row, uchar* message)
{
LcdMoveCursor(row, 0);
while(*message)
{
LcdWriteDat(*message++);
}
}
/**
* @brief 初始化消息缓冲区
*
*/
void InitMessage()
{
uint i, j;
for(i=0;i<ROW;i++)
{
for(j=0;j<=COL;j++)
{
message[i][j]=' ';
}
}
}
/**
* @brief 将消息向上滚动一行
*
*/
void ScrollUp()
{
uint i, j;
for(i=0;i<ROW-1;i++)
{
for(j=0;j<=COL;j++)
{
message[i][j]=message[i+1][j];
}
}
for(j=0;j<=COL;j++)
{
message[ROW-1][j]=' ';
}
}
/**
* @brief 更新消息缓冲区的一行
*
* @param row 行号
* @param message 消息内容
*/
void UpdateMessage(uchar row, uchar* message)
{
uint j;
for(j=0;j<=COL;j++)
{
if(*message)
this->message[row][j]=*message++;
else
this->message[row][j]=' ';
}
}
/**
* @brief 更新LCD屏幕显示
*
*/
void UpdateScreen()
{
uint i, j;
for(i=0;i<ROW;i++)
{
LcdWriteLine(i, message[i]);
}
}
/**
* @brief 向消息缓冲区添加一行新消息
*
* @param message 消息内容
*/
void AddMessage(uchar* message)
{
ScrollUp();
UpdateMessage(ROW-1, message);
UpdateScreen();
}
/**
* @brief 主函数
*
*/
void main()
{
InitMessage();
LcdInit();
LcdClear();
LcdMoveCursor(0, 0);
LcdWriteLine(0, "Message Board");
while(1)
{
AddMessage("Hello World!");
DelayMs(2000);
AddMessage("Welcome to use!");
DelayMs(2000);
}
}
```
该代码通过维护一个大小为2×16的消息缓冲区实现了消息向上滚屏的效果。当添加一条新消息时,缓冲区中的消息会先向上滚动一行,然后更新最后一行的消息内容,并将整个屏幕重新绘制出来。该代码可以通过修改ROW和COL的值来适应不同大小的LCD屏幕。