用STM32F107 驱动拓普微的液晶屏LM2068R 控制器为RA8803 ,调了好几天了,一直调不出来都快崩溃!
问题:
1、读出来的忙信号一直是高电平,而用万用表测其引脚却是低电平。
2、液晶屏一直是白得,什么都不显示。
3、数据输出,都能万用表在其引脚上测出 是正确的。
4、开始用单片机驱动能过正常显示,没有什么问题。
我考虑到的是:是不是STM32的速度和屏的速度不匹配?读取忙引脚有问题?
希望,那位好人能给我一些建议!如何去解决这些问题,非常感谢!
看看源程序:
//主程序
#include"stm32f10x.h"
#include"LCM.H"
ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void)
{
// SystemInit();
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪
{
/*设置AHB时钟(HCLK)*/
RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1--AHB时钟 = 系统时钟
/* 设置高速AHB时钟(PCLK2)*/
RCC_PCLK2Config(RCC_HCLK_Div8); //RCC_HCLK_Div8--APB2时钟 = HCLK
/*设置低速AHB时钟(PCLK1)*/
RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2--APB1时钟 = HCLK / 2
/*设置FLASH存储器延时时钟周期数*/
FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期
/*选择FLASH预取指缓存的模式*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*设置PLL时钟源及倍频系数*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// PLL的输入时钟 = HSE时钟频率;RCC_PLLMul_9--PLL输入时钟x 9
/*使能PLL */
RCC_PLLCmd(ENABLE);
/*检查指定的RCC标志位(PLL准备好标志)设置与否*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/*设置系统时钟(SYSCLK) */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//RCC_SYSCLKSource_PLLCLK--选择PLL作为系统时钟
/* PLL返回用作系统时钟的时钟源*/
while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
}
void Init(void)
{
RCC_Configuration();
LCM_GPIOConfiguration(GPIOE);
Init_LCM(GPIOE);
delay(10);
Init_LCM(GPIOE);
delay(10);
LcmClear(GPIOE);
}
int main(void)
{
Init();
WriteCmd(GPIOE,0xf1); WriteCmd(GPIOE,0x1f);
WriteCmd(GPIOE,0x60); WriteCmd(GPIOE,0x0a);
WriteCmd(GPIOE,0x70); WriteCmd(GPIOE,0x50);
ShowText(GPIOE,"拓普微 LM2068R");
while(1)
{
}
}
//LM2068R 驱动程序
#include"LCM.H"
//向数据口送一个八位的数据
void Send8Bit(GPIO_TypeDef* GPIOx,uint8_t data)
{
uint16_t pin=0x0001;
uint8_t x,y=0x01;
for(x=0;x<8;x++)
{
y=y&data;
if(y==1)
GPIO_WriteBit(GPIOx,pin,Bit_SET);
else
GPIO_WriteBit(GPIOx,pin,Bit_RESET);
y=0x01;
pin=pin<<1;
data=data>>1;
}
}
//读取忙碌信号
uchar Get_BusyBit()
{
uchar k;
k=GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10);
return k;
}
//写数据
void WriteData(GPIO_TypeDef* GPIOx,uchar m)
{
// while(Get_BusyBit()==1) ;
delay(10);
Send8Bit(GPIOx,m);
delay(2);
LCM_CS_0;
delay(2);
LCM_RS_1;
delay(2);
LCM_RD_1;
delay(2);
LCM_WR_0;
delay(10);
LCM_WR_1;
delay(2);
LCM_RS_0;
delay(2);
LCM_CS_1;
delay(2);
// while(Get_BusyBit()==1) ;
}
//写命令
void WriteCmd(GPIO_TypeDef* GPIOx,uchar m)
{
// while(Get_BusyBit()==1) ;
delay(10);
Send8Bit(GPIOx,m);
delay(2);
LCM_CS_0;
delay(2);
LCM_RS_0;
delay(2);
LCM_RD_1;
delay(2);
LCM_WR_0;
delay(10);
LCM_WR_1;
delay(2);
LCM_RS_0;
delay(2);
LCM_CS_1;
delay(2);
// while(Get_BusyBit()==1) ;
}
//写字符串
void ShowText(GPIO_TypeDef* GPIOx,uchar *text)
{
while(*text>0)
{
WriteData(GPIOx,*text);
text++;
delay(10);
}
}
//初始化函数
void Init_LCM(GPIO_TypeDef* GPIOx)
{
Send8Bit(GPIOx,0xff);
delay(2);
LCM_CS_1;
delay(2);
LCM_WR_1;
delay(2);
LCM_RS_1;
delay(2);
LCM_RES_0;
delay_1ms(300);
LCM_RES_1;
delay_1ms(150);
WriteCmd(GPIOx,0x00); WriteCmd(GPIOx,0xcd);
WriteCmd(GPIOx,0x11); WriteCmd(GPIOx,0x00);
WriteCmd(GPIOx,0x81); WriteCmd(GPIOx,0x40);
WriteCmd(GPIOx,0xf0); WriteCmd(GPIOx,0xa0);
WriteCmd(GPIOx,0x01);WriteCmd(GPIOx,0xf2);
WriteCmd(GPIOx,0x90);WriteCmd(GPIOx,0x04);
WriteCmd(GPIOx,0x20); WriteCmd(GPIOx,0x27);
WriteCmd(GPIOx,0x30); WriteCmd(GPIOx,0xef);
WriteCmd(GPIOx,0x40); WriteCmd(GPIOx,0x00);
WriteCmd(GPIOx,0x50); WriteCmd(GPIOx,0x00);
WriteCmd(GPIOx,0x21); WriteCmd(GPIOx,0x27);
WriteCmd(GPIOx,0x31); WriteCmd(GPIOx,0xef);
WriteCmd(GPIOx,0x41);WriteCmd(GPIOx,0x00);
WriteCmd(GPIOx,0x51);WriteCmd(GPIOx,0x00);
WriteCmd(GPIOx,0xa0);WriteCmd(GPIOx,0x11);
WriteCmd(GPIOx,0x02);WriteCmd(GPIOx,0x10);
}
//LCM GPIO口的配置
void LCM_GPIOConfiguration(GPIO_TypeDef* GPIOx)
{
GPIO_InitTypeDef GPIO_InitStructure;
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_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOx,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //测忙引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
//清屏函数
void LcmClear(GPIO_TypeDef* GPIOx)
{
uint8_t j,i;
WriteCmd(GPIOx,0x60); WriteCmd(GPIOx,0x00);
WriteCmd(GPIOx,0x70); WriteCmd(GPIOx,0x00);
for(i=0;i<40;i++)
for(j=0;j<240;j++)
{
WriteData(GPIOx,0x00);
delay(100);
}
}
void delay(uint32_t n)
{
uint32_t x,y;
for(x=0;x<n;x++);
for(y=0;y<109;y++)
{;}
}
void delay_1ms(uint m)
{
uint32_t x,y;
for(x=0;x<m;x++);
for(y=0;y<7200;y++)
{;}
} |