最近需要做个320×240液晶的电路,主芯片是STM32F103ZET6。选用的液晶是3.3V的RA8806控制器的LCD320×240的蓝白色液晶。电路图按照手册上连接的。程序部分是根据厂家给的51程序改编而来。可是下进程序之后,液晶一直没有反应,后来查阅相关资料,数据线部分需要接上拉电阻,然后要配置成开漏输出。后来根据网上的资料进行了电路的修改,可是液晶依旧无法显示。液晶屏出厂时,厂家测试没有问题。最可能的就是程序有问题了。现把程序和电路贴出来,大家帮忙看看问题在哪里?
GPIO_InitTypeDef GPIO_InitStructure;
uint8_t d,h,m,s;
#define RS_H GPIO_SetBits(GPIOE, GPIO_Pin_11)
#define RS_L GPIO_ResetBits(GPIOE, GPIO_Pin_11)//PE11
#define WR_H GPIO_SetBits(GPIOF, GPIO_Pin_15)
#define WR_L GPIO_ResetBits(GPIOF, GPIO_Pin_15)//PF15
#define RD_H GPIO_SetBits(GPIOG, GPIO_Pin_8)
#define RD_L GPIO_ResetBits(GPIOG, GPIO_Pin_8)//PG8
#define CS1_H GPIO_SetBits(GPIOA, GPIO_Pin_8)
#define CS1_L GPIO_ResetBits(GPIOA, GPIO_Pin_8)//PA8
#define RST_H GPIO_SetBits(GPIOD, GPIO_Pin_9)
#define RST_L GPIO_ResetBits(GPIOD, GPIO_Pin_9)//PD9
#define BUSY GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8)
/***************************************************************************************
* 函 数 名 : LCD_PortInitial 液晶端口驱动配置
* 描 述 : 液晶端口配置为推挽输出。
* 输 入 : 无
* 输 出 : 无
* 返 回 值 : 无
***************************************************************************************/
void LCD_PortInitial(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
/***************************************************************************************
* 函 数 名 : LCD_DataInitial 液晶数据端口配置
* 描 述 : 液晶端口配置为开漏输出。
* 输 入 : 无
* 输 出 : 无
* 返 回 值 : 无
***************************************************************************************/
void LCD_DataInitial(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //复用开漏输出
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
/***************************************************************************************
* 函 数 名 : delay_nms 延时程序
* 描 述 : ns延时程序
* 输 入 : 无
* 输 出 : 无
* 返 回 值 : 无
***************************************************************************************/
void delay_nms(uint16_t n)
{
uint32_t f=n,k;
for (; f!=0; f--)
{
for(k=0xFFF; k!=0; k--);
}
}
/***************************************************************************************
* 函 数 名 : softrst 液晶软启动程序
* 描 述 : RST引脚(PD9)复位
* 输 入 : 无
* 输 出 : 无
* 返 回 值 : 无
***************************************************************************************/
void softrst(void)
{
delay_nms(2);
RST_L;//GPIO_ResetBits(GPIOD, GPIO_Pin_9);//rst=0;
delay_nms(5);
RST_H;//GPIO_SetBits(GPIOD, GPIO_Pin_9);//rst=1;
delay_nms(5);
}
/***************************************************************************************
* 函 数 名 : LCD_CmdWrite 写指令
* 描 述 : 无
* 输 入 : 液晶内部寄存器的命令
* 输 出 : 无
* 返 回 值 : 无
***************************************************************************************/
void LCD_CmdWrite(uint8_t Command)
{
GPIOG->BRR = 0x00ff;
GPIOG->BSRR = Command; // 寄存器代码或数据送数据端口
CS1_L;//GPIOC->BRR = LCD_CS1; // CS1低CS2高有效
RD_H;//GPIOC->BSRR = LCD_RD;
RS_H;//GPIOC->BSRR = LCD_RS;
WR_L;//GPIOC->BRR = LCD_WR;// 写置低
delay_nms(20);
WR_H;//GPIOC->BSRR = LCD_WR; // 写置高
CS1_H;//GPIOC->BSRR = LCD_CS1;
}
/***************************************************************************************
* 函 数 名 : LCD_DataWrite 写数据
* 描 述 : 无
* 输 入 : 写对应的数据
* 输 出 : 无
* 返 回 值 : 无
***************************************************************************************/
void LCD_DataWrite(uint8_t DData)
{
GPIOG->BRR = 0x00ff;
GPIOG->BSRR = DData ; //delay1(1);// 发送数据
CS1_L;//GPIOC->BRR = LCD_CS1;// delay1(1);// 片选
RD_H;//GPIOC->BSRR = LCD_RD;// delay1(1);//读失能
RS_L;//GPIOC->BRR = LCD_RS; //delay1(1);//
WR_L;//GPIOC->BRR = LCD_WR; //delay1(1);// 写使能
delay_nms(20);
WR_H;//GPIOC->BSRR = LCD_WR; //delay1(1); //
CS1_H;//GPIOC->BSRR = LCD_CS1;//delay1(1);//片选关
}
/***************************************************************************************
* 函 数 名 : LCD_CmdRead
* 描 述 : 读取对应寄存器的数据
* 输 入 : 写对应的寄存器
* 输 出 : 无
* 返 回 值 : 对应的数据
***************************************************************************************/
uint8_t LCD_CmdRead(uint8_t regname)
{
uint16_t reg_rddata;
uint8_t data;
LCD_CmdWrite(regname);
CS1_L;//GPIOC->BRR = LCD_CS1;//delay1(1);
GPIOG->BSRR = 0x00ff;
RS_L;//GPIOC->BRR = LCD_RS; //delay1(1);
WR_H;//GPIOC->BSRR = LCD_WR;// delay1(1);
RD_L;//GPIOC->BRR = LCD_RD;//delay1(1);
reg_rddata = GPIOG->IDR ;//delay1(1);//需要修改度数据口数据
delay_nms(20);
RD_H;//GPIOC->BSRR = LCD_RD;//delay1(1);
CS1_H;//GPIOC->BSRR = LCD_CS1;//delay1(1);//LCD_CS1 =1; // chip disable.
delay_nms(50);
data=(uint8_t)reg_rddata;
return(data);
}
|