|
//引脚定义
#define LCD_RS P21 // RS针,LCD数据/命令(H/L)选择端
#define LCD_RW P22 // R/W针,LCD读/写(H/L)选择端
#define LCD_EN P23 // E针,LCD使能信号高有效
#define LCD_DATA P0 // DB0~DB7针,LCD并行数据线
#define LCD_BUSY P07 // DB7针,LCD忙信号位
#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 0x05 //LCD显示(整屏)右移一位 0x05
#define LCD_RIGHT_MOVE 0x07 //LCD显示(整屏)左移一位 0x07
#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_BUSY_Bit(void)
** 功能描述: 等待忙信号消失
****************************************************************************************/
void LCD_BUSY_Bit(void)
{
bit byteData;
do
{//循环开始
LCD_EN = 0; //使能关
LCD_RS = 0; //指令方式
LCD_RW = 1; //读LCD
LCD_DATA = 0xFF; //拉高数据口电位
LCD_EN = 1; //使能开
byteData = LCD_BUSY; //取忙信号
}while(byteData); //循环终点 读到 忙位为0退出,否则继续读忙。
LCD_EN = 0; //使能关
}
/***************************************************************************************
** 函数名称: void LCD_Write_Instruction(unsigned char byteData)
** 功能描述: 写指令
** 输 入: unsigned char byteData
** 调用模块: void LCD_BUSY_Bit(void)
****************************************************************************************/
void LCD_Write_Instruction(unsigned char byteData)
{
LCD_BUSY_Bit(); //读忙
Delay_us(30); //微秒级延时
LCD_EN = 0; //使能关
LCD_RS = 0; //1:数据;0:指令
LCD__RW = 0; //1:读;0:写
LCD_DATA = byteData; //指令写入数据口
LCD_EN = 1; //使能开
Delay_us(30); //微秒级延时
LCD_EN = 0; //使能关
}
/***************************************************************************************
** 函数名称: void LCD_Write_DATA(unsigned char byteData)
** 功能描述: 写数据
** 输 入: unsigned char byteData 写数据
** 调用模块: void LCD_BUSY_Bit(void)
****************************************************************************************/
void LCD_Write_DATA(unsigned char byteData)
{
LCD_BUSY_Bit(); //读忙
Delay_us(30); //微秒级延时
LCD_EN = 0; //使能关
LCD_RS = 1; //1:数据;0:指令
LCD_RW = 0; //1:读;0:写
LCD_DATA = byteData; //数据写入数据口
LCD_EN = 1; //使能开
Delay_us(30); //微秒级延时
LCD_EN = 0; //使能关
}
/***************************************************************************************
** 函数名称: void LCD_1602_Setup(void)
** 功能描述: 初使化1602液晶
****************************************************************************************/
void LCD_1602_Setup(void)
{
LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); //AC自动增1,读写时画面不移动
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); //显示开,光标不显示
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); //双行显示
LCD_Write_Instruction(1); //清屏
}
/***************************************************************************************
** 函数名称: void LCD_1602_write_char(unsigned char x,unsigned char y,unsigned char dat )
** 功能描述: 单个字写入到第x(1,2)行y(0,15)列
** 输 入: unsigned char x 第x(1,2)行;unsigned char y(0,15)列;unsigned char *s要写ude字符
** 调用模块: LCD_write_instruction(),LCD_Write_DATA()
****************************************************************************************/
void LCD_1602_write_char(unsigned x,unsigned char y,unsigned char dat )
{
unsigned char i = 0;
x = (x-1)*0x40; //第几行
y = x+y; //第几列
LCD_write_instruction(0x80+y);
LCD_Write_DATA(dat); //写入字符串值
}
|
|