• 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;  
    }
  • 相关阅读:
    User-Agent大全
    Python yield 使用浅析
    解决Ubuntu终端里面显示路径名称太长
    百度搜索URL中的参数都是什么
    Fiddler 网页采集抓包利器__手机app抓包
    《samba服务配置的文本》
    《samba服务搭建》RHEL6
    《NFS文件共享服务的搭建》RHEL
    《shell脚本if..then..elif..then.if语句的总结》
    《shell条件测试语句,字符串测试apache是否开启》
  • 原文地址:https://www.cnblogs.com/legion/p/7942838.html
Copyright © 2020-2023  润新知