[STM32WB] 【STM32WBA52CG测评】+LCD屏显示驱动与电子时钟

[复制链接]
 楼主| jinglixixi 发表于 2023-7-18 08:59 | 显示全部楼层 |阅读模式
<
本帖最后由 jinglixixi 于 2023-7-18 09:01 编辑

#申请原创#
STM32WBA52是一种面向无线通信的开发板,因此在使用中应配上一款小巧和多用途的显示屏。这里需要的0.96LCD显示屏正符合其要求,它不但能显示数值信息,也能显示彩色的图像。
该显示屏以SPI的接口方式工作,其引脚与开发板的连接关系为:
CLK---PB4
DIN---PB3
RST ---PA15
DC ---PA12
CS ---PA9
BLK ---PB10


所使用的Arduino接口如图1所示,稍感不便的是LCD屏的电源引脚与接口有所不同,因此无法直接插接使用。
1.jpg
1  Arduino接口


各引脚输出高低电平的引脚定义为:
#define OLED_SCLK_Set()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,GPIO_PIN_SET)
#define OLED_SCLK_Clr()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,GPIO_PIN_RESET)
#define OLED_SDIN_Set()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_SET)
#define OLED_SDIN_Clr()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_RESET)
#define OLED_RST_Set()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15,GPIO_PIN_SET)
#define OLED_RST_Clr()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15,GPIO_PIN_RESET)
#define OLED_DC_Set()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12,GPIO_PIN_SET)
#define OLED_DC_Clr()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12,GPIO_PIN_RESET)
#define OLED_CS_Set()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET)
#define OLED_CS_Clr()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET)
#define OLED_BLK_Set()     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10,GPIO_PIN_SET)
#define OLED_BLK_Clr()     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10,GPIO_PIN_RESET)

所用引脚的工作模式配置函数为:
  1. void LCD_GPIO_Init(void)
  2. {
  3.   __HAL_RCC_GPIOB_CLK_ENABLE();
  4.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  5.   GPIO_InitStruct.Pull  = GPIO_NOPULL; //GPIO_PULLUP
  6.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7.   GPIO_InitStruct.Pin = GPIO_PIN_4;
  8.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  9.   GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_3;
  10.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  11.   __HAL_RCC_GPIOA_CLK_ENABLE();
  12.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_12|GPIO_PIN_15;
  13.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  14. }

显示屏的字符串显示的函数为:
  1. void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)
  2. {
  3.     while(*p!='\0')
  4.     {
  5.         if(x>LCD_W-16){x=0;y+=16;}
  6.         if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
  7.         LCD_ShowChar(x,y,*p,0,color);
  8.         x+=8;
  9.         p++;
  10.     }
  11. }
显示屏显示图像的函数为:
  1. void LCD_ShowPictureb(u16 x1,u16 y1,u16 x2,u16 y2)
  2. {
  3.       int i;
  4.       LCD_Address_Set(x1,y1,x2,y2);
  5.       for(i=0;i<12800;i++)
  6.       {
  7.             LCD_WR_DATA8(gImage_RW[i*2]);
  8.             LCD_WR_DATA8(gImage_RW[i*2+1]);
  9.       }
  10. }
实现显示效果的主程序为:
  1. int main(void)
  2. {
  3.     unsigned int i,k,j=0;
  4.     HAL_Init();
  5.     SystemClock_Config();
  6.     MX_GPIO_Init();
  7.     MX_ICACHE_Init();
  8.     LD1_GPIO_CLK_ENABLE();
  9.     LD2_GPIO_CLK_ENABLE();
  10.     GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  11.     GPIO_InitStruct.Pull  = GPIO_NOPULL;
  12.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  13.     GPIO_InitStruct.Pin = LD1_PIN;
  14.     HAL_GPIO_Init(LD1_GPIO_PORT, &GPIO_InitStruct);
  15.     GPIO_InitStruct.Pin = LD2_PIN;
  16.     HAL_GPIO_Init(LD2_GPIO_PORT, &GPIO_InitStruct);
  17.     LCD_GPIO_Init();
  18.     Lcd_Init();
  19.     BACK_COLOR=RED;
  20.     LCD_Clear(RED);
  21.     LCD_ShowString(20,10,"STM32WBA52CG",YELLOW);
  22.     LCD_ShowString(20,40,"jinglixixi",YELLOW);
  23.     HAL_Delay(2000);
  24.     LCD_ShowPictureb(0,0,159,79);
  25.     while(1)
  26.     {
  27.                  HAL_GPIO_TogglePin(LD2_GPIO_PORT, LD2_PIN);
  28.                  HAL_Delay(200);
  29.     }
  30. }

经程序的编译与下载,其显示效果如图2和图3所示。
2.jpg
图2  文字显示效果

3.jpg
3  图片显示效果

RTC的配合,实现计时显示的函数为:
  1. static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
  2. {
  3.     RTC_DateTypeDefsdatestructureget;
  4.     RTC_TimeTypeDefstimestructureget;
  5.     HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  6.     HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  7.     sprintf((char *)showtime, "%2d:%2d:%2d", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
  8.     sprintf((char *)showdate, "%2d-%2d-%2d", sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
  9.         LCD_ShowString(10,30,showtime,YELLOW);
  10.         LCD_ShowString(10,50,showdate,YELLOW);
  11. }
实现电子时钟显示效果的主程序为:
  1. int main(void)
  2. {
  3.     HAL_Init();
  4.     SystemClock_Config();
  5.     MX_GPIO_Init();
  6.     MX_RTC_Init();
  7.     MX_ICACHE_Init();
  8.     RTCStatus = 1;
  9.         LCD_GPIO_Init();
  10.     Lcd_Init();
  11.         BACK_COLOR=RED;
  12.         LCD_Clear(RED);
  13.         LCD_ShowString(20,10,"STM32WBA52CG",YELLOW);
  14.     while (1)
  15.     {
  16.         RTC_CalendarShow(aShowTime, aShowDate);
  17.     }
  18. }
经程序的编译与下载,其显示效果如图4和图5所示。
4.jpg
4  计时效果

5.jpg
5  显示效果



嵌入小菜菜 发表于 2023-8-17 16:20 | 显示全部楼层
这个电子时钟,有没有定时的功能,要是增加震动提醒,就更好了。
数据采集存储 发表于 2023-8-17 17:00 | 显示全部楼层
LCD的显示驱动,是不是有标准库的代码,而不是HAL库的代码?
单片小菜 发表于 2023-8-18 10:00 | 显示全部楼层
楼主这个加一个壳体,就可以直接商业化应用了,很棒的一种思路,电子时钟。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部