📄 lcd_hd44780.h
字号:
#ifdef LCD_HD44780_GLOBALS
#define LCD_HD44780_EXT
#else
#define LCD_HD44780_EXT extern
#endif
/**************************************************************************************************
* 接口参数
**************************************************************************************************/
#define _lcd_MaxCols 2 // 最大行数
#define _lcd_MaxRows 16 // 最大列数
#define HD44780_SHARE_IO 0 // 数据端口共享(0禁止 , 1充许)
#define HD44780_COMM_PORT 5 // 定义数据端口,具体如下:
#define HD44780_8_Bits_Bus 0 // (0为8位总线
#define HD44780_8_Bits_IO 1 // (1为8位普通I/O口
#define HD44780_8_Bits_SRAM 2 // (2为8位外部内存模式
#define HD44780_4_Bits_HBus 3 // (3为4位总线(高半字节)
#define HD44780_4_Bits_LBus 4 // (4为4位总线(低半字节)
#define HD44780_4_Bits_IO 5 // (5为4位普通I/O口
/**************************************************************************************************
* IO 定义
**************************************************************************************************/
#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)
//------------------- 当配置为外部内存模式,必须设置以下参数-------------------------------------//
/*
LCD_HD44780_EXT INT8U xdata HD44780_Cmd_W_Add _at_ 0x8000; // 指令口写地址
LCD_HD44780_EXT INT8U xdata HD44780_Cmd_R_Add _at_ 0x8200; // 指令口读地址
LCD_HD44780_EXT INT8U xdata HD44780_Data_W_Add _at_ 0x8100; // 数据口写地址
LCD_HD44780_EXT INT8U xdata HD44780_Data_R_Add _at_ 0x8300; // 数据口读地址
*/
#else
//--------------------LCD 端口定义---------------------------------------------------------------//
#define HD44780_RS 2
#define HD44780_RS_PORT PORTD
#define HD44780_RS_DDR DDRD
#define HD44780_RS_PIN PIND
#define HD44780_RW 3
#define HD44780_RW_PORT PORTB
#define HD44780_RW_DDR DDRB
#define HD44780_RW_PIN PINB
#define HD44780_E 4
#define HD44780_E_PORT PORTB
#define HD44780_E_DDR DDRB
#define HD44780_E_PIN PINB
#define HD44780_Data_PORT PORTD
#define HD44780_Data_DDR DDRD
#define HD44780_Data_PIN PIND
#define HD44780_Data0 0
#define HD44780_Data0_PORT PORTD
#define HD44780_Data0_DDR DDRD
#define HD44780_Data0_PIN PIND
#define HD44780_Data1 1
#define HD44780_Data1_PORT PORTD
#define HD44780_Data1_DDR DDRD
#define HD44780_Data1_PIN PIND
#define HD44780_Data2 2
#define HD44780_Data2_PORT PORTD
#define HD44780_Data2_DDR DDRD
#define HD44780_Data2_PIN PIND
#define HD44780_Data3 3
#define HD44780_Data3_PORT PORTD
#define HD44780_Data3_DDR DDRD
#define HD44780_Data3_PIN PIND
#define HD44780_Data4 4
#define HD44780_Data4_PORT PORTD
#define HD44780_Data4_DDR DDRD
#define HD44780_Data4_PIN PIND
#define HD44780_Data5 5
#define HD44780_Data5_PORT PORTD
#define HD44780_Data5_DDR DDRD
#define HD44780_Data5_PIN PIND
#define HD44780_Data6 6
#define HD44780_Data6_PORT PORTD
#define HD44780_Data6_DDR DDRD
#define HD44780_Data6_PIN PIND
#define HD44780_Data7 7
#define HD44780_Data7_PORT PORTD
#define HD44780_Data7_DDR DDRD
#define HD44780_Data7_PIN PIND
#define HD44780_E_delay() Tdelay_3us()
#define HD44780_E_High() SETBIT(HD44780_E_PORT,HD44780_E)
#define HD44780_E_Low() CLRBIT(HD44780_E_PORT,HD44780_E)
#define HD44780_Cmd_Mode() CLRBIT(HD44780_RS_PORT, HD44780_RS) // RS=0 指令模式
#define HD44780_Data_Mode() SETBIT(HD44780_RS_PORT, HD44780_RS) // RS=1 数据模式
#define HD44780_Wr_Mode() CLRBIT(HD44780_RW_PORT, HD44780_RW) // RW=0 写模式
#define HD44780_Rd_Mode() SETBIT(HD44780_RW_PORT, HD44780_RW) // RW=1 读模式
#endif
/**************************************************************************************************
* 常量定义区
**************************************************************************************************/
// ---------------------- HD44780 命令 --------------------
//该参数可以是下列同一组中的一个或多个相或(|):
#define HD44780_DISP_CMD_CLS 0x01 // LCD 清屏,光标返回(0,0)位置。
#define HD44780_DISP_CMD_HOME 0x02 // 显示、光标回原位
#define HD44780_DISP_CURSOR_DEC 0x04 // 光标减量方式,画面不动
#define HD44780_DISP_CURSOR_DEC_MOV 0x05 // 光标减量方式,画面平移
#define HD44780_DISP_CURSOR_INC 0x06 // 光标增量方式,画面不动
#define HD44780_DISP_CURSOR_INC_MOV 0x07 // 光标增量方式,画面平移
#define HD44780_DISP_ON 0x0C // 显示开
#define HD44780_DISP_OFF 0x08 // 显示关
#define HD44780_DISP_CURSOR_ON 0x0A // 光标开
#define HD44780_DISP_CURSOR_OFF 0x08 // 光标关
#define HD44780_DISP_BLINK_ON 0x09 // 光标所在字符闪烁开
#define HD44780_DISP_BLINK_OFF 0x08 // 光标所在字符闪烁关
#define HD44780_DISP_CURSOL_LMOV 0x10 //光标左移一个字符
#define HD44780_DISP_CURSOR_RMOV 0x14 //光标右移一个字符
#define HD44780_DISP_MENU_LMOV 0x18 //画面左移一个字符
#define HD44780_DISP_MENU_RMOV 0x1C //画面右移一个字符
#define HD44780_DISP_MODE_BIT_8 0x30 // 8-bit 数据接口
#define HD44780_DISP_MODE_BIT_4 0x20 // 4-bit 数据接口
#define HD44780_DISP_MODE_LINE_2 0x28 // 2 行显示
#define HD44780_DISP_MODE_LINE_1 0x20 // 1 行显示
#define HD44780_DISP_MODE_FONT_5X10 0x24 // 5 x 10 点阵字符
#define HD44780_DISP_MODE_FONT_5X7 0x20 // 5 x 7 点阵字符
#define HD44780_DISP_SET_ADDR_CGRAM 0x40 // 设置 CGRAM 地址
#define HD44780_DISP_SET_ADDR_DDRAM 0x80 // 设置 DDRAM 地址
#define HD44780_BUSY_BIT 7 // DB7: LCD is busy
/**************************************************************************************************
* 变量定义区
**************************************************************************************************/
typedef struct _LCD_CUSTOM_CHAR
{
INT8U cgram[8];
} LCC;
/**************************************************************************************************
* 函数定义区
**************************************************************************************************/
LCD_HD44780_EXT void HD44780_Write_Cmd (INT8U Cmd);
LCD_HD44780_EXT void HD44780_Write_Data (INT8U Data);
LCD_HD44780_EXT INT8U HD44780_Read_Cmd(void);
#if (EN_HD44780_Read_Data > 0) \
||(EN_LCD_CGRAM_read_byte > 0)
LCD_HD44780_EXT INT8U HD44780_Read_Data (void);
#endif
LCD_HD44780_EXT void LCD_init(void);
LCD_HD44780_EXT void LCD_clear(void);
LCD_HD44780_EXT void LCD_home(void);
LCD_HD44780_EXT void LCD_gotoxy(INT8U x, INT8U y);
LCD_HD44780_EXT void LCD_putchar(char c);
LCD_HD44780_EXT void LCD_puts(INT8U *str);
LCD_HD44780_EXT void LCD_puts_p(const prog_char *progmem_s);
#if (EN_LCD_set_custom_char > 0)
LCD_HD44780_EXT void LCD_set_custom_char(INT8U index, LCC *cchr);
#endif
#if (EN_LCD_CGRAM_read_byte > 0)
LCD_HD44780_EXT INT8U LCD_CGRAM_read_byte(INT8U addr);
#endif
#if (EN_LCD_CGRAM_write_byte > 0)
LCD_HD44780_EXT void LCD_CGRAM_write_byte(INT8U addr, INT8U Data);
#endif
#define LCD_command(command) HD44780_DispCtrlCmdWr(command)// LCD 指令
/**************************************************************************************************
* 条件编译
**************************************************************************************************/
#define EN_LCD_CGRAM_read_byte 0 // O为禁止编译。1充许编译
#define EN_LCD_CGRAM_write_byte 0 // O为禁止编译。1充许编译
#define EN_LCD_set_custom_char 1 // O为禁止编译。1充许编译
#define EN_HD44780_Read_Data 0 // O为禁止编译。1充许编译
#define DEBUG_HD44780_Read_Cmd 1 // O为禁止调试。1充许调试
/**************************************************************************************************
*
**************************************************************************************************/
#if (HD44780_COMM_PORT == HD44780_8_Bits_Bus) \
|| (HD44780_COMM_PORT == HD44780_8_Bits_IO) \
|| (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)
#define HD44780_DISP_MODE_BIT HD44780_DISP_MODE_BIT_8 // 8-bit 数据接口
#elif (HD44780_COMM_PORT == HD44780_4_Bits_HBus) \
|| (HD44780_COMM_PORT == HD44780_4_Bits_LBus) \
|| (HD44780_COMM_PORT == HD44780_4_Bits_IO)
#define HD44780_DISP_MODE_BIT HD44780_DISP_MODE_BIT_4 // 4-bit 数据接口
#endif
#if (_lcd_MaxCols > 1)
#define HD44780_DISP_MODE_LINE HD44780_DISP_MODE_LINE_2
#else
#define HD44780_DISP_MODE_LINE HD44780_DISP_MODE_LINE_1
#endif
#define HD44780_MODE_SET (HD44780_DISP_MODE_BIT|HD44780_DISP_MODE_LINE|HD44780_DISP_MODE_FONT_5X7)
#if(HD44780_COMM_PORT == HD44780_8_Bits_Bus)//////////////////// 8位总线
// 设定所有数据引脚为输入
#define HD44780_Data_Port_In() HD44780_Data_DDR=0
// 设定所有数据引脚为输出
#define HD44780_Data_Port_Out() HD44780_Data_DDR=0xFF
#elif (HD44780_COMM_PORT == HD44780_8_Bits_IO)////////////////// 8位普通I/O口
// 设定所有数据引脚为输入
#define HD44780_Data_Port_In() { \
CLRBIT(HD44780_Data7_DDR, HD44780_Data7);\
CLRBIT(HD44780_Data6_DDR, HD44780_Data6);\
CLRBIT(HD44780_Data5_DDR, HD44780_Data5);\
CLRBIT(HD44780_Data4_DDR, HD44780_Data4);\
CLRBIT(HD44780_Data3_DDR, HD44780_Data3);\
CLRBIT(HD44780_Data2_DDR, HD44780_Data2);\
CLRBIT(HD44780_Data1_DDR, HD44780_Data1);\
CLRBIT(HD44780_Data0_DDR, HD44780_Data0);\
}
// 设定所有数据引脚为输出
#define HD44780_Data_Port_Out() { \
SETBIT(HD44780_Data7_DDR, HD44780_Data7);\
SETBIT(HD44780_Data6_DDR, HD44780_Data6);\
SETBIT(HD44780_Data5_DDR, HD44780_Data5);\
SETBIT(HD44780_Data4_DDR, HD44780_Data4);\
SETBIT(HD44780_Data3_DDR, HD44780_Data3);\
SETBIT(HD44780_Data2_DDR, HD44780_Data2);\
SETBIT(HD44780_Data1_DDR, HD44780_Data1);\
SETBIT(HD44780_Data0_DDR, HD44780_Data0);\
}
#elif (HD44780_COMM_PORT == HD44780_4_Bits_HBus)//////////////// 4位总线(高半字节)
// 设定所有数据引脚为输入
#define HD44780_Data_Port_In() CLRMASK(HD44780_Data_DDR,BIT(7)+BIT(6)+BIT(5)+BIT(4))
// 设定所有数据引脚为输出
#define HD44780_Data_Port_Out() SETMASK(HD44780_Data_DDR,BIT(7)+BIT(6)+BIT(5)+BIT(4))
#elif (HD44780_COMM_PORT == HD44780_4_Bits_LBus)//////////////// 4位总线(低半字节)
// 设定所有数据引脚为输入
#define HD44780_Data_Port_In() CLRMASK(HD44780_Data_DDR,BIT(3)+BIT(2)+BIT(1)+BIT(0))
// 设定所有数据引脚为输出
#define HD44780_Data_Port_Out() SETMASK(HD44780_Data_DDR,BIT(3)+BIT(2)+BIT(1)+BIT(0))
#elif (HD44780_COMM_PORT == HD44780_4_Bits_IO)////////////////// 4位普通I/O口
// 设定所有数据引脚为输入
#define HD44780_Data_Port_In() { \
CLRBIT(HD44780_Data7_DDR, HD44780_Data7);\
CLRBIT(HD44780_Data6_DDR, HD44780_Data6);\
CLRBIT(HD44780_Data5_DDR, HD44780_Data5);\
CLRBIT(HD44780_Data4_DDR, HD44780_Data4);\
}
// 设定所有数据引脚为输出
#define HD44780_Data_Port_Out() { \
SETBIT(HD44780_Data7_DDR, HD44780_Data7);\
SETBIT(HD44780_Data6_DDR, HD44780_Data6);\
SETBIT(HD44780_Data5_DDR, HD44780_Data5);\
SETBIT(HD44780_Data4_DDR, HD44780_Data4);\
}
#endif
/**************************************************************************************************
* END OF FILE
**************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -