📄 lcd1602.h
字号:
/*********************************************************************************************************
** 文件功能 :LCD1602驱动程序
** 工程作者 :Blue Sky Teams——ZZL
** 工程版本 :V1.0
*********************************************************************************************************/
#include<intrins.h>
/*********************************************************************************************************
** LCD1602接口定义
*********************************************************************************************************/
sbit RS_1602 = P0^7; //数据命令选择端 我的口P2^6;P2^5;P2^7;
sbit RW_1602 = P0^6; //写选择端
sbit EN_1602 = P0^5; //使能信号
#define LCD_PORT P2 //LCD1602数据接口 我的口P0
/*********************************************************************************************************
** LCD1602宏定义指令集
*********************************************************************************************************/
#define CLEAR_SCREEN 0X01 //清屏
#define CURSOR_RESET 0X02 //光标复位
/*******************************************输入方式设置**************************************************/
#define SET_MOD 0X04 //配合一下两位来配置模式
#define SET_MOD_AC_ADD 0X02 //数据读写操作后AC自加一
#define SET_MOD_AC_DEC 0X00 //数据读写操作后AC自减一
#define SET_MOD_MOVE_ON 0X01 //数据读写操作后画面移动
#define SET_MOD_MOVE_OFF 0X00 //数据读写操作后画面不动
/*******************************************显示开关控制**************************************************/
#define DISPLAY_SET 0X08 //配合下面三位来配置模式
#define DISPLAY_SET_ON 0X04 //显示开
#define DISPLAY_SET_OFF 0X00 //显示关
#define DISPLAY_SET_CURSOR_ON 0X02 //光标显示开
#define DISPLAY_SET_CURSOR_OFF 0X00 //光标显示关
#define DISPLAY_SET_BLINK_ON 0X01 //光标闪烁
#define DISPLEY_SET_BLINK_OFF 0X00 //光标不闪烁
/*******************************************光标,画面位移************************************************/
#define COURSOR_SHIFT_LEFT 0X10 //光标左移一个字符位,AC减一
#define COURSOR_SHIFT_RIGHT 0X14 //光标右移一个字符位,AC加一
#define FRAME_SHIFT_LEFT 0X18 //画面左移一个字符位,光标不变
#define FRAME_SHIFT_RIGHT 0X1C //画面右移一个字符位,光标不变
/*******************************************显示功能设置**************************************************/
#define DISPLAY_MOD 0X30 //默认设置为8位数据口,配合一下两个位来时配置模式
#define DISPLAY_MOD_TWO_LINE 0X08 //两行显示
#define DISPLAY_MOD_ONE_LINE 0X00 //一行显示
#define DISPLAY_MOD_5_10 0X04 //5*10的点阵字符显示
#define DISPLAY_MOD_5_7 0X00 //5*7的点阵字符显示
/*******************************************自定义字符*****************************************************/
unsigned char code self_definition_char[] = {
0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00, //"一"代码
0x00,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00, //"二"代码
0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00, //"三"代码
0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00, //"四"代码
0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00, //"五"代码
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00, //"年"代码
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, //"月"代码
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, //"日"代码
};
/*******************************************CGRAM起始地址**************************************************/
const unsigned char CGRAM_ADD = 0X40;
/*********************************************************************************************************
** 函数功能 :读写LCD1602时用于读写时序的时钟延时
** 入口参数 :z:延时长度
** 出口参数 :无
*********************************************************************************************************/
void LCD_Delay(unsigned char z)
{
unsigned char x,y;
for(x = z;x > 0;x --)
for(y = 50;y>0;y--);
}
/*********************************************************************************************************
** 函数功能 :LCD1602忙碌查询
** 函数说明 :每次读写液晶时需要事先检测芯片是否处于忙碌状态
** 入口参数 :无
** 出口参数 :返回值为1:等待超时
** 返回值为0:芯片处于空闲状态
*********************************************************************************************************/
unsigned char Check_1602_Busy(void)
{
unsigned int time=0;
RS_1602 = 0;
RW_1602 = 1;
EN_1602 = 1;
while( (LCD_PORT&0X80) != 0X00)
{
time ++;
if(time > 1000) return 1;
}
return 0;
}
/*********************************************************************************************************
** 函数功能 :向液晶写入指令
** 函数说明 :
** 入口参数 :待写入的指令
** 出口参数 :无
*********************************************************************************************************/
void Write_1602_Com(unsigned char zhiling)//写指令
{
Check_1602_Busy();
RS_1602 = 0;
RW_1602 = 0;
LCD_PORT = zhiling;
LCD_Delay(1);
EN_1602 = 1;
LCD_Delay(1);
EN_1602 = 0;
}
/*********************************************************************************************************
** 函数功能 :向液晶写入数据
** 函数说明 :
** 入口参数 :待写入的数据
** 出口参数 :无
*********************************************************************************************************/
void Write_1602_Data(unsigned char shuju)//写数据
{
Check_1602_Busy();
RS_1602 = 1;
RW_1602 = 0;
LCD_PORT = shuju;
LCD_Delay(1);
EN_1602 = 1;
LCD_Delay(1);
EN_1602 = 0;
}
/*********************************************************************************************************
** 函数功能 :在指定位置连续写入一串字符
** 函数说明 :注意写入字符串的长度,不要超过屏幕单行的显示范围
** 入口参数 :number:待写入字符串地址
** addr: 写入整数的地址
** 出口参数 :无
*********************************************************************************************************/
void Write_1602_String(unsigned char *str,unsigned char addr)
{
Write_1602_Com(addr);
while(*str)
{
Write_1602_Data(*str);
str++;
}
}
/*********************************************************************************************************
** 函数功能 :在指定位置写入一个整数
** 函数说明 :整数的范围从0~65535,更大的需要采用long整型的进行扩展,注意整数的位数和地址不要超出显示范围
** 入口参数 :number:待写入的整数
** addr: 写入整数的地址
** 出口参数 :无
*********************************************************************************************************/
void Write_Num(unsigned int number,unsigned char addr)
{
Write_1602_Com(addr);
if(number/10000 != 0)
{
Write_1602_Data(0x30 + number/10000);
Write_1602_Data(0x30 + number%10000/1000);
Write_1602_Data(0x30 + number%1000/100);
Write_1602_Data(0x30 + number%100/10);
Write_1602_Data(0x30 + number%10);
}
else if(number/1000 != 0)
{
Write_1602_Data(0x30 + number/1000);
Write_1602_Data(0x30 + number%1000/100);
Write_1602_Data(0x30 + number%100/10);
Write_1602_Data(0x30 + number%10);
}
else if(number/100 != 0)
{
Write_1602_Data(0x30 + number/100);
Write_1602_Data(0x30 + number%100/10);
Write_1602_Data(0x30 + number%10);
}
else if(number/10 != 0)
{
Write_1602_Data(0x30 + number/10);
Write_1602_Data(0x30 + number%10);
}
else Write_1602_Data(0x30 + number);
}
/*********************************************************************************************************
** 函数功能 :向CGRAM写入自定义字符
** 函数说明 :DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
** | 0 | 1 | CGRAM的地址(6位) |
**
** DB5 DB4 DB3 为字符号,即要写入的第几个自定义字符
** DB2 DB1 DB0 为行号,即要定义的字符点阵的第几行,其字符取模方式为高位在前,从上到下,而且只有低5位有效,对应字符大小为5*8
** 自定义的字符数据存放在self_definition_char[]数组中
** 目前测试结果,写入CGRAM的地址0和1的数据无效,原因不详,其他6个字符可用
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void Write_CGRAM(void)
{
unsigned char i,j;
for (i = 0; i < 8; i ++)
{
for(j = 0;j < 8;j ++)
{
Write_1602_Com(CGRAM_ADD+i*8+j);
Write_1602_Data(self_definition_char[i*8+j]);
}
}
}
/*********************************************************************************************************
** 函数功能 :液晶初始化
** 函数说明 :用液晶之前需要先初始化液晶,配置对应的显示模式
** 入口参数 :time:需要延时的时间,单位ms
** 出口参数 :无
*********************************************************************************************************/
void LCD_1602_Init()//初始化
{
EN_1602=0;
Write_1602_Com(DISPLAY_MOD | DISPLAY_MOD_TWO_LINE | DISPLAY_MOD_5_7);//设置显示模式,两行显示,字符点阵大小为5*7:0X38
Write_1602_Com(DISPLAY_SET | DISPLAY_SET_ON | DISPLAY_SET_CURSOR_OFF | DISPLEY_SET_BLINK_OFF);//开显示,不显示光标,光标不闪烁:0X0F
Write_1602_Com(SET_MOD | SET_MOD_AC_ADD | SET_MOD_MOVE_OFF);//设置写入数据后指针AC加一,画面不动:0X06
Write_1602_Com(CLEAR_SCREEN);//清屏
Write_1602_Com(CURSOR_RESET);
Write_CGRAM();
Write_1602_Com(0x80);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -