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

📄 lcm12864.h

📁 AVR_Meag16热敏电阻NTC测温程序
💻 H
字号:
//*******************************************************************************
//*文件:lcm12864.h 	                       										*  
//*说明:lcm12864液晶(带字库)驱动函数库 7920控制器	8位并口方式驱动				*
//*平台:AVR																		*	
//*作者:陈崇                              										* 
//*建立:2006-12-20											                    *
//*修改:2007-5-26																*
//*******************************************************************************


#ifndef _LCM12864_DRIVER_
#define _LCM12864_DRIVER_


#define	LCD_DB_OUT			PORTC					// LCD数据端口	
#define	LCD_DB_SET_OUT		DDRC=0xFF				// 设置数据端口为输出
#define	LCD_DB_SET_IN		DDRC=0x00				// 设置数据端口为输入
#define	LCD_RST_SBI	 		PORTD|=_BV(PD1)			// RST置位
#define	LCD_RST_CBI	 		PORTD&=~_BV(PD1) 		// RST清零9
#define LCD_PSB_SBI			PORTD|=_BV(PD7)			// PSB置位
#define LCD_PSB_CBI			PORTD&=~_BV(PD7)		// PSB清零
#define	LCD_E_SBI			PORTA|=_BV(PA5)			// E置位
#define	LCD_E_CBI			PORTA&=~_BV(PA5)		// E清零
#define	LCD_RW_SBI	 		PORTA|=_BV(PA6)  	 	// RW置位	  				 
#define	LCD_RW_CBI	 		PORTA&=~_BV(PA6)    	// RW清零
#define	LCD_RS_SBI	 		PORTA|=_BV(PA7)			// RS置位
#define	LCD_RS_CBI	 		PORTA&=~_BV(PA7)		// RS清零
#define LCD_BF				PINC&_BV(PINC7)			// 忙碌标志位
 
//***********************************************************************
//*名称: void delay_nms(unsigned int nms)  								*	 
//*功能: 延时nms					       								*
//*参数: 无     		                   								*
//*返回: 无		                           								*
//***********************************************************************
void delay_nms(unsigned int nms)
	{	
		for(;nms>0;nms--)
			{
				_delay_loop_2(2000);
			}
	}
//***********************************************************************
//*名称: void lcm12864_check_busy(void)      							* 
//*功能: 检查lcm12864忙碌子程序            								*
//*参数: 无		                           								*
//*返回: 无                                								*
//***********************************************************************
void lcm12864_check_busy(void)
	{
		LCD_DB_SET_IN;
		LCD_DB_OUT=0xFF;
		LCD_RS_CBI;             		//	显示指令
		LCD_RW_SBI;             		//	读数据
		LCD_E_SBI;              		//	读写使能
		while(LCD_BF);					//	判断忙碌标志位
		LCD_E_CBI;						//	读写使能关闭
		LCD_DB_SET_OUT;
		
	} 
//***********************************************************************
//*名称: void lcm12864_wirte_cmd(unsigned char command)         	* 
//*功能: 往lcm12864写指令子程序           								*
//*参数: command 字符型 指令代码          								*
//*返回: 无		                          								*
//***********************************************************************
void lcm12864_wirte_cmd(unsigned char command)
	{
		lcm12864_check_busy();				//	检查LCD是否忙碌
		LCD_DB_SET_OUT;
		LCD_RS_CBI;              			//	显示指令
		LCD_RW_CBI;              			//	写数据
		LCD_DB_OUT=command;		
		LCD_E_SBI;
		asm("nop"::);
		LCD_E_CBI;
	}
//***********************************************************************************
//*名称: unsigned char lcm12864_read_data(void)            										   	*
//*功能: 从lcm12864读数据子程序         										   	*  
//*参数: 无                             										   	*
//*返回: lcm12864_data 字符型 读取数据  										   	*
//***********************************************************************************	
unsigned char lcm12864_read_data(void)
{
	unsigned char rev_data;
	lcm12864_check_busy();
	LCD_RS_SBI;             			 //显示数据
	LCD_RW_SBI;             			 //读数据
	LCD_E_SBI;
	rev_data=LCD_DB_OUT;
	LCD_E_CBI;
	return rev_data;
}
//***********************************************************************************
//*名称: lcm12864_wirte_data(unsigned char data_byte)		  					*
//*功能: 往lcm12864写数据															*	
//*参数: lcm12864_data 要写入的数		  											*
//*返回: 无				  															*	
//***********************************************************************************
void lcm12864_wirte_data(unsigned char data_byte)
	{
		lcm12864_check_busy();		// 检查LCD是否忙碌
		LCD_DB_SET_OUT;
		LCD_RS_SBI;              			//显示数据
		LCD_RW_CBI;              			//写数据
		LCD_DB_OUT=data_byte;
		LCD_E_SBI;						// 读写使能
		asm("nop"::);
		LCD_E_CBI;
	}

//***********************************************************************************
//*名称: lcm12864_clear(void)                										*
//*功能: lcm12864DDRAM清屏                   										*
//*参数: 无                             											*
//*返回: 无                             											*
//***********************************************************************************
void lcm12864_clear(void)
	{
	  lcm12864_wirte_cmd(0x01);
	}


//***********************************************************************************
//*名称: lcm12864_init(void)                  										*
//*功能: lcm12864初始化                 											*
//*参数: 无                             											*
//*返回: 无                             											*
//***********************************************************************************
void lcm12864_init(void)
	{
		LCD_PSB_SBI;						 		//8位并口方式
		LCD_RST_CBI;	             				//lcm12864复位
		delay_nms(5);
		LCD_RST_SBI;
		lcm12864_wirte_cmd(0x30);     	 	//基本指令
		lcm12864_wirte_cmd(0x01);     	 	//清除显示
		lcm12864_wirte_cmd(0x0C);     	 	//显示开,关光标不闪烁
		lcm12864_wirte_cmd(0x06);     	 	//设置输入模式
	
	
	}

//***************************************************************************************
//*名称: void lcm12864_char_locate(unsigned char x, unsigned char y )                   * 
//*功能: 字符显示定位(汉字和ASCII)                     									* 
//*参数: x水平列地址(0-7) y垂直行地址(0-3)    										 	*
//*返回: 无                                      										*	 
//***************************************************************************************
void lcm12864_char_locate(unsigned char x, unsigned char y )
	{
		unsigned char dx=0;						// DDRAM中的水平和垂直坐标
		switch(y)							
			{
				case 0:
					{
						dx=x+0x80;
						break;
					}
				case 1:
					{
						dx=x+0x90;
						break;
					}
				case 2:
					{
						dx=x+0x88;
						break;
					}
				case 3:
					{
						dx=x+0x98;
						break;
					}
			}
		lcm12864_wirte_cmd(dx);
	}
//***************************************************************************************
//*名称: lcm12864_dis_ascii(unsigned char ascii_code)									*	
//*功能: 显示一个ASCII字符																*					
//*参数: ascii_code 显示的ASCII代码														*
//*返回: 无																				*
//***************************************************************************************
void lcm12864_dis_ascii(unsigned char ascii_code)
	{
		lcm12864_wirte_data(ascii_code);
	}

//***********************************************************************************************************************
//*名称: lcm12864_dis_string (unsigned char x, unsigned char y, unsigned char *ptr,unsigned int speed)           		*                          
//*功能: 显示一个字符                           																		*
//*参数: x 水平列地址(0-7)	 y 垂直行地址(0-3)	*ptr  字符串指针														*
//*返回:无                                    																			*
//***********************************************************************************************************************
void lcm12864_dis_string (unsigned char x, unsigned char y, unsigned char *ptr,unsigned int speed)
	{
		lcm12864_char_locate(x,y);					// 定位字符的起点在DDRAM中的位置
		while (*ptr)
			{
			  lcm12864_wirte_data(*ptr++);
			  delay_nms(speed);
			}
	}
//*******************************************************************************************************
//*名称:  lcm12864_draw_locate (unsigned char x,unsigned char y)             							*
//*功能:  绘图模式GDRAM定位													                      	*
//*参数:  x水平列地址(0-127) y垂直行地址(0-63)                                															*
//*返回:  无                                															*
//*******************************************************************************************************
void lcm12864_draw_locate (unsigned char x,unsigned char y) 
	{
		lcm12864_wirte_cmd(0x34);
		lcm12864_wirte_cmd(y);		// 垂直地址
		lcm12864_wirte_cmd(x);		// 水平地址
		lcm12864_wirte_cmd(0x30);
	}
//*******************************************************************************************************
//*名称:  lcm12864_string_negative(unsigned char x,unsigned char y,unsigned char with)             	*
//*功能:  字符串反白显示 可以反白半宽的ASCII码字符									                    *
//*参数:  x水平列地址(0-15) y垂直行地址(0-3)							                                *
//*返回:  无                                															*
//*******************************************************************************************************
void lcm12864_string_negative(unsigned char x,unsigned char y,unsigned char with)
	{
		unsigned char temp1,temp2;
		unsigned int dot_data;												
		
		if(x%2==1)								// 初始化写入点数据				
			{
				dot_data=0x00FF;
			}
		else
			{
				dot_data=0xFF00;
			}
		x=0x80+x/2;								// 绘图GDRAM水平地址 
		switch(y)								// 转换成DDRAM坐标
			{
				case 0:
					{
						y=0x80;
						break;
					}
				case 1:
					{
						y=0x90;
						break;
					}
				case 2:
					{
						y=0x80;
						x+=8;
						break;
					}
				case 3:
					{
						y=0x90;
						x+=8;
						break;
					}
			}			
		if(dot_data==0x00FF)					// 反白起点为半个水平地址的字符	
			{	
				for(temp1=0;temp1<16;temp1++)	
					{
						lcm12864_draw_locate(x,y+temp1);		// 写绘图资料地址,先写垂直地址,再写水平地址
						lcm12864_wirte_data((char)(dot_data/256));		// 连续写入两个字节的数据到绘图资料
						lcm12864_wirte_data((char)(dot_data%256));
					}
				with--;											
				if(with==0)									// 如果达到反白宽度则退出
					{
						lcm12864_wirte_cmd(0x36);		
						lcm12864_wirte_cmd(0x30);
						return;
					}	
				x++;											// 水平坐标增加	
			}		
			
		for(temp1=0;temp1<16;temp1++)							//	反白剩余宽度的字符
			{
				dot_data=0xFF00;
				for(temp2=0;temp2<with;temp2++)
					{
						lcm12864_draw_locate(x+temp2/2,y+temp1);		// 写绘图资料地址,先写垂直地址,再写水平地址
						lcm12864_wirte_data((char)(dot_data/256));		// 连续写入两个字节的数据到绘图资料
						lcm12864_wirte_data((char)(dot_data%256));
						dot_data|=~dot_data;
					}		
				
			}
				
		lcm12864_wirte_cmd(0x36);								// 打开绘图显示
		lcm12864_wirte_cmd(0x30);	
	}
//*******************************************************************************************************
//*名称: lcm12864_dis_dot(unsigned char x,unsigned char y,const unsigned char *prt)             		*
//*功能: 显示16*16点阵

⌨️ 快捷键说明

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