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

📄 lcd160xb.c

📁 这是一个以RW1067为控制器的LCD模块的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//==============================================================================
//字符液晶模块的C51程序源文件
//适用于内建ASCII字符字库的单/双行液晶,以及数据端口采用8位或4位两种引脚的接法!
//File Name=lcd160xb.c
//	1.8BIT数据接口(PIN3 V0不能连线)
//	  4BIT数据接口(PIN3 V0不能连线)
//	  增加4SPI接口方式(PIN3 V0不能连线)
//  	  增加3SPI接口方式(PIN3 V0不能连线)
//==============================================================================
#include <Intrins.h>
#include "public.h"
#include "W78E52.h"
#include "Delay_s.h"
#include "lcd160xb.h"

//全局变量
uchar data lcd_line_1[CONST_LCD160XB_LINE_WIDTH+1];     //液晶第一行显示缓冲
uchar data lcd_line_2[CONST_LCD160XB_LINE_WIDTH+1];     //液晶第二行显示缓冲

//内部函数的定义
#if ((LCD_PORT ==PORT_WIDTH_8BIT) || (LCD_PORT ==PORT_WIDTH_4BIT) )
static void _lcd160xb_judge_busy(void);
static uchar _lcd160xb_recv_byte(uchar rs);
#endif

static void _lcd160xb_send_byte(uchar da, uchar rs);

#if (LCD_PORT ==PORT_WIDTH_4BIT)
static void _lcd160xb_send_half_cmd(uchar da);
#endif

/********************************************************/
//序号:
//		HD_LCD160XB_S01
//功能:	
//		液晶初始化,没有关标显示
//输入:	
//		无
//输出:	
//		无
/********************************************************/
void lcd160xb_init_set(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_CURSE_SETS,CONST_LCD160XB_COMMAND);

	lcd160xb_clr_scr();
	lcd160xb_clr_scr();

	//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_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,CONST_LCD160XB_COMMAND);

	lcd160xb_clr_scr();

	//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_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,CONST_LCD160XB_COMMAND);

	lcd160xb_clr_scr();

	//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,CONST_LCD160XB_COMMAND);

	//20061128(2-1)
	//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_S02
//功能:	
//		液晶清屏
//输入:	
//		无
//输出:	
//		无
/********************************************************/
void lcd160xb_clr_scr(void)
{
#if (LCD_PORT ==PORT_WIDTH_4BIT)
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
#elif	(LCD_PORT ==PORT_WIDTH_4SPI)
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
	delay_x1ms(2);
#elif	(LCD_PORT ==PORT_WIDTH_3SPI)
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
	delay_x1ms(2);
#else
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
#endif
}


/********************************************************/
//序号:
//		HD_LCD160XB_S03
//功能:	
//		液晶设置显示数据RAM(DD RAM)的地址
//输入:	
//		pos	液晶的字符位置,=0...15 从作到右16个字符
//		line	指定的行号,=0/1 表示第1/2行
//输出:	
//		无
/********************************************************/
void lcd160xb_set_disp_addr(uchar pos, uchar line)
{
//保证平时RE=0
#if (LCD_PORT ==PORT_WIDTH_4BIT)
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x20,CONST_LCD160XB_COMMAND);	//RE=0

#if (LCD_TYPE ==TYPE_LCD1601B)
	line =0x80 |(pos &0x0f);
#else
	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
#endif	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x24,CONST_LCD160XB_COMMAND);	//RE=1
	_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);	//RE=0
	
#elif	(LCD_PORT ==PORT_WIDTH_4SPI)
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);	//RE=0

	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);

	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);	//RE=1
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);	//RE=0

#elif	(LCD_PORT ==PORT_WIDTH_3SPI)
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);	//RE=0

	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);

	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);	//RE=1
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);	//RE=0

#else	//8BIT 数据接口
	//20061128(2-2)
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND); 	//RE=0
	//////////////	

#if (LCD_TYPE ==TYPE_LCD1601B)
	line =0x80 |(pos &0x0f);
#else
	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
#endif	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);

	//20061128(2-3)
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);	//RE=1
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
	//////////////
	//20061128(2-2)
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND); 	//RE=0
	//////////////	
	
#endif
}


/********************************************************/
//序号:
//		HD_LCD160XB_S04
//功能:	
//		液晶上显示一行固定字符串
//输入:	
//		str	液晶显示的字符串
//		line	指定的行号,=0/1 表示第1/2行
//输出:	
//		无
//注意:	如果类型是1601B则第二行的显示也在液晶的第一行!
/********************************************************/
void lcd160xb_disp_str(uchar *str, uchar line)
{
//保证平时RE=0
uchar i;
#if (LCD_PORT ==PORT_WIDTH_4BIT)

#if (LCD_TYPE ==TYPE_LCD1601B)
	i =line;	//防止不使用line产生编译警告
	i =0x80;
#else
	i =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0);
#endif	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(i, CONST_LCD160XB_COMMAND);
	
	for(i=0; i<CONST_LCD160XB_LINE_WIDTH; i++)
	{
		_lcd160xb_judge_busy();
		_lcd160xb_send_byte(str[i], CONST_LCD160XB_DATA);
	}

#elif	(LCD_PORT ==PORT_WIDTH_4SPI)
	i =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0);
	_lcd160xb_send_byte(i, CONST_LCD160XB_COMMAND);
	
	for(i=0; i<CONST_LCD160XB_LINE_WIDTH; i++)
	{
		_lcd160xb_send_byte(str[i], CONST_LCD160XB_DATA);
	}

#elif	(LCD_PORT ==PORT_WIDTH_3SPI)
	i =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0);
	_lcd160xb_send_byte(i, CONST_LCD160XB_COMMAND);

	//RE =1, SET DATA LENGTH
	_lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);	//RE=1
	_lcd160xb_send_byte(0x80 |(CONST_LCD160XB_LINE_WIDTH-1), CONST_LCD160XB_COMMAND);
	//此命令后紧跟相应字节的数据
	for(i=0; i<CONST_LCD160XB_LINE_WIDTH; i++)
	{
		_lcd160xb_send_byte(str[i], CONST_LCD160XB_DATA);
	}
	_lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);	//RE=0

#else

#if (LCD_TYPE ==TYPE_LCD1601B)
	i =line;	//防止不使用line产生编译警告
	i =0x80;
#else
	i =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0);
#endif	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(i, CONST_LCD160XB_COMMAND);
	
	for(i=0; i<CONST_LCD160XB_LINE_WIDTH; i++)
	{
		_lcd160xb_judge_busy();
		_lcd160xb_send_byte(str[i], CONST_LCD160XB_DATA);
	}

#endif
}

/*
//********************************************************
//序号:
//		HD_LCD160XB_S05
//功能:	
//		在液晶指定位置上显示一个字符
//输入:	
//		ch	液晶显示的字符
//		line	指定的行号,=0/1 表示第1/2行
//		pos	字符在液晶上的显示位置,=0...15
//输出:	
//		无
//注意:	如果类型是1601B则第二行的显示也在液晶的第一行!
//********************************************************
void lcd160xb_disp_char(uchar ch, uchar line, uchar pos)
{
#if (LCD_PORT ==PORT_WIDTH_4BIT)

#if (LCD_TYPE ==TYPE_LCD1601B)
	line =0x80 |(pos &0x0f);
#else
	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0)|(pos &0x0f);
#endif	
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(ch, CONST_LCD160XB_DATA);

#elif	(LCD_PORT ==PORT_WIDTH_4SPI)
	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0)|(pos &0x0f);
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(ch, CONST_LCD160XB_DATA);

#elif	(LCD_PORT ==PORT_WIDTH_3SPI)
	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0)|(pos &0x0f);
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);

	_lcd160xb_send_byte(0x80 |0x01, CONST_LCD160XB_COMMAND);
	_lcd160xb_send_byte(ch, CONST_LCD160XB_DATA);

#else

	while( (_lcd160xb_recv_byte(CONST_LCD160XB_COMMAND) &0x80) !=0);
#if (LCD_TYPE ==TYPE_LCD1601B)
	line =0x80 |(pos &0x0f);
#else
	line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0)|(pos &0x0f);
#endif	
	_lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
	_lcd160xb_judge_busy();
	_lcd160xb_send_byte(ch, CONST_LCD160XB_DATA);

#endif
}
*/


/********************************************************/

⌨️ 快捷键说明

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