
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int#define LCD_Data P0 // - - P0 = DB0锝濪B7sbit LCD_RS=P3^5;
sbit LCD_RW=P3^6;
sbit LCD_E=P3^4;uchar code str1[] = {" Jia****heng "};
uchar code str2[] = {" 159xxxx5255 "};void LCD_Write_Cmd(uchar Cmd);
void LCD_Write_Data(uchar Dat);
void LCD_Delayms(uchar xms);
void LCD_Check_Busy();
void LCD_Init();
void LCD_GoXY(uchar x,uchar y);
void LCD_Write_Str(uchar str[]);//DELAY FUNCTION
void LCD_Delayms(uchar xms)
{uchar j;while(xms--)for(j=0;j<100;j++);}/****************** 忙检测 *********************
LCD_Data 与 0x80 进行或运算,判断 bit7 位状态若 LCD_Data 的 bit7 位是 0,则 LCD 不忙
若 LCD_Data 的 bit7 位是 1,则 LCD 忙
***********************************************/
void LCD_Check_Busy(){uchar temp;LCD_Data = 0xff; // 十六进制:1111 1111LCD_RS = 0; // 0 指令LCD_RW = 1; // 1 读do{LCD_E = 1; // 拉高temp = LCD_Data; // 将 LCD 状态保存在 temp 中,用于判忙LCD_E = 0; // 负跳变使能 }while(temp & 0x80); // 结果为 1,LCD 忙,继续循环;结果为 0,LCD 不忙,可以进行后面的操作
}/****************** 写命令 *********************
RS=0 指令
RW=0 写操作
E=0 开始为 0
写入指令(给单片机 P0 端口)
延时 2ms
E=1 拉高
延时5ms,写入指令有效
E=0 负跳变,指令写入LCD
***********************************************/
void LCD_Write_Cmd(uchar Cmd){LCD_Check_Busy(); // 判忙LCD_RS = 0; // 0 指令LCD_RW = 0; // 0 写LCD_E = 0;LCD_Data = Cmd; // 送指令LCD_Delayms(2);LCD_E = 1; // 拉高LCD_Delayms(5);LCD_E = 0;
}/****************** 写数据 *********************
RS=1 数据
RW=0 写操作
E=0 开始为 0
写入数据(给单片机 P3 端口)
延时 2ms
E=1 拉高
延时 7ms,写入数据有效
E=0 负跳变,数据写入LCD
***********************************************/
void LCD_Write_Data(uchar Dat){LCD_Check_Busy(); // 判忙LCD_RS = 1; // 1 数据LCD_RW = 0; // 0 写LCD_E = 0;LCD_Data = Dat; // 送数据LCD_Delayms(2);LCD_E = 1; // 拉高LCD_Delayms(7);LCD_E = 0;
}/****************** 初始化 *********************
指令1 ——清屏
指令3 ——AC加1,画面不动
指令4 ——显示开,光标关,闪烁关
指令6 ——8位数据接口,两行显示,5X7点阵
指令8 ——从第一行第一列开始显示
***********************************************/
void LCD_Init(){LCD_Write_Cmd(0x01); // 指令1 ——清屏LCD_Write_Cmd(0x06); // 指令3 ——AC加1,画面不动 LCD_Write_Cmd(0x0c); // 指令4 ——显示开,光标关,闪烁关 LCD_Write_Cmd(0x38); // 指令6 ——8位数据接口,两行显示,5X7点阵LCD_Write_Cmd(0x80); // 指令8 ——从第一行第一列开始显示
}
//移动光标
void LCD_GoXY(uchar x,uchar y){if(y==0x01) LCD_Write_Cmd(x|0x80); if(y==0x02) LCD_Write_Cmd(x|0xc0);
}
//显示字符串
void LCD_Write_Str(uchar str[]){uchar num = 0; while (str[num]) { LCD_Write_Data(str[num++]); LCD_Delayms(200);}
}void main(void)
{LCD_Init();while (1) { LCD_GoXY(0, 1); //第一行显示 LCD_Write_Str(str1); LCD_GoXY(0, 2); //第二行显示 LCD_Write_Str(str2); }
}