OLED屏显示功能的实现

 RT1052开发板是一款面向中高档应用的产品,因而其配置的显示的显示器件也为触摸屏。这样就使得它留给使用者的扩展端口比较少,要想自行扩展就主要向矩阵键盘接口KEY PAD着手了
       为了给其配置一个必要的显示窗口,本人所选的显示器件是I2C接口的OLED屏,它只需占用2个GPIO口即可使用。为达到图1的显示效果,OLED屏使用的是P24中的引脚1和3,所使用的是GPIO1_IO25和GPIO1_IO27。
<ignore_js_op>
OLED屏显示效果
 
<ignore_js_op>
 
 
      为使SCLK和SDIN引脚输出高低电平,其定义引脚如下:
#define  OLED_SCLK_Set()  GPIO_PinWrite(GPIO1, (25U), 1U);   
#define  OLED_SCLK_Clr()  GPIO_PinWrite(GPIO1, (25U), 0U);
 
#define  OLED_SDIN_Set()  GPIO_PinWrite(GPIO1, (27U), 1U);   
#define  OLED_SDIN_Clr()  GPIO_PinWrite(GPIO1, (27U), 0U);
 
     配置GPIO1_IO25和GPIO1_IO27为输出端口的函数为:
  1. void LCD_GPIO_Cogfig(void)
  2. {
  3.         gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
  4.         GPIO_PinInit(GPIO1, (25U), &led_config);
  5.         GPIO_PinInit(GPIO1, (27U), &led_config);
  6. }
复制代码


      OLED屏的初始化函数为:
  1. void OLED_Init(void)
  2. {
  3.         LCD_GPIO_Cogfig();
  4.         OLED_SCLK_Set();
  5.         OLED_SDIN_Set();
  6.         delay_ms(800);
  7.         OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  8.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  9.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  10.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  11.         OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  12.         OLED_WR_Byte(0x81,OLED_CMD); // contract control
  13.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  14.         OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  15.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  16.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  17.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  18.         OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  19.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  20.         OLED_WR_Byte(0x00,OLED_CMD);//
  21.         
  22.         OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  23.         OLED_WR_Byte(0x80,OLED_CMD);//
  24.         
  25.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  26.         OLED_WR_Byte(0x05,OLED_CMD);//
  27.         
  28.         OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  29.         OLED_WR_Byte(0xF1,OLED_CMD);//
  30.         
  31.         OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  32.         OLED_WR_Byte(0x12,OLED_CMD);//
  33.         
  34.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  35.         OLED_WR_Byte(0x30,OLED_CMD);//
  36.         
  37.         OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  38.         OLED_WR_Byte(0x14,OLED_CMD);//
  39.         
  40.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  41. }
复制代码


     实现图1所示效果的主程序为:
  1. int main(void)
  2. {
  3.     uint16_t i=0;
  4.     gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
  5.     BOARD_ConfigMPU();
  6.     BOARD_InitPins();
  7.     BOARD_BootClockRUN();
  8.     BOARD_InitDebugConsole();
  9.     /* Print a note to terminal. */
  10.     PRINTF("\r\n OLED 屏驱动测试\r\n");
  11.     GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);
  12.     OLED_Init();
  13.     OLED_Clear();
  14.     OLED_ShowString(0,2,"OK1052-C",12);
  15.     OLED_ShowString(0,4,"0.96' OLED TEST",12);
  16.     OLED_ShowString(0,6,"JLXX 2018/10/6",12);
  17.     while(1)
  18.     {
  19.         delay();
  20.         if (g_pinSet)
  21.         {
  22.             GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, 0U);
  23.             g_pinSet = false;
  24.         }
  25.         else
  26.         {
  27.             GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, 1U);
  28.             g_pinSet = true;
  29.         }
  30.     }
  31. }
复制代码

      有了OLED屏这个显示串口,我们在观察运行结果就可以不完全依赖调试串口了。

posted on 2022-06-15 21:44  张凌001  阅读(414)  评论(0编辑  收藏  举报

导航