本帖最后由 jinglixixi_457498010 于 2023-7-9 13:57 编辑

LCD屏具有较强的表现力,既适合文字信息的显示,也适合图像的表现。
这里使用的是一款0.96寸的LCD显示屏,其显示分辨率为80*160像素点,它以SPI的方式来工作。

其引脚与开发板的连接关系为:
CLK---PB4
DIN---PB5
RES--PB6
DC ---PB7
CS ---PC3
BLK---3.3V

所使用的接口如图1所示:
image.png
图1 引脚占用

image.png
图2连接形式

#defineOLED_SCLK_Set()  gpio_set_level(GPIO_PB4, 1) //CLK
#defineOLED_SCLK_Clr()  gpio_set_level(GPIO_PB4, 0)
#defineOLED_SDIN_Set()  gpio_set_level(GPIO_PB5, 1) //
DIN#defineOLED_SDIN_Clr()  gpio_set_level(GPIO_PB5, 0)
#defineOLED_RST_Set()   gpio_set_level(GPIO_PB6, 1) //RES
#defineOLED_RST_Clr()    gpio_set_level(GPIO_PB6,0)
#defineOLED_DC_Set()    gpio_set_level(GPIO_PB7, 1) //DC
#defineOLED_DC_Clr()    gpio_set_level(GPIO_PB7, 0)
#defineOLED_CS_Set()    gpio_set_level(GPIO_PC3, 1) //CS
#defineOLED_CS_Clr()    gpio_set_level(GPIO_PC3, 0)

以GPIO方式模拟SPI方式方式字节数据的函数为:
  1. voidLCD_Writ_Bus(unsignedchardat)
  2. {
  3.     unsignedchari;
  4.     OLED_CS_Clr();
  5.     for(i=0;i<8;i++)
  6.     {
  7.         OLED_SCLK_Clr();
  8.         if(dat&0x80)
  9.            OLED_SDIN_Set();
  10.         else
  11.            OLED_SDIN_Clr();
  12.         OLED_SCLK_Set();
  13.         dat<<=1;
  14.     }
  15.     OLED_CS_Set();
  16. }
LCD屏的初始化函数为:
  1. voidLcd_Init(void)
  2. {
  3.   OLED_RST_Clr();
  4.   delay_ms(200);
  5.   OLED_RST_Set();
  6.   delay_ms(200);
  7.   LCD_WR_REG(0x11);
  8.   delay_ms(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. voidLCD_Clear(unsignedint Color)
  2. {
  3.     unsignedinti,j;
  4.     LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
  5.     for(i=0;i<LCD_W;i++)
  6.     {
  7.        for (j=0;j<LCD_H;j++)
  8.        {
  9.              LCD_WR_DATA(Color);
  10.        }
  11.     }
  12. }

实现图像显示的函数为:
  1. voidLCD_ShowPicturea(unsignedintx1,unsignedint y1,unsignedint x2,unsignedint y2)
  2. {
  3.        unsignedint i;
  4.       LCD_Address_Set(x1,y1,x2,y2);
  5.       for(i=0;i<12800;i++)
  6.       {
  7.            LCD_WR_DATA8(gImage_FJ[i*2]);
  8.            LCD_WR_DATA8(gImage_FJ[i*2+1]);
  9.       }
  10. }
此外,还配置了字符、数值及汉字显示函数,其验证显示效果的主程序为:
  1. int main (void)
  2. {
  3.          sys_init(LDO_1P4_LDO_1P8, VBAT_MAX_VALUE_GREATER_THAN_3V6);
  4.          user_read_flash_value_calib();
  5.          CCLK_24M_HCLK_24M_PCLK_24M;
  6.          user_init();
  7.          delay_ms(1000);
  8.          Lcd_Init();
  9.          BACK_COLOR=YELLOW;
  10.          POINT_COLOR=RED;
  11.          LCD_Clear(RED);
  12.          POINT_COLOR=RED;
  13.          LCD_ShowPicturea(0,0,159,79);
  14.          LCD_ShowChinese(0,0,8,16,RED);
  15.          LCD_ShowChar(0,20,'V',0,RED);
  16.          LCD_ShowNum(20,20,123,3,RED);
  17.          while (1) ;
  18.          return 0;
  19. }
经程序的编译和下载,其测试效果见图3所示,其显示效果该是相对不错的!

image.png
图3 显示效果