📄 lcd_hd44780.c
字号:
* 入 口 : 'Data' 是当前要写入的数据
* 返 回 : 无
* 说 明 : 如果送到数据端口的数据跟实际需要送出的数据不一样 表示LCM可能出问题或着有共享的I/O被利用了
* 则需要等待其他的释放共享的I/O 来保证数据的正确性
**************************************************************************************************/
void HD44780_Write_Data (INT8U Data)
{
HD44780_Read_Cmd(); // 等待LCD空闲
#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)
// HD44780_Data_W_Add = Data;
#else
HD44780_Data_Mode(); // 选择数据寄存器
HD44780_Wr_Mode (); // 选择写状态
HD44780_Data_PORT_Wr(Data); // 向LCD数据端口写数据
#endif
}
/**************************************************************************************************
* 功 能 : 从LCM数据寄存器读一字节数据
* 入 口 :
* 返 回 : 当前读到的数据
* 说 明 : 在调用此函数前需要写入要读数据的地址 如果是当前读 则不需要
**************************************************************************************************/
#if (EN_HD44780_Read_Data > 0)||(EN_LCD_CGRAM_read_byte > 0)
INT8U HD44780_Read_Data (void)
{
#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)
// return (HD44780_Data_R_Add);
#else
HD44780_Read_Cmd(); // 等待LCD空闲
HD44780_Data_Mode(); // 选择命令寄存器
HD44780_Rd_Mode(); // 选择读状态
return (HD44780_Data_PORT_Rd());
#endif
}
#endif
/**************************************************************************************************
* 功 能 : 读状态 等待LCD空闲
* 入 口 : 无
* 返 回 : 状态字
* 说 明 : STA0-6 当前数据地址指针的数值
* STA7 读写操作使能 1: 禁止0: 允许
* 对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0
***************************************************************************************************/
INT8U HD44780_Read_Cmd(void)// 等待LCD空闲
{
INT8U i;
#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)
/*
do {
#if DEBUG_HD44780_Read_Cmd >0
i = HD44780_Cmd_R_Add;
#else
i = (HD44780_Cmd_R_Add & ~(1 << HD44780_BUSY_BIT)); // 确保STA7为0
#endif
}while ( i &(1 << HD44780_BUSY_BIT)); // RW=1,读PD7,为0表示空闲;
return (i);
*/
#else
HD44780_Cmd_Mode(); // 选择命令寄存器
HD44780_Rd_Mode(); // 选择读状态
do {
#if DEBUG_HD44780_Read_Cmd >0
i = HD44780_Data_PORT_Rd();
#else
i = (HD44780_Data_PORT_Rd() & ~(1 << HD44780_BUSY_BIT)); // 确保STA7为0
#endif
}while ( i &(1 << HD44780_BUSY_BIT)); // RW=1,读PD7,为0表示空闲;
return (i);
#endif
}
/**************************************************************************************************
* 功 能 : 从LCD数据端口读数据
* 入 口 : 无
* 返 回 : 数据端口的数据
* 说 明 :
**************************************************************************************************/
#if (HD44780_COMM_PORT != HD44780_8_Bits_SRAM)
static INT8U HD44780_Data_PORT_Rd (void)
{
HD44780_Data_Port_In(); // I/O口方向设置为输入
INT8U i = 0;
#if(HD44780_COMM_PORT == HD44780_8_Bits_Bus)///////////////// 8位总线
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
i = HD44780_Data_PIN; // 读数据
#elif (HD44780_COMM_PORT == HD44780_8_Bits_IO)/////////////// 8位普通I/O口
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
SETBITFLAG( i,0, BITHIGH( HD44780_Data0_PIN, HD44780_Data0));// 读数据
SETBITFLAG( i,1, BITHIGH( HD44780_Data1_PIN, HD44780_Data1));
SETBITFLAG( i,2, BITHIGH( HD44780_Data2_PIN, HD44780_Data2));
SETBITFLAG( i,3, BITHIGH( HD44780_Data3_PIN, HD44780_Data3));
SETBITFLAG( i,4, BITHIGH( HD44780_Data4_PIN, HD44780_Data4));
SETBITFLAG( i,5, BITHIGH( HD44780_Data5_PIN, HD44780_Data5));
SETBITFLAG( i,6, BITHIGH( HD44780_Data6_PIN, HD44780_Data6));
SETBITFLAG( i,7, BITHIGH( HD44780_Data7_PIN, HD44780_Data7));
#elif (HD44780_COMM_PORT == HD44780_4_Bits_HBus)//////////////// 4位总线(高半字节)
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
i = HD44780_Data_PIN & 0xf0; // 读高4位的数据
HD44780_E_Low(); // E --\__
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
i |= HD44780_Data_PIN >> 4; // 读低4位的数据
#elif (HD44780_COMM_PORT == HD44780_4_Bits_LBus)///////////// 4位总线(低半字节)
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
i = (HD44780_Data_PIN << 4) & 0xf0; // 读高4位的数据
HD44780_E_Low(); // E --\__
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
i |= HD44780_Data_PIN & 0x0f; // 读低4位的数据
#elif (HD44780_COMM_PORT == HD44780_4_Bits_IO)/////////////// 4位普通I/O口
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
SETBITFLAG( i,4, BITHIGH( HD44780_Data4_PIN, HD44780_Data4));// 读高4位的数据
SETBITFLAG( i,5, BITHIGH( HD44780_Data5_PIN, HD44780_Data5));
SETBITFLAG( i,6, BITHIGH( HD44780_Data6_PIN, HD44780_Data6));
SETBITFLAG( i,7, BITHIGH( HD44780_Data7_PIN, HD44780_Data7));
HD44780_E_Low(); // E --\__
//向LCM操作时序
HD44780_E_delay(); // 等待LCD E信号稳定
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定
SETBITFLAG( i,0, BITHIGH( HD44780_Data4_PIN, HD44780_Data4));// 读低4位的数据
SETBITFLAG( i,1, BITHIGH( HD44780_Data5_PIN, HD44780_Data5));
SETBITFLAG( i,2, BITHIGH( HD44780_Data6_PIN, HD44780_Data6));
SETBITFLAG( i,3, BITHIGH( HD44780_Data7_PIN, HD44780_Data7));
#else
#error "请选择正确通信模式 (HD44780_COMM_MODE)!"
#endif
HD44780_E_Low();
return i; // 从端口读数据
}
#endif
/**************************************************************************************************
* 功 能 : 向LCD数据端口写数据
* 入 口 : 'Data' 是当前要写入的数据
* 返 回 : 无
* 说 明 :1> 如果送到数据端口的数据跟实际需要送出的数据不一样 表示LCM可能出问题或着有共享的I/O被利
* 用了,则需要等待其他的释放共享的I/O 来保证数据的正确性
**************************************************************************************************/
#if (HD44780_COMM_PORT != HD44780_8_Bits_SRAM)
static void HD44780_Data_PORT_Wr (INT8U Data)
{
HD44780_Data_Port_Out(); // I/O口方向设置为输出
#if (HD44780_COMM_PORT == HD44780_8_Bits_Bus)////////////// 8位总线
HD44780_Data_PORT = Data; // 写数据到端口
#elif (HD44780_COMM_PORT == HD44780_8_Bits_IO)/////////////// 8位普通I/O口
SETBITFLAG( HD44780_Data0_PORT, HD44780_Data0, BITHIGH( Data, 0));// 写数据到端口
SETBITFLAG( HD44780_Data1_PORT, HD44780_Data1, BITHIGH( Data, 1));
SETBITFLAG( HD44780_Data2_PORT, HD44780_Data2, BITHIGH( Data, 2));
SETBITFLAG( HD44780_Data3_PORT, HD44780_Data3, BITHIGH( Data, 3));
SETBITFLAG( HD44780_Data4_PORT, HD44780_Data4, BITHIGH( Data, 4));
SETBITFLAG( HD44780_Data5_PORT, HD44780_Data5, BITHIGH( Data, 5));
SETBITFLAG( HD44780_Data6_PORT, HD44780_Data6, BITHIGH( Data, 6));
SETBITFLAG( HD44780_Data7_PORT, HD44780_Data7, BITHIGH( Data, 7));
#elif (HD44780_COMM_PORT == HD44780_4_Bits_HBus)///////////// 4位总线(高半字节)
HD44780_Data_PORT &= 0x0F; // 清数据端口高4bit
HD44780_Data_PORT |= (Data & 0xf0); // 写高4bit数据到端口高4bit
//向LCM操作时序
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_Low(); // E --\__写入命令数据
HD44780_Data_PORT &= 0x0F; // 清数据端口高4bit
HD44780_Data_PORT |= (Data << 4); // 写低4bit数据到端口高4bit
#elif (HD44780_COMM_PORT == HD44780_4_Bits_LBus)///////////// 4位总线(低半字节)
HD44780_Data_PORT &= 0xF0; // 清数据端口低4bit
HD44780_Data_PORT |= (Data >> 4); // 写高4bit数据到端口低4bit
//向LCM操作时序
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_Low(); // E --\__写入命令数据
HD44780_Data_PORT &= 0xF0; // 清数据端口低4bit
HD44780_Data_PORT |= (Data & 0x0F); // 写低4bit数据到端口低4bit
#elif (HD44780_COMM_PORT == HD44780_4_Bits_IO)/////////////// 4位普通I/O口
SETBITFLAG( HD44780_Data4_PORT, HD44780_Data4, BITHIGH( Data, 4));// 写高4bit数据到端口
SETBITFLAG( HD44780_Data5_PORT, HD44780_Data5, BITHIGH( Data, 5));
SETBITFLAG( HD44780_Data6_PORT, HD44780_Data6, BITHIGH( Data, 6));
SETBITFLAG( HD44780_Data7_PORT, HD44780_Data7, BITHIGH( Data, 7));
//向LCM操作时序
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_Low(); // E --\__写入命令数据
SETBITFLAG( HD44780_Data4_PORT, HD44780_Data4, BITHIGH( Data, 0));// 低4bit写数据到端口
SETBITFLAG( HD44780_Data5_PORT, HD44780_Data5, BITHIGH( Data, 1));
SETBITFLAG( HD44780_Data6_PORT, HD44780_Data6, BITHIGH( Data, 2));
SETBITFLAG( HD44780_Data7_PORT, HD44780_Data7, BITHIGH( Data, 3));
#else
#error "请选择正确通信模式 (HD44780_COMM_MODE)!"
#endif
//向LCM操作时序
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_High(); // E __/--
HD44780_E_delay(); // 等待LCDE信号稳定 > 1uS
HD44780_E_Low(); // E --\__写入命令数据
}
#endif
/**************************************************************************************************
* END OF FILE
**************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -