原子哥:以下程序是LCD1602的部分程序,现在上电后LCD就是背光灯有亮其他无反应不知道何故请帮忙指教一下啊。(其中部分程序是参考网友追梦的)
#define LCD_RS_0 GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET);
#define LCD_RS_1 GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
#define LCD_RW_1 GPIO_WriteBit(GPIOC,GPIO_Pin_7,Bit_SET);
#define LCD_RW_0 GPIO_WriteBit(GPIOC,GPIO_Pin_7,Bit_RESET);
#define LCD_EN_1 GPIO_WriteBit(GPIOC,GPIO_Pin_6,Bit_SET);
#define LCD_EN_0 GPIO_WriteBit(GPIOC,GPIO_Pin_6,Bit_RESET);
#define DataOut(x) GPIOB->BSRR = 0xFF000000 | ( x <<8 ); //PB8-15数据输出
/*********************************************************************
*功 能:写入LCD初始化时的命令,不可以检测忙状态
*********************************************************************/
void LCD_WriteInitcmd(u8 cmd)
{
LCD_RS_0;
delay_us(1);
LCD_RW_0;
delay_us(1);
DataOut(cmd);
LCD_EN_0;
delay_us(300);
LCD_EN_1;
delay_us(300);
LCD_EN_0;
delay_ms(2);
}
/*********************************************************************
*名 称:LCD_Writecmd()
*功 能:写指令到LCD1602,指令数据占一个字节
*入口参数:cmd:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(u8 cmd)
{
while(LCD_busy());
LCD_RS_0; //对同一个寄存器的两次写入,中间延时一会
delay_us(1);
LCD_RW_0;
delay_us(1);
LCD_EN_0;
delay_us(300);//产生脉冲
DataOut(cmd);
LCD_EN_1;
delay_us(300);//必要的延时
LCD_EN_0; //下降沿,LCD1602开始工作
}
/*********************************************************************
*名 称:LCD_Writedata()
*功 能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255 包括各个ASCII码字符
*出口参数:无
*********************************************************************/
void LCD_Writedata(u8 dat)
{
while(LCD_busy());//等待LCD1602空闲
LCD_RS_1;
delay_us(1);
LCD_RW_0;
delay_us(1);
DataOut(dat);
LCD_EN_1; //先拉高
delay_us(300); //很重要的延时,经调试,延时300us以上才可以
LCD_EN_0; //下降沿,开始写入有效数据
}
void LCD_Init(void)
{
delay_ms(200); //延时20ms
LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(10);
LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
LCD_WriteInitcmd(0x08); //先关显示,后开显示
delay_ms(5);
LCD_WriteInitcmd(0x06); //自动右移光标,0x04为左移光标
delay_ms(5);
LCD_WriteInitcmd(0x01); //清除LCD的显示内容
delay_ms(6);
LCD_WriteInitcmd(0x0c); //显示开,关光标;0x08为关显示
delay_ms(5);
}
uint8_t LCD_busy(void)
{
LCD_RS_0;
delay_us(1);
LCD_RW_1;
delay_us(1);
do
{
LCD_EN_0;
delay_us(200);
LCD_EN_1;
delay_us(200);
}
while(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_15));
LCD_EN_0;
return (uint8_t)0;
}
int main(void)
{
RCC_Conifg();
GPIO_Conifg();
USART_Config();
led_init();
SysTick_Initaize();
LCD_Init();
LedOn(1);
LedOff(0);
LCD_Writedata('o');
while(1)
{
}
}
|