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

📄 lcd160xb.c

📁 这是一个以RW1067为控制器的LCD模块的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//序号:
//		HD_LCD160XB_S06
//功能:	
//		液晶初始化,显示带光标闪烁的模式
//输入:	
//		无
//输出:	
//		无
/********************************************************/
void lcd160xb_init_set_with_cursor(void)
{
#if (LCD_PORT ==PORT_WIDTH_4BIT)
	#if (LCD_TYPE  ==TYPE_LCD1601B)	
		delay_x1ms(15);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
		delay_x1ms(5);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
		delay_x1ms(5);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
	
		_lcd160xb_judge_busy();
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
	#else	//2行显示
		delay_x1ms(50);
		_lcd160xb_send_half_cmd(0x30);
		delay_x1ms(10);
		_lcd160xb_send_half_cmd(0x30);
		delay_x1ms(1);
		_lcd160xb_send_half_cmd(0x30);
		delay_x1ms(1);
		_lcd160xb_send_half_cmd(0x20);
		delay_x1ms(1);

		_lcd160xb_judge_busy();
		_lcd160xb_send_byte(0x28,CONST_LCD160XB_COMMAND);
	#endif
	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON_CURSOR_FLUSH,CONST_LCD160XB_COMMAND);

	lcd160xb_clr_scr();
	lcd160xb_clr_scr();
	delay_25us();

//RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x24,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x20,CONST_LCD160XB_COMMAND);
////////////

#elif	(LCD_PORT ==PORT_WIDTH_4SPI)
	delay_x1ms(50);
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	delay_x1ms(5);
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	delay_x1ms(5);
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	delay_x1ms(5);	
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);	

	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_OFF,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
	delay_x1ms(11);
	_lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON_CURSOR_FLUSH,CONST_LCD160XB_COMMAND);

	//RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0	
	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);

#elif	(LCD_PORT ==PORT_WIDTH_3SPI)
	delay_x1ms(50);
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	delay_x1ms(5);
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	delay_x1ms(5);
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	delay_x1ms(5);	
	_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);	

	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_OFF,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
	delay_x1ms(11);
	_lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON_CURSOR_FLUSH,CONST_LCD160XB_COMMAND);

	//RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0	
	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);

#else	//8位数据端口
	#if (LCD_TYPE  ==TYPE_LCD1601B)	
		delay_x1ms(15);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
		delay_x1ms(5);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
		delay_x1ms(5);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
	
		_lcd160xb_judge_busy();
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
	#else	//2行显示
		delay_x1ms(15);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
		delay_x1ms(5);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
		delay_x1ms(5);
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
	
		_lcd160xb_judge_busy();
		_lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);	
	#endif
		
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_OFF,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON_CURSOR_FLUSH,CONST_LCD160XB_COMMAND);
	delay_25us();

	//20061128(2-4)
	//RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);
	////////////
	
#endif

}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//	内部子函数部分
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/********************************************************/
//序号:
//		HD_LCD160XB_B01
//功能:	
//		发送一个字节
//输入:	
//		da	送出的字节
//		rs	=0 字节是命令, =1 字节是数据
//输出:	
//		无
/********************************************************/
static void _lcd160xb_send_byte(uchar da, uchar rs)
{
#if (LCD_PORT ==PORT_WIDTH_4BIT)	
	CODE_CLR_LCD160XB_RW;
	_nop_(); _nop_();
	
	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}	

	//4位数据端口时先送高半字节
	#if (CONST_POS_OF_LCD_PORT ==CONST_LCD_PORT_LEFT_HALF)
		HD_DATA_PORT =(da &0xf0);			
	#else
		HD_DATA_PORT =(da >>4);	
	#endif
	
	_nop_(); _nop_();
	CODE_SET_LCD160XB_EN;
	_nop_(); _nop_();
	CODE_CLR_LCD160XB_EN;

	_nop_(); _nop_();
	_nop_(); _nop_();
	CODE_CLR_LCD160XB_RW;
	_nop_(); _nop_();

	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}	

	//4位数据端口时再送低半字节
	#if (CONST_POS_OF_LCD_PORT ==CONST_LCD_PORT_LEFT_HALF)
		HD_DATA_PORT =( (da <<4) &0xf0);	//20050513 改正原来没有左移半字节的情形!
	#else
		HD_DATA_PORT =(da >>4);	
	#endif
	
	_nop_(); _nop_();
	CODE_SET_LCD160XB_EN;
	_nop_(); _nop_();
	CODE_CLR_LCD160XB_EN;

#elif	(LCD_PORT ==PORT_WIDTH_4SPI)
uchar data i;
	CODE_SET_LCD160XB_CLK;
	CODE_CLR_LCD160XB_CS;
	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}

	for(i=0; i<8; i++)
	{
		if(da &0x80)
		{
			CODE_SET_LCD160XB_DAT;
		}
		else
		{
			CODE_CLR_LCD160XB_DAT;
		}
		CODE_CLR_LCD160XB_CLK;
		da <<=1;
		CODE_SET_LCD160XB_CLK;		
	}	
	CODE_SET_LCD160XB_CS;
	delay_25us();

#elif	(LCD_PORT ==PORT_WIDTH_3SPI)
uchar data i;
	CODE_SET_LCD160XB_CLK;
	CODE_CLR_LCD160XB_CS;

	for(i=0; i<8; i++)
	{
		if(da &0x80)
		{
			CODE_SET_LCD160XB_DAT;
		}
		else
		{
			CODE_CLR_LCD160XB_DAT;
		}
		CODE_CLR_LCD160XB_CLK;
		da <<=1;
		CODE_SET_LCD160XB_CLK;
	}	
	rs =rs;			//防止编译警告
	CODE_SET_LCD160XB_CS;
	delay_25us();

#else	//8位数据端口

	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}
	
	_nop_(); _nop_();	
	CODE_CLR_LCD160XB_RW;
	HD_DATA_PORT =da;
	_nop_(); _nop_();	
	CODE_SET_LCD160XB_EN;
	_nop_(); _nop_();
	CODE_CLR_LCD160XB_EN;
#endif

}

/********************************************************/
//序号:
//		HD_LCD160XB_B02
//功能:	
//		接收一个字节
//输入:	
//		rs	=0 字节是状态, =1 字节是数据
//输出:	
//		读出的字节
/********************************************************/
#if ((LCD_PORT ==PORT_WIDTH_8BIT) ||(LCD_PORT ==PORT_WIDTH_4BIT))
static uchar _lcd160xb_recv_byte(uchar rs)
{
uchar data da;
uchar data tmp;

#if (LCD_PORT ==PORT_WIDTH_4BIT)
uchar data tmp1;
	#if (CONST_POS_OF_LCD_PORT ==CONST_LCD_PORT_LEFT_HALF)
		HD_DATA_PORT |=0xf0;
	#else
		HD_DATA_PORT |=0x0f;	
	#endif

	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}

	CODE_SET_LCD160XB_RW;
	CODE_SET_LCD160XB_EN;
	//4位数据端口时先收数据的高半字节
	tmp =HD_DATA_PORT;
	CODE_CLR_LCD160XB_EN;

	#if (CONST_POS_OF_LCD_PORT ==CONST_LCD_PORT_LEFT_HALF)
		HD_DATA_PORT |=0xf0;
	#else
		HD_DATA_PORT |=0x0f;	
	#endif

	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}

	CODE_SET_LCD160XB_RW;
	CODE_SET_LCD160XB_EN;
	//4位数据端口时再收数据的低半字节
	tmp1 =HD_DATA_PORT;
	CODE_CLR_LCD160XB_EN;
	
	//注意读出数据的半字节的位置
	#if (CONST_POS_OF_LCD_PORT ==CONST_LCD_PORT_LEFT_HALF)
		da =(tmp &0xf0) |(tmp1 >>4);	
	#else
		da =(tmp <<4) |(tmp1 &0x0f);
	#endif
	
#else	//8位数据端口

	HD_DATA_PORT =0xff;
	if(rs ==CONST_LCD160XB_COMMAND)
	{
		CODE_CLR_LCD160XB_RS;
	}
	else
	{
		CODE_SET_LCD160XB_RS;
	}
	CODE_SET_LCD160XB_RW;
	CODE_SET_LCD160XB_EN;
	tmp=HD_DATA_PORT;	//防止不使用tmp产生编译警告
	CODE_CLR_LCD160XB_EN;
	da =tmp;
#endif
	
	return(da);
}

/********************************************************/
//序号:
//		HD_LCD160XB_B03
//功能:	
//		液晶忙的判断,等到不忙退出
//输入:	
//		无
//输出:	
//		无
/********************************************************/
static void _lcd160xb_judge_busy(void)
{
	while( (_lcd160xb_recv_byte(CONST_LCD160XB_COMMAND) &0x80) !=0);	
}
#endif

/********************************************************/
//序号:
//		HD_LCD160XB_B04
//功能:	
//		发送半个字节命令(限于4位接口方式)
//输入:	
//		da	送出的半字节(固定在高半字节位置)
//		rs	=0 字节是命令
//输出:	
//		无
/********************************************************/
#if (LCD_PORT ==PORT_WIDTH_4BIT)	
static void _lcd160xb_send_half_cmd(uchar da)
{
	//命令格式
	CODE_CLR_LCD160XB_RW;
	//4位数据端口时,半字节命令在高半字节
	#if (CONST_POS_OF_LCD_PORT ==CONST_LCD_PORT_LEFT_HALF)
		HD_DATA_PORT =(da &0xf0);
	#else
		HD_DATA_PORT =(da >>4);	
	#endif
	
	CODE_CLR_LCD160XB_RS;	
	_nop_(); _nop_();
	CODE_SET_LCD160XB_EN;
	_nop_(); _nop_();
	CODE_CLR_LCD160XB_EN;
}
#endif

//==============================================================================
//End Of File

⌨️ 快捷键说明

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