芯片功能及特性
1、引脚及使用.
VDD 电源正接5V电压
VSS 电源负接地
VEE(VL)液晶显示偏压信号,通过下图可变电阻,给VSS供不通电压,以调节对比度。对比度过低,亮区和未亮区无法区分;
2、内部芯片逻辑
时序
读操作时序
1、先置E=0
2、再设置 RS RW
3、再经过tsp1至少30ns(为了数据的有效建立),51单片机无需延时,其他运行速度快的MCU需要延时;
4、拉高E
5、再经过tpw至少150ns(为了数据的有效读取),根据主机运行语句速度判断是是否加延时;_nop_();
6、读取数据;
7、拉低E;(作读写保护,防止异常)
8、全程都在使用RS RW E,因此无需考虑拉高电平保持在引脚常态;
写操作时序
1、先置E=0
2、再设置 RS RW
3、写入数据到引脚,最好在RSRW写入后再写入数据
4、再经过tsp2至少40ns(为了数据的有效建立);
5、才可拉高E
6、再经过tpw至少150ns(为了数据的有效读取);
7、拉低E;(作读写保护,防止异常)
8、全程都在使用RS RW E,因此无需考虑拉高电平保持在引脚常态;
1、忙检测及AC值的读取。
//忙检测函数
#define LCD1602_DATA P0 //LCD的数据口
sbit LCD1602_BUSY=LCD_DATA^7; //LCD忙信号位
int code LCD1602_AC_read;
void LCD1602_busy(void) //检测LCD状态,看它是不是还在忙呢
{
while(1)
{
LCD1602_EN=0;
LCD1602_RS=0; //RS、RW为01,也只有忙检测或读取AC值时
LCD1602_RW=1;
LCD1602_DATA=0xff;
LCD1602_EN=1; //属于读数据 EN上升沿触触,读完之后回低电平
if(!LCD_BUSY)
{
AC_read=LCD_DATA; //读取AC值,若无需读取AC可删去
break; //忙就循环直到不忙中断
}
}
LCD_EN=0;
}
1、写数据指令
写数据指令分为写数据到LCD1602和写指令到1602;
void Lcd1602_Write_Data(unsigned char dat) //写数据
{
LCD1602_busy();
LCD1602_RS = 1;
LCD1602_RW = 0; //RS、RW为01,也只有写数据时
LCD1602_DB = dat;
LCD1602_EN = 1; //属于写数据 EN=0写入引脚,再EN拉高写入LCD1602,再下降LCD写入LCD1602结束
LCD1602_EN = 0;
}
void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD
{
unsigned char i=0;
while(lcd_string[i]!=0x00)
{
LCD_write_data(lcd_string[i]);
i++;
}
}
void LCD_WriteCommand(unsigned char Command) //写指令 与写数据的区别在于RS RW 不同
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DataPort = Command;
LCD_E = 1;
Delay1ms();
LCD_E = 0;
Delay1ms();
}
3、读数据存在问题,待详细
#define LCD1602_DATA P0 //LCD的数据口
sbit LCD1602_BUSY=LCD_DATA^7; //LCD忙信号位
int code LCD1602_AC_read;
void LCD1602_busy(void) //检测LCD状态,看它是不是还在忙呢
{
LCD1602_busy();
LCD1602_EN=0;
LCD1602_RS=1; //RS、RW为01,也只有忙检测或读取AC值时
LCD1602_RW=1;
LCD1602_DATA=0xff;
LCD1602_EN=1; //属于读数据 EN上升沿触触,读完之后回低电平
AC_read=LCD_DATA; //读取AC值,若无需读取AC可删去
LCD_EN=0;
}
}
初始化设置
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开
#define LCD_DISPLAY_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //光标显示
#define LCD_CURSOR_OFF 0x08 //光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
void LCD_initial(void) //初始化LCD
{
LCD_write_instruction(LCD_AC_AUTO_DECREASE|LCD_MOVE_DISENABLE); //自动增1 画面不移动 (LCD_AC_AUTO_DECREASE|LCD_MOVE_DISENABLE)
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); //显示开,光标不显示
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); //两行显示
LCD_cls(); //清屏
}
函数集
初始化函数
写一个字符函数
写一串字符函数
写入显示地址函数
写数据到CGRAM函数