LCD.h
/******************************************************
*MCU at89s52
*晶振 12MHz
*LCD1602 4位数据线程序
* 端口名称 端口符号 MCU端口 LCD引脚
* RS数据/指令选择线 RS P0^0 4 P2^4
* R/W读写选择线 R/W GND 5 P2^5
* EN写使能线 EN PD0^1 6 P2^6
* 数据总线 D0-D3 NC 7-10
* D4 P1^4 11 P0^4
* D5 P1^5 12 P0^5
* D6 P1^6 13 P0^6
* D7 P1^7 14 P0^7
* 其他端口连接:
* 电源负 VSS 1
* 电源正+4.5--+5.5V VDD 2
* 对比度调节 VL 用1(10k左右电阻连接至地) 3
* 背光负 BLK VDD 15
* 背光正 BLA GND 16
*********************************************************************************/
#define uint unsigned int
#define uchar unsigned char
//#define disdata P0
//sbit RS=P2^4;
//sbit RW=P2^5;
//sbit LCD_EN=P2^6;
void delay_nms(uint z)//毫秒级延时函数
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++);
}
void write_num(uchar num) //写数据线命令(四线模式数据要分两次写)
{
disdata &= 0x0F; //清高四位端口
disdata |= (num&0xF0); //写高四位数据
delay_nms(2); //小于 2ms出现少首字符现象
LCD_EN = 1; //EN=1
LCD_EN = 0; //EN=0
disdata &= 0x0F; //清高四位端口
disdata |= ((num&0x0F)<<4); //写低四位数据
delay_nms(2);
LCD_EN = 1; //EN=1
LCD_EN = 0; //EN=0
}
void write_com(uchar com) //写指令
{
LCD_RS = 0;
LCD_RW = 0;
write_num(com);
}
void write_dat(uchar dat) //写函数
{
LCD_RS = 1;
LCD_RW = 0;
write_num(dat);
}
void LCD_init(void) //LCD初始化
{
delay_nms(15); //原来1602初始化成4位数据线之前必需先初始化成8位
write_com(0x33); //(此时命令发送方式是8位格式,但数据线只需接4位),
delay_nms(5); //然后再改到4位线宽,这样初始化才稳定
write_com(0x32);
delay_nms(5);
write_com(0x28); //四线模式设置
write_com(0x0f); //显示开--对应开关显示控制指令
write_com(0x01); //清屏--对应清屏指令
delay_nms(5);
}
void LCD_pos(uchar x,uchar y)//写地址函数
{
if(x)
write_com(0xc0+y); //第二行显示
else
write_com(0x80+y); //第一行显示
}
void LCD_write_char(uchar x,uchar y,uchar zifu) //写字符函数
{
LCD_pos(x,y);
write_dat(zifu);
}
void LCD_write_str(uchar x,uchar y,uchar *s)//写字符串函数
{
LCD_pos(x,y);
while(*s)
{
write_dat(*s);
s++;
}
}