📄 lcd160xb.c
字号:
//序号:
// 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 + -