📄 1602驱动程序.txt
字号:
LCD1602液晶驱动程序
//-----------------------------------------------------
// lcd_1602
// 创建者:黄茶勇 时间:2006年4月22日
// 说明:
//-----------------------------------------------------
// 0x01 //清屏指令
// 0x02 //光标复位指令
// 0x04 //字符不移,光标左移
// 0x06 //字符不移,光标右移
// 0x05 //字符移,光标左移
// 0x07 //字符移,光标右移
// 0x10 //移动光标
// 0x18 //移动字符
//显示开关控制 ,以下几条(指令)按位或,就可得组合
// 0x0e //整体显示开,光标开
// 0x08 //整体显示关
// 0x0c //整体显示开,光标关
// 0x0f //整体显示开,光标开,光标闪烁
// 0x0e //整体显示开,光标开,光标不闪烁
// 0x20 //4位总线,1行显示,5*7字符
// 0x28 //4位总线,2行显示,5*7字符
// 0x24 //4位总线,1行显示,5*10字符
// 0x2c //4位总线,2行显示,5*10字符
// 0x30 //8位总线,1行显示,5*7字符
// 0x38 //8位总线,2行显示,5*7字符
// 0x34 //8位总线,1行显示,5*10字符
// 0x27 //8位总线,2行显示,5*10字符
//------------------------------------------
#i nclude "reg51.h"
#i nclude <string.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_CLR 0x01 //清屏指令
#define CURSOR_REST 0x02 //光标复位指令
//光标和显示模式设置,以下几条(指令)按位或,就可得组合
#define CURSOR_MOV_L 0x04 //光标左移
#define CURSOR_MOV_R 0x06 //光标右移
#define CHAR_MOV_N 0x04 //字符不移
#define CHAR_MOV_Y 0x05 //字符移
#define CURSOR_MOV 0x10 //移动光标
#define CHAR_MOV 0x18 //移动字符
//显示开关控制 ,以下几条(指令)按位或,就可得组合
#define ALL_ON 0x0c //整体显示开
#define ALL_OFF 0x08 //整体显示关
#define CURSOR_ON 0x0a //光标开
#define CURSOR_OFF 0x08 //光标关
#define CURSOR_SS 0x09 //光标闪烁
#define CURSOR_BS 0x08 //光标不闪烁
//功能设置命令
#define BUS_4BIT 0x20 //4位总线
#define BUS_8BIT 0x30 //8位总线
#define LINE_1 0x20 //1行显示
#define LINE_2 0x28 //2行显示
#define CHAR5_7 0x20 //5*7字符
#define CHAR5_10 0x24 //5*10字符
//-----------------引脚接线图-------------
#define data_out P0
sbit LCD_E=P3^2;
sbit LCD_RW=P3^1;
sbit LCD_RS=P3^0;
sbit BF=P0^7;
uchar code tab_du[]={0x16,0x09,0x18,0x18,0x18,0x09,0x06,0x00,}; //℃符号
//-----------------函数定义----------------
void delay(uint); //延时
void LCD_init(void); //液晶初始化
void w_LCD_comm(uchar); //写入命令子程序
void w_LCD_dat(uchar); //写入数据
void LCD_busy(void); //判忙
void write_LCD_char(uchar,uchar,uchar); //写字符
void write_LCD_str(uchar,uchar,uchar); //写字符串
uchar num_to_char(uchar);
//----------------------------------------
//函数名称: delay
//功能描述:延时(N*8+6)μs
//----------------------------------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++);
}
//----------------------------------------
//函数名称:LCD_busy
//功能描述:判忙函数
//----------------------------------------
void LCD_busy(void)
{
while(1)
{
data_out=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
if(!BF)break; //如果BF忙标志位为1,则忙,则等待
LCD_E=0;
}
}
//----------------------------------------
//函数名称:w_LCD_command
//功能描述:写入命令
//----------------------------------------
void w_LCD_comm(uchar comm)
{
LCD_busy();
data_out=comm;
LCD_RS=0;
LCD_RW=0;
LCD_E=0; //E,下降沿触发
}
//----------------------------------------
//函数名称:input_data
//功能描述:写入数据
//----------------------------------------
void w_LCD_dat(uchar dat)
{
LCD_busy();
data_out=dat;
LCD_RS=1;
LCD_RW=0;
LCD_E=1;
LCD_E=0; //E,下降沿触发
}
//----------------------------------------
//函数名称: LCD_init
//功能描述:液晶初始化
//----------------------------------------
void LCD_init(void)
{
LCD_RW=0;
LCD_RS=0;
LCD_E=0;
w_LCD_comm(BUS_8BIT|LINE_2|CHAR5_7); //8位数据,二行,5*7
delay(10);
w_LCD_comm(ALL_ON|CURSOR_ON|CURSOR_SS); //显示开,光标开,光标闪
w_LCD_comm(CURSOR_MOV_R|CHAR_MOV_N); //光标右移,字不移
w_LCD_comm(LCD_CLR); //清屏
w_LCD_comm(0x80); //地址0
}
//----------------------------------------
//函数名称:num_to_char
//功能描述:将数字转为字符
//----------------------------------------
uchar num_to_char(uchar num)
{
return(num+'0');
}
//----------------------------------------
//函数名称:write_char
//功能描述:写入字符
//----------------------------------------
void write_LCD_char(uchar x,uchar y,uchar dat)
{
if(y==0)
{
w_LCD_comm(0x80+x);
}
else
{
w_LCD_comm(0xc0+x);
}
w_LCD_dat(dat);
}
//----------------------------------------
//函数名称:write_str
//功能描述:写入字符串,x为字,y为行
//----------------------------------------
void write_LCD_str(uchar x,uchar y,uchar *p_str)
{
uchar i;
i=strlen(p_str);
while(i!=0)
{
if(x>=16) //如果写完一行,下一行(首字)
{
y++;
x=0;
}
if(y>=2)break; //如果写了二行,不写了,
write_LCD_char(x,y,*p_str); //写
x++; //写下一个字
i--; //字数减1
p_str++; //字符串中下一个字符
}
}
//----------------------------------------
//函数名称:write_CGRAM
//功能描述:向CGRAM写入数据,add为首地址,size为字符的个数
//----------------------------------------
void write_CGRAM(unsigned char add,unsigned char *p_tab,unsigned char size)
{
unsigned char lenth=0;
lenth=size*8; //每个字符,8个码
add=0x40+8*add; //CGRAM的地址D5位要为1
while(lenth!=0)
{
if(add>=0x80) //CGRAM的地址到顶
break;
w_LCD_comm(add); //写CGRAM地址
w_LCD_dat(*p_tab); //写CGRAM数据
lenth--; //下一个码
add++; //下个地址
p_tab++; //下个字符
}
}
//----------------------------------------
//函数名称:主函数
//功能描述:调用各子函数
//----------------------------------------
void main(void)
{
LCD_init();
num_to_char(0);
while(1)
{
write_CGRAM(0,tab_du,1); //写℃符号
write_LCD_str(0,0,"By huangchayong 2006-03-30"); //x:0 y:0,第1行(y),第1个字(x)
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -