平头哥CDK W806-KIT单片机技术交流组
直播中

jinglixixi

8年用户 1639经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注
[经验]

【联盛德W806-KIT开发板试用体验】彩色OLED屏的显示驱动

前面已介绍过一种基于I2C接口的0.91寸的单色OLED屏的显示驱动,这次介绍一种基于SPI接口的0.96寸色彩OLED屏的显示驱动。为了引脚使用上的方便,这次依然采用以GPIO口模拟SPI通讯的方式来进行驱动。
该显示屏与开发板的连接关系为:
SCL---PB12
SDA-PB13
RST---PB14
DC---PB15
CS---PB16
BLK---PB17
实现高低电平输出的语句定义如下:
#define OLED_SCLK_Set()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET)  //CLK
#define OLED_SCLK_Clr()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET)
#define OLED_SDIN_Set()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_SET)  //DIN
#define OLED_SDIN_Clr()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET)
#define OLED_RST_Set()    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14,GPIO_PIN_SET)  //RES
#define OLED_RST_Clr()    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14,GPIO_PIN_RESET)
#define OLED_DC_Set()     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET)  //DC
#define OLED_DC_Clr()     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15,GPIO_PIN_RESET)
#define OLED_CS_Set()     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_16,GPIO_PIN_SET)  //CS
#define OLED_CS_Clr()     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_16, GPIO_PIN_RESET)
#define OLED_BLK_Set()    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_17,GPIO_PIN_SET)  //BLK
#define OLED_BLK_Clr()    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_17,GPIO_PIN_RESET)
OLED屏的初始化函数为:
  1. void Lcd_Init(void)
  2. {
  3. OLED_RST_Clr();
  4. HAL_Delay(200);
  5. OLED_RST_Set();
  6. HAL_Delay(200);
  7. LCD_WR_REG(0x11);
  8. HAL_Delay(100);
  9. LCD_WR_REG(0x21);
  10. LCD_WR_REG(0xB1);
  11. LCD_WR_DATA8(0x05);
  12. LCD_WR_DATA8(0x3A);
  13. LCD_WR_DATA8(0x3A);
  14. LCD_WR_REG(0xB2);
  15. LCD_WR_DATA8(0x05);
  16. LCD_WR_DATA8(0x3A);
  17. LCD_WR_DATA8(0x3A);
  18. LCD_WR_REG(0xB3);
  19. LCD_WR_DATA8(0x05);
  20. LCD_WR_DATA8(0x3A);
  21. LCD_WR_DATA8(0x3A);
  22. LCD_WR_DATA8(0x05);
  23. LCD_WR_DATA8(0x3A);
  24. LCD_WR_DATA8(0x3A);
  25. LCD_WR_REG(0xB4);
  26. LCD_WR_DATA8(0x03);
  27. LCD_WR_REG(0xC0);
  28. LCD_WR_DATA8(0x62);
  29. LCD_WR_DATA8(0x02);
  30. LCD_WR_DATA8(0x04);
  31. LCD_WR_REG(0xC1);
  32. LCD_WR_DATA8(0xC0);
  33. LCD_WR_REG(0xC2);
  34. LCD_WR_DATA8(0x0D);
  35. LCD_WR_DATA8(0x00);
  36. LCD_WR_REG(0xC3);
  37. LCD_WR_DATA8(0x8D);
  38. LCD_WR_DATA8(0x6A);
  39. LCD_WR_REG(0xC4);
  40. LCD_WR_DATA8(0x8D);
  41. LCD_WR_DATA8(0xEE);
  42. LCD_WR_REG(0xC5);
  43. LCD_WR_DATA8(0x0E);
  44. LCD_WR_REG(0xE0);
  45. LCD_WR_DATA8(0x10);
  46. LCD_WR_DATA8(0x0E);
  47. LCD_WR_DATA8(0x02);
  48. LCD_WR_DATA8(0x03);
  49. LCD_WR_DATA8(0x0E);
  50. LCD_WR_DATA8(0x07);
  51. LCD_WR_DATA8(0x02);
  52. LCD_WR_DATA8(0x07);
  53. LCD_WR_DATA8(0x0A);
  54. LCD_WR_DATA8(0x12);
  55. LCD_WR_DATA8(0x27);
  56. LCD_WR_DATA8(0x37);
  57. LCD_WR_DATA8(0x00);
  58. LCD_WR_DATA8(0x0D);
  59. LCD_WR_DATA8(0x0E);
  60. LCD_WR_DATA8(0x10);
  61. LCD_WR_REG(0xE1);
  62. LCD_WR_DATA8(0x10);
  63. LCD_WR_DATA8(0x0E);
  64. LCD_WR_DATA8(0x03);
  65. LCD_WR_DATA8(0x03);
  66. LCD_WR_DATA8(0x0F);
  67. LCD_WR_DATA8(0x06);
  68. LCD_WR_DATA8(0x02);
  69. LCD_WR_DATA8(0x08);
  70. LCD_WR_DATA8(0x0A);
  71. LCD_WR_DATA8(0x13);
  72. LCD_WR_DATA8(0x26);
  73. LCD_WR_DATA8(0x36);
  74. LCD_WR_DATA8(0x00);
  75. LCD_WR_DATA8(0x0D);
  76. LCD_WR_DATA8(0x0E);
  77. LCD_WR_DATA8(0x10);
  78. LCD_WR_REG(0x3A);
  79. LCD_WR_DATA8(0x05);
  80. LCD_WR_REG(0x36);
  81. LCD_WR_DATA8(0x78);
  82. LCD_WR_REG(0x29);
  83. OLED_BLK_Set();
  84. }

相应的字符串显示函数为:
  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_Picturea(void)
  2. {
  3. int i;
  4. LCD_Address_Set(0,0,159,79);
  5. for(i=0;i<12800;i++)
  6. {
  7. LCD_WR_DATA8(gImage_YX[i*2]);
  8. LCD_WR_DATA8(gImage_YX[i*2+1]);
  9. }
  10. }

实现图2和图3显示效果的主程序为:
  1. int main(void)
  2. {
  3. SystemClock_Config(CPU_CLK_160M);
  4. printf("enter mainrn");
  5. HAL_Init();
  6. GPIO_Init();
  7. App_OledInit();
  8. Lcd_Init();
  9. LCD_Clear(BLACK);
  10. LCD_ShowString(20,20,"GD32F303",YELLOW);
  11. HAL_Delay(2000);
  12. LCD_Picturea();
  13. while (1);
  14. return 0;
  15. }

经编译,其程序下载的结果如图1所示。
1.jpg
图1 程序下载结果
2.jpg
图2 字符串显示效果
3.jpg
图3 图片显示效果

更多回帖

发帖
×
20
完善资料,
赚取积分