[应用方案] 基于NV32F100的彩色OLED屏显示

[复制链接]
 楼主| jinglixixi 发表于 2020-8-16 11:25 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-8-16 11:28 编辑

常规的OLED屏多是单色显示器件,即使是双色屏也首行是一种色彩,其它行是一种色彩。本次使用的是一款16位色的彩色屏,因此其色彩表现力十分丰富,适于为小型便携式装置的显示器。
1. OLED屏字符显示
1)OLED屏与NV32F100的连接关系如下:
     SCLK --- PE0
     SDIN ---PE1
     RST  --- PE2
     DC   --- PE3
     CS   --- PE5
     BLK  --- PE6
2)为进行显示定义引脚输出高低电平的语句为:
#defineOLED_SCLK_Clr() GPIO_PinClear(GPIO_PTE0);  // clr PE1
#defineOLED_SCLK_Set() GPIO_PinSet(GPIO_PTE0);

#defineOLED_SDIN_Clr() GPIO_PinClear(GPIO_PTE1);   // din PE0
#defineOLED_SDIN_Set() GPIO_PinSet(GPIO_PTE1);

#defineOLED_RST_Set()   GPIO_PinSet(GPIO_PTE2);  // rst PE2
#defineOLED_RST_Clr()   GPIO_PinClear(GPIO_PTE2);

#defineOLED_DC_Set()    GPIO_PinSet(GPIO_PTE3);  // dc PE 3
#defineOLED_DC_Clr()    GPIO_PinClear(GPIO_PTE3);

#defineOLED_CS_Set()     GPIO_PinSet(GPIO_PTE5);  // dc PE5
#defineOLED_CS_Clr()    GPIO_PinClear(GPIO_PTE5);

#defineOLED_BLK_Set()   GPIO_PinSet(GPIO_PTE6);  // dc PE6
#defineOLED_BLK_Clr()   GPIO_PinClear(GPIO_PTE6);

3)OLED屏初始化函数为:
  1. void Lcd_Init(void)
  2. {
  3. OLED_RST_Clr();
  4. delay_ms(20);
  5. OLED_RST_Set();
  6. delay_ms(20);
  7. OLED_BLK_Set();
  8. LCD_WR_REG(0x11);
  9. delay_ms(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. }

4)汉字显示函数为:
  1. void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size1,u16 color)   
  2. {
  3.        u8 i,j;
  4.        u8 *temp,size11;
  5.        if(size1==16)
  6.        {
  7.          temp = Hzk16;
  8.        }
  9.        if(size1==32)
  10.        {
  11.          temp = Hzk32;
  12.        }
  13.        LCD_Address_Set(x,y,x+size1-1,y+size1-1);
  14.        size11=size1*size1/8;
  15.        temp+=index*size11;
  16.        for(j=0;j<size11;j++)
  17.        {
  18.               for(i=0;i<8;i++)
  19.               {
  20.                      if((*temp&(1<<i))!=0)
  21.                      {
  22.                             LCD_WR_DATA(color);
  23.                      }
  24.                      else
  25.                      {
  26.                             LCD_WR_DATA(BACK_COLOR);
  27.                      }
  28.               }
  29.               temp++;
  30.         }
  31. }

2. OLED屏图片显示
1)图片显示函数
  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. }

2)显示主程序
  1. int main (void)
  2. {
  3.     u8 i;
  4.     float t=0;
  5.       
  6.     sysinit();
  7.     cpu_identify();
  8.     RTC_ConfigType  sRTCConfig;
  9.     RTC_ConfigType  *pRTCConfig = &sRTCConfig;
  10.     pRTCConfig->u16ModuloValue = 9;
  11.     pRTCConfig->bInterruptEn   = RTC_INTERRUPT_ENABLE;   
  12.     pRTCConfig->bClockSource   = RTC_CLKSRC_1KHZ;        
  13.     pRTCConfig->bClockPresaler = RTC_CLK_PRESCALER_100;   
  14.     RTC_SetCallback(RTC_Task);
  15.     RTC_Init(pRTCConfig);

  16.     GPIO_Init(GPIOB, GPIO_PTE7_MASK, GPIO_PinOutput);
  17.     GPIO_Init(GPIOB, GPIO_PTE0_MASK, GPIO_PinOutput);
  18.     GPIO_Init(GPIOB, GPIO_PTE1_MASK, GPIO_PinOutput);
  19.     GPIO_Init(GPIOB, GPIO_PTE2_MASK, GPIO_PinOutput);
  20.     GPIO_Init(GPIOB, GPIO_PTE3_MASK, GPIO_PinOutput);
  21.     GPIO_Init(GPIOB, GPIO_PTE5_MASK, GPIO_PinOutput);
  22.     GPIO_Init(GPIOB, GPIO_PTE6_MASK, GPIO_PinOutput);
  23.     Lcd_Init();
  24.     LCD_Clear(WHITE);
  25.     BACK_COLOR=WHITE;
  26.     delay_ms(100);
  27.     while(1)
  28.     {
  29.                      LCD_ShowChinese(28,0,0,32,RED);
  30.                      LCD_ShowChinese(60,0,1,32,RED);
  31.                      LCD_ShowChinese(92,0,2,32,RED);
  32.                      LCD_ShowChinese(20,40,0,16,RED);
  33.                      LCD_ShowChinese(36,40,1,16,RED);
  34.                      LCD_ShowChinese(52,40,2,16,RED);
  35.                      LCD_ShowChinese(68,40,3,16,RED);
  36.                      LCD_ShowChinese(84,40,4,16,RED);
  37.                      LCD_ShowChinese(100,40,5,16,RED);
  38.                      LCD_ShowChinese(116,40,6,16,RED);
  39.                      LCD_ShowString(0,60,"1.44 TFT SPI",RED);
  40.                      LCD_ShowNum1(104,60,t,5,RED);//ÏÔʾСÊý
  41.                      t+=0.01;
  42.                      delay_ms(1000);
  43.                     
  44.                      LCD_Clear(WHITE);
  45.                      LCD_ShowString(10,0,"LCD_W:",RED);      
  46.                      LCD_ShowNum(70,0,LCD_W,3,RED);
  47.                      LCD_ShowString(10,20,"LCD_H:",RED);
  48.                      LCD_ShowNum(70,20,LCD_H,2,RED);
  49.                      for(i=0;i<4;i++)
  50.                      {
  51.                             LCD_ShowPicture(i*40,40,39+i*40,79);
  52.                      }
  53.                     
  54.                      delay_ms(1000);
  55.                      LCD_Clear(WHITE);
  56.       }
  57.   }

3)运行效果
a.jpg
运行效果图
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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

518

主题

2933

帖子

39

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