打印
[STM32WB]

【STM32WB09KE测评】+彩色LCD屏显示驱动

[复制链接]
42|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#
STM32WB09KE开发板除了配接的无线扩展板外,它近于一款最小系统型的开发板,因此在实际应用中要借助扩展接口来自行丰富外设资源。当然这其中最主要的就是为它添加显示功能,以便进行人机间的交互。
为此,这里为它添加了一款LCD屏,该显示屏采用SPI接口的工作发送,其显示分辨率为160*80像素点。
为驱动该显示屏,它是使用图1所示的接口来连接显示屏。
1 扩展接口
比较惊奇的是,尽管引脚的名称被冠以GPIO28D15,但在实际编程时却是要以PB6的形式来使用,为此就需要借助一张变换表来转换处理。
经转换处理,所使用的引脚分别为PB6PB7PB3PA8PA11PA9
为便于以GPIO口来模拟SPI接口工作,对各引脚输出高低电平的语句定义如下:
#define OLED_SCLK_Set   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET)  //CLK
#define OLED_SCLK_Clr   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)
#define OLED_SDIN_Set   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)  //DIN
#define OLED_SDIN_Clr   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define OLED_RST_Set    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET) //RES
#define OLED_RST_Clr    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET)
#define OLED_DC_Set     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)  //DC
#define OLED_DC_Clr     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET)
#define OLED_CS_Set     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET)  //CS
#define OLED_CS_Clr     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET)
#define OLED_BLK_Set    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET) //BLK
#define OLED_BLK_Clr    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET)
SPI方式方式字节数据的函数为:
static void  LCD_Writ_Bus(u8 dat)
{
    u8 i;
    OLED_CS_Clr;
    for(i=0;i<8;i++)
    {
        OLED_SCLK_Clr;
        if(dat&0x80)
           OLED_SDIN_Set;
        else
           OLED_SDIN_Clr;
        OLED_SCLK_Set;
        dat<<=1;
    }
    OLED_CS_Set;
}

实现指定色彩清除屏幕的函数为:
static 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);
        }
    }
}

在字库的配合下,实现字符串显示的函数为:
static 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,1,color);
        x+=8;
        p++;
    }
}

在以上函数的配合下,实现测试显示的主程序为:
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  PeriphCommonClock_Config();
  MX_GPIO_Init();
  LD1_GPIO_CLK_ENABLE();
  LD2_GPIO_CLK_ENABLE();
  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull  = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Pin = LD1_PIN;
  HAL_GPIO_Init(LD1_GPIO_PORT, &GPIO_InitStruct);
  GPIO_InitStruct.Pin = LD2_PIN;
  HAL_GPIO_Init(LD2_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_8;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       
GPIO_InitStruct.Pin = GPIO_PIN_9;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       
Lcd_Init();
  LCD_Clear(RED);
  LCD_ShowString(10,10,"STM32WB09KE",YELLOW);
  LCD_ShowString(10,30,"jinglixixi",YELLOW);
  while (1)
  {
    HAL_GPIO_TogglePin(LD1_GPIO_PORT, LD1_PIN);
    HAL_Delay(100);
    HAL_GPIO_TogglePin(LD2_GPIO_PORT, LD2_PIN);
  HAL_Delay(100);
  }
}

经程序的编译和运行,其显示效果如图2所示,说明对该LCD屏的显示驱动有效,可以凭借它完成显示工作。
2 显示效果

使用特权

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

本版积分规则

450

主题

2746

帖子

38

粉丝