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

📄 yj1602.h

📁 DS1302资料lcd.rar
💻 H
字号:
#include <avr/io.h>			//包含型号头文件
#include <util/delay.h>	
#define uchar unsigned char
#define uint unsigned int

#define LCDa_CTRL		PORTA	//1602控制端口定义
#define LCDa_CTRL_DDR	DDRA	//控制端口方向寄存器定义
#define LCDa_RS	       	PA4		//定义三个控制引脚
#define LCDa_RW			PA5
#define LCDa_E	       	PA6

#define LCDa_L1		0x80	//第一行的地址:0x80+addr ,addr为列数
#define LCDa_L2		0x80+0x40	//第二行的地址:0x80+0x40+addr

#define LCDa_CGRAM_ADDR	0x40	//CGRAM的开始地址
#define LCDa_CGMAX 	64			//CGRAM存储的最大字节数

#define LCDa_SET_RS			LCDa_CTRL|=_BV(LCDa_RS)	//三个控制管脚的控制操作
#define LCDa_SET_RW 		LCDa_CTRL|=_BV(LCDa_RW)
#define LCDa_SET_E  		LCDa_CTRL|=_BV(LCDa_E)
#define LCDa_CLR_RS 		LCDa_CTRL&=~_BV(LCDa_RS)
#define LCDa_CLR_RW 		LCDa_CTRL&=~_BV(LCDa_RW)
#define LCDa_CLR_E  		LCDa_CTRL&=~_BV(LCDa_E)

#define LCDa_DO			PORTB	//输出数据总线端口定义
#define LCDa_DI			PINB	//输入数据总线端口定义
#define LCDa_DATA_DDR	DDRB	//数据总线方向寄存器定义

#define LCDa_FUNCTION	0x38   	// 液晶模式为8位,2行,5*8字符

#define iDat	1		//数据标志
#define iCmd	0		//指令标志

#define LCDa_CLS	0x01		// 清屏
#define LCDa_HOME	0x02		// 地址返回原点,不改变DDRAM内容
#define LCDa_ENTRY 	0x06		// 设定输入模式,光标加,屏幕不移动
#define LCDa_C2L	0x10		// 光标左移
#define LCDa_C2R	0x14		// 光标右移
#define LCDa_D2L	0x18		// 屏幕左移
#define LCDa_D2R	0x1C		// 屏幕右移

#define LCDa_ON			0x0C	// 打开显示
#define LCDa_OFF		0x08	// 关闭显示
#define LCDa_CURON		0x0E	// 显示光标
#define LCDa_CURFLA		0x0F	// 打开光标闪烁
//void Delayus(uint);
//void Delayms(uint);
/*******************************************
函数名称: LCD1602_portini
功    能: 初始化1602液晶用到的IO口
参    数: 无
返回值  : 无
********************************************/
void LCD1602_portini(void)
{
	LCDa_CTRL_DDR |= _BV(LCDa_RS)|_BV(LCDa_RW)|_BV(LCDa_E);//配置控制管脚为输出
	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
}
/*******************************************
函数名称: LCD1602_readbyte
功    能: 从1602液晶读出一个字节数据或者指令
参    数: DatCmd--为iDat时是数据,为iCmd时是指令
返回值  : dByte--读回的数据或者指令
********************************************/
uchar LCD1602_readbyte(uchar DatCmd)
{
 	uchar dByte;
	if (DatCmd == iCmd)		 //指令操作
		LCDa_CLR_RS;
	else
		LCDa_SET_RS;
		
	LCDa_SET_RW;	   	  	 //读操作
	LCDa_SET_E;
	LCDa_DATA_DDR=0x00;	 //数据总线定义为输入
	dByte=LCDa_DI;			 //读数据或者指令
_delay_us(500);
//	Delayms(1);				 //时序调整
	LCDa_CLR_E;	
	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
	return dByte;
}
/*******************************************
函数名称: LCD1602_sendbyte
功    能: 向1602液晶写入一个字节数据或者指令
参    数: DatCmd--为iDat时是数据,为iCmd时是指令
	  	  dByte--为写入1602的数据或者指令
返回值  : 无
********************************************/
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
	if (DatCmd == iCmd)		//指令操作
		LCDa_CLR_RS;
	else
		LCDa_SET_RS;
		
	LCDa_CLR_RW;			//写操作
	LCDa_SET_E;
	LCDa_DO = dByte;		//写入数据
_delay_us(500);
//	Delayms(1);
	LCDa_CLR_E;	
}
/*******************************************
函数名称: LCD1602_sendstr
功    能: 向1602液晶写入一个字符串
参    数: ptString--字符串指针
返回值  : 无
********************************************/
void LCD1602_sendstr(uchar *ptString)
{
	while((*ptString)!='\0')		 //字符串未结束
	{
		LCD1602_sendbyte(iDat, *ptString++);
	}
}
/*******************************************
函数名称: LCD1602_clear
功    能: 1602液晶清屏
参    数: 无
返回值  : 无
********************************************/
void LCD1602_clear(void)
{
	LCD1602_sendbyte(iCmd,LCDa_CLS);
_delay_ms(1);
//	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
}
/*******************************************
函数名称: LCD1602_readBF
功    能: 1602液晶清屏
参    数: 无
返回值  : busy--为1时忙,为0时可以接收指令
********************************************/
uchar LCD1602_readBF(void)
{	  
	uchar busy;
	busy=LCD1602_readbyte(iCmd);		//读回BF标志和地址
	if(busy&0x80)						//忙
		busy=1;
	else	   							//不忙,可以写入
		busy=0;
	return busy;
}
/*******************************************
函数名称: LCD1602_gotoXY
功    能: 移动到指定位置
参    数: Row--指定的行
	  	  Col--指定的列
返回值  : 无
********************************************/
void LCD1602_gotoXY(uchar Row, uchar Col)
{	
/*	switch (Row)		  //选择行
	{
		case 2:
			LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break;	//写入第2行的指定列	
		default:
			LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break;	//写入第1行的指定列	
	}*/
	if(Row==1)
		LCD1602_sendbyte(iCmd, LCDa_L1+Col);
	if(Row==2)
		LCD1602_sendbyte(iCmd, LCDa_L2+Col);
}
/*******************************************
函数名称: LCD1602_initial
功    能: 1602液晶初始化
参    数: 无
返回值  : 无
********************************************/
void LCD1602_initial(void)
{
	uint8_t x=10;
	while(x--)
	_delay_ms(5);
//	Delayms(100);				// 等待内部复位
	LCD1602_portini();			//端口初始化
	
	LCD1602_sendbyte(iCmd, LCDa_FUNCTION);	// 功能、模式设定
	while(LCD1602_readBF());
	LCD1602_sendbyte(iCmd, LCDa_ON);		//打开显示
	while(LCD1602_readBF());
	LCD1602_clear();						//清屏
	while(LCD1602_readBF());
	LCD1602_sendbyte(iCmd, LCDa_ENTRY);	// 输入模式设定		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -