51单片机-液晶1602
初始化设置:



RAM地址映射图:

写操作时序:

实现两行显示,从左向右滑动。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
uint i;
uchar code table[] = "I LOVE MCU!";
uchar code table1[]="WWW.TXMCU.COM";
void delay(uint t){
int i,j;
for(i = 0; i < t; i++)
for(j = 200; j > 0; j--)
;
}
void lcd_com(uchar s){
RS = 0; //低电平,写指令
P2 = s; //传数据
delay(14); //看时序图,数据需要稳定一段时间
E = 1; //给一个高脉冲,发送命令
delay(14); //如图,高脉冲延时一段时间,确保命令发送
E = 0; //发送结束E置为低电平
}
void lcd_data(uchar s){
RS = 1;
P2 = s;
delay(14);
E = 1;
delay(14);
E = 0;
}
void init(){
RS = 1; //先发指令,在初始时刻RS是高,E和RW是低
E = 0;
RW = 0;
lcd_com(0x38); //设置为16*2显示,5*7点阵,8位数据接口
lcd_com(0x0f); //开显示,显示光标,光标闪烁
lcd_com(0x06); //读写一个字符后地址指针加一
lcd_com(0x01);
lcd_com(0x80+0x10); //显示屏幕对应一块RAM,屏幕外面还有一块RAM
for(i = 0; i < 11; i++){ //设置地址为屏幕外的RAM,以便实现滚动效果
RS = 0;
lcd_data(table[ i]);
delay(40);
}
lcd_com(0x80+0x50);
for(i = 0; i < 13; i++){
RS = 0;
lcd_data(table1[ i]);
delay(40);
}
for(i = 0; i < 13; i++){
lcd_com(0x18); //0x18,向左移动显示,光标跟着移动
delay(200);
}
}
void main(){
init();
while(1);
}
评论