在线时间1 小时
UID1902726
ST金币0
蝴蝶豆0
注册时间2013-1-24
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
移植了一个LCD1602 HD44780的标准4线驱动到STM8S105上, 可是不能工作,LCD模块初始化之后没有任何反应。
有没有了解的兄弟看看怎么回事?
按照之前几位兄弟发现的问题都改了, 现在为了简化,我用PB整个口做数据口,PE5,6,7 接控制线, 可是即使用8位模式一样不能正常驱动液晶,代码执行后1602毫无反应,就是第一行一条黑色框,应该是没有初始化的样子。
//工作方式设置
const unsigned char LCD_8BIT_MODE = 0x38;//接口为8-bits
const unsigned char LCD_4BIT_MODE = 0x28;//接口4-bits
//
const unsigned char LCD_AUTO_INCREMENT = 0x06;//
const unsigned char LCD_CLR = 0x01;//
const unsigned char LCD_DISPLAY_ON = 0x0c;//
const unsigned char LCD_DISPLAY_OFF = 0x08;//
//
void lcd_delay()
{
delay_us(10);
}
//初始化LCD的数据端口设置为输入模式
void LCD_Input_Mode()
{
GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_IN_PU_NO_IT);
}
//
//初始化LCD的数据端口设置为输出模式
void LCD_Output_Mode()
{
GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_HIGH_SLOW);
}
//LCD初始化
void LCD_Init(void)
{
//初始化RS,EN,RW为输出
GPIO_Init(LCD_PIN_RS, GPIO_MODE_OUT_PP_HIGH_SLOW);
GPIO_Init(LCD_PIN_RW, GPIO_MODE_OUT_PP_HIGH_SLOW);
GPIO_Init(LCD_PIN_EN, GPIO_MODE_OUT_PP_HIGH_SLOW);
//
LCD_WriteCommand(LCD_8BIT_MODE);
LCD_WriteCommand(LCD_DISPLAY_OFF);
//
LCD_WriteCommand(LCD_AUTO_INCREMENT);
LCD_WriteCommand(LCD_CLR);
LCD_WriteCommand(LCD_DISPLAY_ON);
}
void LCD_Wait (void) //等待LCD完成操作
{
unsigned char ac_dat;
unsigned char busy_flag;
do
{
ac_dat = LCD_Read_Status();
busy_flag = (ac_dat & 0x80);
if(busy_flag){
UART_SendString("LCD Busy");}
}while(busy_flag); //=1表示忙, =0表示空闲
}
//读LCD状态寄存器状态
unsigned char LCD_Read_Status(void)
{
unsigned char status = 0x00;
//
GPIO_WriteLow(LCD_PIN_EN);
GPIO_WriteLow(LCD_PIN_RS); //
GPIO_WriteHigh(LCD_PIN_RW);//读出
//初始化数据端口为输入
LCD_Input_Mode();
//
GPIO_WriteHigh(LCD_PIN_EN);
status = GPIO_ReadInputData(GPIOB);
//
GPIO_WriteLow(LCD_PIN_EN);
return (status);
}
//8位输出
void Write8BitData(unsigned char cmd)
{
GPIO_Write(GPIOB, cmd);
}
//
void LCD_WriteCommand (unsigned char cmd)
{
//初始化数据端口为输出
LCD_Output_Mode();
//
LCD_Wait(); //检测忙
GPIO_WriteLow(LCD_PIN_RS); //写入指令
GPIO_WriteLow(LCD_PIN_RW);//
GPIO_WriteHigh(LCD_PIN_EN);
Write8BitData(cmd);
GPIO_WriteLow(LCD_PIN_EN);
}
/*--------------------------------------------------------------*/
//写入数据
void LCD_WriteData(unsigned char data)
{
LCD_Output_Mode();
LCD_Wait(); //检测忙
GPIO_WriteHigh(LCD_PIN_RS); //写入数据
GPIO_WriteLow(LCD_PIN_RW);//
GPIO_WriteHigh(LCD_PIN_EN);
//先送出高4位
Write8BitData(data);
GPIO_WriteLow(LCD_PIN_EN);
}
void LCD_Locate(unsigned char x, unsigned char y)
{
if(y == 0)
{
LCD_WriteCommand(x + 0x80);
}
if(y == 1)
{
LCD_WriteCommand(x + 0xC0);
}
if(y == 2)
{
LCD_WriteCommand(x + 0x90);
}
if(y == 3)
{
LCD_WriteCommand(x + 0xD0);
}
}
//
void LCD_DisplayString(unsigned char x, unsigned char y, const char *s)
{
LCD_Locate(x, y);
while(*s)
{
LCD_WriteData(*s);
s++;
}
}
|
|