[资源分享] 基于AC7811-MINI开发板的彩色OLED屏显示驱动

[复制链接]
1255|2
 楼主| jinglixixi 发表于 2020-8-17 09:56 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-8-17 10:01 编辑

OLED 屏有多种形式,既有单色、双色屏,也有彩色屏;既有I2C接口的,也有SPI接口的。
本次使用的是SPI接口的彩色屏,其分辨率是160*80点像素,16位色彩。
OLED 屏与AC7811的连接关系如下:
SCLK --- PA4
SDIN --- PA5
RST  --- PA6
DC   --- PA2
CS   --- PA3
BLK  --- PA7

定义相关引脚输出高低电平的语句为:
#define OLED_BLK_Set()       GPIO_SetPinBits(7);         // PA7

#define OLED_CS_Set()        GPIO_SetPinBits(3);         // PA3
#define OLED_CS_Clr()         GPIO_ResetPinBits(3);      // PA3

#define OLED_SCLK_Set()      GPIO_SetPinBits(4);        // PA4
#define OLED_SCLK_Clr()       GPIO_ResetPinBits(4);     // PA4

#define OLED_SDIN_Set()      GPIO_SetPinBits(5);        // PA5
#define OLED_SDIN_Clr()      GPIO_ResetPinBits(5);      // PA5

#define OLED_DC_Set()        GPIO_SetPinBits(2);        // PA2
#define OLED_DC_Clr()        GPIO_ResetPinBits(2);      //PA2

#define OLED_RST_Set()       GPIO_SetPinBits(6);        // PA6
#define OLED_RST_Clr()       GPIO_ResetPinBits(6);      // PA6

引脚配置的函数为:
  1. void GPIO_Configuration(void)
  2. {
  3.          GPIO_SetDir(GPIO_PA1, 1);
  4.          GPIO_SetDir(GPIO_PA2, 1);
  5.          GPIO_SetDir(GPIO_PA3, 1);
  6.          GPIO_SetDir(GPIO_PA4, 1);
  7.          GPIO_SetDir(GPIO_PA5, 1);
  8.          GPIO_SetDir(GPIO_PA6, 1);
  9.          GPIO_SetDir(GPIO_PA7, 1);
  10. }
OLED屏的初始化函数为:
  1. void Lcd_Init(void)
  2. {
  3. OLED_RST_Clr();
  4. mdelay(20);
  5. OLED_RST_Set();
  6. mdelay(20);
  7. OLED_BLK_Set();

  8. LCD_WR_REG(0x11);
  9. mdelay(100);

  10. LCD_WR_REG(0x21);
  11. LCD_WR_REG(0xB1);
  12. LCD_WR_DATA8(0x05);
  13. LCD_WR_DATA8(0x3A);
  14. LCD_WR_DATA8(0x3A);
  15. LCD_WR_REG(0xB2);
  16. LCD_WR_DATA8(0x05);
  17. LCD_WR_DATA8(0x3A);
  18. LCD_WR_DATA8(0x3A);
  19. LCD_WR_REG(0xB3);
  20. LCD_WR_DATA8(0x05);
  21. LCD_WR_DATA8(0x3A);
  22. LCD_WR_DATA8(0x3A);
  23. LCD_WR_DATA8(0x05);
  24. LCD_WR_DATA8(0x3A);
  25. LCD_WR_DATA8(0x3A);
  26. LCD_WR_REG(0xB4);
  27. LCD_WR_DATA8(0x03);
  28. LCD_WR_REG(0xC0);
  29. LCD_WR_DATA8(0x62);
  30. LCD_WR_DATA8(0x02);
  31. LCD_WR_DATA8(0x04);
  32. LCD_WR_REG(0xC1);
  33. LCD_WR_DATA8(0xC0);
  34. LCD_WR_REG(0xC2);
  35. LCD_WR_DATA8(0x0D);
  36. LCD_WR_DATA8(0x00);
  37. LCD_WR_REG(0xC3);
  38. LCD_WR_DATA8(0x8D);
  39. LCD_WR_DATA8(0x6A);  
  40. LCD_WR_REG(0xC4);
  41. LCD_WR_DATA8(0x8D);
  42. LCD_WR_DATA8(0xEE);
  43. LCD_WR_REG(0xC5);  /*VCOM*/
  44. LCD_WR_DATA8(0x0E);   
  45. LCD_WR_REG(0xE0);
  46. LCD_WR_DATA8(0x10);
  47. LCD_WR_DATA8(0x0E);
  48. LCD_WR_DATA8(0x02);
  49. LCD_WR_DATA8(0x03);
  50. LCD_WR_DATA8(0x0E);
  51. LCD_WR_DATA8(0x07);
  52. LCD_WR_DATA8(0x02);
  53. LCD_WR_DATA8(0x07);
  54. LCD_WR_DATA8(0x0A);
  55. LCD_WR_DATA8(0x12);
  56. LCD_WR_DATA8(0x27);
  57. LCD_WR_DATA8(0x37);
  58. LCD_WR_DATA8(0x00);
  59. LCD_WR_DATA8(0x0D);
  60. LCD_WR_DATA8(0x0E);
  61. LCD_WR_DATA8(0x10);
  62. LCD_WR_REG(0xE1);
  63. LCD_WR_DATA8(0x10);
  64. LCD_WR_DATA8(0x0E);
  65. LCD_WR_DATA8(0x03);
  66. LCD_WR_DATA8(0x03);
  67. LCD_WR_DATA8(0x0F);
  68. LCD_WR_DATA8(0x06);
  69. LCD_WR_DATA8(0x02);
  70. LCD_WR_DATA8(0x08);
  71. LCD_WR_DATA8(0x0A);
  72. LCD_WR_DATA8(0x13);
  73. LCD_WR_DATA8(0x26);
  74. LCD_WR_DATA8(0x36);
  75. LCD_WR_DATA8(0x00);
  76. LCD_WR_DATA8(0x0D);
  77. LCD_WR_DATA8(0x0E);
  78. LCD_WR_DATA8(0x10);
  79. LCD_WR_REG(0x3A);
  80. LCD_WR_DATA8(0x05);
  81. LCD_WR_REG(0x36);
  82. LCD_WR_DATA8(0x78);
  83. LCD_WR_REG(0x29);
  84. }
图片显示函数为:
  1. void LCD_ShowPicture(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<1600;i++)
  6.            {
  7.                             LCD_WR_DATA8(image[i*2+1]);
  8.                             LCD_WR_DATA8(image[i*2]);
  9.            }                     
  10. }
实现显示测试的主程序为:
  1. int main(void)
  2. {
  3.            u8 i;
  4.            InitDebug();
  5.            InitDelay();
  6.            GPIO_SetDir(GPIO_PA0, 1);
  7.            mdelay(200);
  8.            GPIO_Configuration();
  9.            Lcd_Init();
  10.            LCD_Clear(WHITE);
  11.            BACK_COLOR=WHITE;
  12.            LCD_Clear(WHITE);
  13.            LCD_ShowString(10,0,"LCD_W:",RED);
  14.            LCD_ShowNum(70,0,LCD_W,3,RED);
  15.            LCD_ShowString(10,20,"LCD_H:",RED);
  16.            LCD_ShowNum(70,20,LCD_H,2,RED);
  17.            for(i=0;i<4;i++)
  18.            {
  19.                             LCD_ShowPicture(i*40,40,39+i*40,79);
  20.            }
  21.            while(1);
  22. }
1.jpg
显示QQ图标
  1. void LCD_ShowPicture(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<3808;i++)
  6.            {
  7.                             LCD_WR_DATA8(gImage_jsj[i*2]);
  8.                             LCD_WR_DATA8(gImage_jsj[i*2+1]);
  9.            }                     
  10. }
  1.                             LCD_ShowString(56,0,"LCD_W:",RED);      LCD_ShowNum(70,0,56,3,RED);
  2.                             LCD_ShowString(56,20,"LCD_H:",RED);LCD_ShowNum(70,20,68,2,RED);
  3.                             for(i=0;i<4;i++)
  4.                             {
  5.                                      LCD_ShowPicture(0,0,55,67);
  6.                             }
3.jpg 2.jpg
显示计算机图标
  1. void LCD_ShowPicture(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_moled[i*2]);
  8.                             LCD_WR_DATA8(gImage_moled[i*2+1]);
  9.            }                     
  10. }
  1. LCD_ShowPicture(0,0,159,79);
4.jpg
显示彩色图片











JasonLee27 发表于 2020-8-17 11:08 | 显示全部楼层
图片数据是存储在LCD还是MCU中的,显示需要周期刷新吗?
 楼主| jinglixixi 发表于 2020-8-17 18:33 | 显示全部楼层
本帖最后由 jinglixixi 于 2020-8-17 18:34 编辑

数据是存储在MCU中,无需周期刷新。试过多种芯片,这款是比较合适的一种,而AC7801则不行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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