STM32F103 FSMC详解以及驱动LCD的应用

http://www.docin.com/p-481164347.html

FSMC硬件

对于STM32F103,无论是VET还是ZET6系列,FSMC的16位数据引脚D0~D15分别对应

D0->PD14,  D1->PD15,  D2->PD0,  D3->PD1,  D4->PE7,  D5->PE8,  D6->PE9,  D7->PE10

D8->PE11,  D9->PE12,  D10->PE13, D11->PE14, D12->PE15, D13->PD8,  D14->PD9,     D15->PD10

 控制线:手控板,战舰,奋斗版

都是LCD RD 和WR对应FSMC_NOE和FSMC_NWR,分别是PD4,PD5

战舰上,LCD片选使用NE4,对应PG12.手控板和奋斗版使用NE1,对应PD7

mini板接线图

数据线由PB0~PB15对应。

LCD背光PC10,

CS-》PC9,RS->PC8,WR->PC7,RD-》PC6

 LCD硬件

2个都是16bit 80并口驱动。左侧为正点原子的LCD,ili9341驱动,右侧是手控板的LCDili9325驱动。

其中RS表示对LCD操作是命令还是数据,RS=0命令,RS=1数据

 

以代码形式说明LCD的读写时序

注意:下列分别是8bit和16bit位宽,以LPC1114和STM32F103RCT6的GPIO方式读写LCD

写命令,RS拉低,准备好数据后,WR信号来一个上升沿。(8bit位宽)

void LCD_WR_REG(uint16_t reg)        
{    
  LPC_GPIO3->DATA &=~(1<<0);    //RS=0;
    LPC_GPIO3->DATA &=~(1<<1);    //CS=0;    
  OUT_DATA(reg>>8);
  LPC_GPIO3->DATA &=~(1<<2);    //WR=0;
    LPC_GPIO3->DATA |= (1<<2);    //WR=1;
    OUT_DATA(reg);    
    LPC_GPIO3->DATA &=~(1<<2);    //WR=0;
    LPC_GPIO3->DATA |= (1<<2);    //WR=1;
    LPC_GPIO3->DATA |= (1<<0);    //RS=1;        
}
void LCD_WR_DATA(uint16_t val)
{  
    LPC_GPIO3->DATA |= (1<<0);  //RS=1;
    LPC_GPIO3->DATA &=~(1<<1);    //CS=0;
     OUT_DATA(val>>8);                        
    LPC_GPIO3->DATA &=~(1<<2);    //WR=0;
    LPC_GPIO3->DATA |= (1<<2);    //WR=1;
    OUT_DATA(val);                    
    LPC_GPIO3->DATA &=~(1<<2);    //WR=0;
    LPC_GPIO3->DATA |= (1<<2);    //WR=1;
    LPC_GPIO3->DATA |= (1<<1);    //CS=1;    
}

16bit位宽版本

void LCD_WR_REG(u16 data)
{ 
    LCD_RS_CLR;//写命令
     LCD_CS_CLR; 
    DATAOUT(data); 
    LCD_WR_CLR; 
    LCD_WR_SET; 
     LCD_CS_SET;   
}

16bit读寄存器

u16 LCD_ReadReg(u16 LCD_Reg)
{                                           
     LCD_WR_REG(LCD_Reg);  //写入要读取的寄存器号
    return LCD_RD_DATA(); 
} 
u16 LCD_RD_DATA(void)
{                                           
    u16 t;
     GPIOB->CRL=0X88888888; //PB0-7  上拉输入
    GPIOB->CRH=0X88888888; //PB8-15 上拉输入
    GPIOB->ODR=0X0000;     //输出0

    LCD_RS_SET;
    LCD_CS_CLR;
    
    LCD_RD_CLR;
    //拉低RD信号,从DATAIN数据线读数据后,再拉高                       
    t=DATAIN;  
    LCD_RD_SET;
    LCD_CS_SET; 

    GPIOB->CRL=0X33333333; //PB0-7  上拉输出
    GPIOB->CRH=0X33333333; //PB8-15 上拉输出
    GPIOB->ODR=0XFFFF;    //输出1
    return t;  
}
原文地址:https://www.cnblogs.com/legion/p/7942838.html