打印
[应用相关]

ST32之LCD液晶显示

[复制链接]
668|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.硬件连接:、

LCD_BL(背光控制)对应 PB0;
LCD_CS 对应 PG12 即 FSMC_NE4;
LCD _RS 对应 PG0 即 FSMC_A10; (RS接一根地址线,0时读写命令,1时读写数据
LCD _WR 对应 PD5 即 FSMC_NWE;
LCD _RD 对应 PD4 即 FSMC_NOE;
LCD _D[15:0]则直接连接在 FSMC_D15~FSMC_D0;

使用特权

评论回复
沙发
工程师犹饿死|  楼主 | 2021-3-29 13:58 | 只看该作者
2.源码讲解:
1)LCD&lcddev:
  LCD结构体在LCD.h中的定义
/-----------------LCD端口定义----------------
#define LCD_LED PBout(0) //LCD背光  PB0 ,PB0输出控制背光

  typedef  struct
    {
        vu 16 LCD_REG;   //  RS=0;
        vu 16 LCD_RAM;  //  RS=1;
    }LCD_TypeDef;
//使用NOR/SRAM的 Bank4,地址位HADDR[27,26]=11 A10作为数据命令区分线
//注意设置时STM32内部会右移一位对其!   
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))  //这个地址很重要!!!
#define LCD             ((LCD_TypeDef *) LCD_BASE)  //把LCD_BASE强制转换成LCD_TypeDef结构体的指针。

使用特权

评论回复
板凳
工程师犹饿死|  楼主 | 2021-3-29 14:01 | 只看该作者
最终要用的就是LCD

使用特权

评论回复
地板
工程师犹饿死|  楼主 | 2021-3-29 14:02 | 只看该作者
LCD_BASE根据外部电路的连接来确定
因为我们使用BANK1的Sector4,其起始地址从0x6c000000开始。
000007FE为偏移量。因为RS接的A10,07FE转换成二进制是 111 1111 1110,我们使用的16位数据,所以内部地址右移一位对齐,对应到外部地址引脚就是 A10:A0= 011 1111 1111,也就是说A10是0,如果16位地址再加1,对应到8位地址就是加2,即7FE+0x02(因为内部每个地址对应一个8位的数据),那么A10:A0= 100 0000 0000,这时候A10就是1,也就实现了对RS的控制。

使用特权

评论回复
5
工程师犹饿死|  楼主 | 2021-3-29 14:04 | 只看该作者
结构体中
访问LCD_REG,地址就是0x6C000000|0x000007FE,此时RS= 0,发送命令
访问完LCD_REG后,结构体指针自动加1,因为LCD_REG是16位,所以地址加2,访问LCD_RAM,内部地址相应加2,也就是7FE+2 = 800,右移一位就是0100 0000 0000,A10:A0= 100 0000 0000,此时RS= 1,发送数据。
对于探索者F4因为RS接的A6,所以偏移量是0x0000007E, 7E转换成二进制是 111 1110,右移1位是011 1111,此时RS= 0,7E+2=80,二进制是1000 0000,右移一位是100 0000,RS= 1.

使用特权

评论回复
6
工程师犹饿死|  楼主 | 2021-6-28 23:12 | 只看该作者
2) //LCD地址结构体:
    typedef struct
     {
        u16 width;   //设置LCD宽度
        u16 height;   //设置LCD高度
        u16 id;   //设置LCD id
        u8  dir;  //横屏还是竖屏,1 横屏 ,0 竖屏
        u16 warmcmd;  //开始写gram指令
        u16 setxcmd;  //设置x坐标
        u16 setycmd;  //设置y坐标
      }lcd_dev;
//LCD参数
extern _lcd_dev lcddev;   //设置LCD重要参数
lcddev结构体参数的赋值,基本上都是在LCD_Display_Dir设置横竖屏这个函数中完成

使用特权

评论回复
7
工程师犹饿死|  楼主 | 2021-6-28 23:13 | 只看该作者
3) 7个底层接口函数:
   ① 写寄存器值函数 :void LCD_WR_REG(u16 regval)
   ② 写数据函数:void LCD_WR_DATA(u16 data)
   ③ 读数据函数:u16 LCD_RD_DATA(void)
   ④ 写寄存器内容函数: void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue)
   ⑤ 读寄存器内容函数: u16 LCD_ReadReg(u16 LCD_Reg)
   ⑥ 开始写GRAM函数: void LCD_WriteRAM_Prepare(void)
   ⑦ 写GRAM函数: void LCD_WriteRAM(u16 RGB_Code)

使用特权

评论回复
8
工程师犹饿死|  楼主 | 2021-6-28 23:16 | 只看该作者
4)LCD初始化函数伪代码
   // LCD初始化
    void LCD_Init(void)
     {
         初始化GPIO;
         初始化FSMC;                //Mini板不需要
         读取LCD ID;
         printf(“LCD ID:%x\r\n”,lcddev.id);//打印LCD ID,用到了串口1
                                                                  //所以必须初始化串口1,否则黑屏
        根据不同的ID执行LCD初始化代码;
        LCD_Display_Dir(0);    //默认为竖屏
        LCD_LED=1;     //点亮背光
        LCD_Clear(WHITE);   //清屏
    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

886

帖子

0

粉丝