?? lcd160xb.c
字號:
//==============================================================================
//字符液晶模塊的C51程序源文件
//適用于內(nèi)建ASCII字符字庫的單/雙行液晶,以及數(shù)據(jù)端口采用8位或4位兩種引腳的接法!
//File Name=lcd160xb.c
// 1.8BIT數(shù)據(jù)接口(PIN3 V0不能連線)
// 4BIT數(shù)據(jù)接口(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]; //液晶第二行顯示緩沖
//內(nèi)部函數(shù)的定義
#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
//功能:
// 液晶初始化,沒有關(guān)標(biāo)顯示
//輸入:
// 無
//輸出:
// 無
/********************************************************/
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位數(shù)據(jù)端口
#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
//功能:
// 液晶設(shè)置顯示數(shù)據(jù)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 數(shù)據(jù)接口
//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產(chǎn)生編譯警告
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);
//此命令后緊跟相應(yīng)字節(jié)的數(shù)據(jù)
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產(chǎn)生編譯警告
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
}
*/
/********************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -