⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.h

📁 巡光小车程序
💻 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 + -