[STM32U5]【NUCLEO-U5A5ZJ-Q测评】+ LCD屏显示驱动篇

NUCLEO-U5A5ZJ-Q开发板是一款近于最小系统式的开发板,因此为了便于人机交互为它配上一个小巧且多用的显示屏是十分必要的。这里采用的是一种0.96寸LCD显示屏,其分辨为80*160,具有显示数值信息及彩色图像。
该显示屏的共有7个引脚,其引脚排列顺序如图1所示,各引脚的用途见图2所示。

图1 引脚排列

图2 引脚用途
该显示屏是以SPI的接口方式工作,其引脚与开发板的连接关系为:
CLK---PA5
DIN---PA6
RST ---PA7
DC ---PD14
CS ---PD15
BLK ---PF12

所使用的接口CN7如图3所示,稍感不便的是LCD屏的电源引脚与接口是不一致的,因此无法直接插接使用。

图3  扩展接口
各引脚输出高低电平的引脚定义为:
#define OLED_SCLK_Set()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET)
#define OLED_SCLK_Clr()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET)
#define OLED_SDIN_Set()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET)
#define OLED_SDIN_Clr()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET)
#define OLED_RST_Set()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,GPIO_PIN_SET)
#define OLED_RST_Clr()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,GPIO_PIN_RESET)
#define OLED_DC_Set()      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14,GPIO_PIN_SET)
#define OLED_DC_Clr()      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14,GPIO_PIN_RESET)
#define OLED_CS_Set()      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15,GPIO_PIN_SET)
#define OLED_CS_Clr()      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15,GPIO_PIN_RESET)
#define OLED_BLK_Set()     HAL_GPIO_WritePin(GPIOF, GPIO_PIN_12,GPIO_PIN_SET)
由于所用引脚均以输出方式工作,故其工作模式的配置函数为:
复制
void LCD_GPIO_Init(void)

{

        GPIO_InitTypeDefGPIO_InitStruct;

        __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    __HAL_RCC_GPIOD_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;

    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

        __HAL_RCC_GPIOF_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_12;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;

    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

}

在驱动测试过程中,为了确定其可行性,最便捷的方法就是在对显示屏初始化后,通过清屏来确定其效果。如果清屏都没有效果,基本说明驱动不成功,其它的功能也就没有保障。

对于该显示屏,其以色彩进行清屏的函数为:
复制
void LCD_Clear(u16 Color)

{

    u16 i,j;

    LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);

    for(i=0;i<LCD_W;i++)

    {

       for (j=0;j<LCD_H;j++)

       {

          LCD_WR_DATA(Color);

       }

    }

}

经测试其清屏函数是有效的,为此就可以继续添加字符及字符串显示函数了,该屏显示字符串的函数为:
复制
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)

{

    while(*p!='\0')

    {

        if(x>LCD_W-16){x=0;y+=16;}

        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}

        LCD_ShowChar(x,y,*p,0,color);

        x+=8;

        p++;

    }

}

除显示字符信息外,由于该显示屏是一款彩色显示屏,因此它还可以显示图片。

以该显示屏显示图像的函数为:
复制
void LCD_ShowPictureb(u16 x1,u16 y1,u16 x2,u16 y2)

{

      inti;

      LCD_Address_Set(x1,y1,x2,y2);

      for(i=0;i<12800;i++)

      {

            LCD_WR_DATA8(gImage_RW[i*2]);

            LCD_WR_DATA8(gImage_RW[i*2+1]);

      }

}

其中,数值gImage_RW由于存储图像数据。

在以上显示函数的配合下,实现图5显示效果的主程序为:
复制
int main(void)

{

    HAL_Init();

    SystemClock_Config();

    SystemPower_Config();

    MX_ICACHE_Init();

    LCD_GPIO_Init ();

    Lcd_Init();

        BACK_COLOR=RED;

        LCD_Clear(RED);

        LCD_ShowString(20,5,"NUCLEO-U5A5ZJ-Q",YELLOW);

        LCD_ShowString(20,25,"0.96'LCD",YELLOW);

        LCD_ShowString(20,50,"jinglixixi",YELLOW);        

        HAL_Delay(2000);

        LCD_ShowPictureb(0,0,159,79);

        while (1);

}

在图4所示的器件连接情况下,经程序的编译与下载,其显示效果如图5所示。

图4  器件连接

图5  显示效果。
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3347966-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值