[开发工具] 【新定义MCU开发板测评】 + LCD屏的驱动显示

[复制链接]
 楼主| jinglixixi 发表于 2022-11-16 17:22 | 显示全部楼层 |阅读模式
前面介绍了双色OLED屏的驱动,这次以一种0.96LCD屏的显示驱动,其显示分辨率为160*80
该显示屏以SPI方式,本打算以最经济的方式利用Arduio接口来连接,无奈在SPI接口部位并没有提供VCC,只好以飞线的方式来连接,具体形式如下图所示。
T.jpg
LCD屏连接及显示效果


除电源引脚外,LCD屏与开发板的连接关系如下:
OLED_SCLK ---- P43
OLED_SDIN ---- P45
OLED_RST  ----  P44
OLED_DC   ----  P42
OLED_CS   ----  P53
OLED_BLK  ----  P06

为此,以GPIO口模拟SPI发送字节数据的函数为:
  1. void LCD_Writ_Bus(u8 dat)
  2. {
  3.     u8 i;
  4.     OLED_CS=0;
  5.     for(i=0;i<8;i++)
  6.     {
  7.         OLED_SCLK=0;
  8.         if(dat&0x80)
  9.            OLED_SDIN=1;
  10.         else
  11.            OLED_SDIN=0;
  12.         OLED_SCLK=1;
  13.         dat<<=1;
  14.     }
  15.     OLED_CS=1;
  16. }
LCD屏的初始化函数为:
  1. void Lcd_Init(void)
  2. {
  3.   OLED_RST=0;
  4.   Delay(200);
  5.   OLED_RST=1;
  6.   Delay(200);
  7.   LCD_WR_REG(0x11);
  8.   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=1;
  84. }
LCD屏以指定色彩清除屏幕的函数为:
  1. void LCD_Clear(u16 Color)
  2. {
  3.     u16 i,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. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color)
  2. {
  3.     u8 temp;
  4.     u8 pos,t;
  5.       u16 x0=x;
  6.     if(x>LCD_W-16||y>LCD_H-16) return;
  7.     num=num-' ';
  8.     LCD_Address_Set(x,y,x+8-1,y+16-1);
  9.     if(!mode)
  10.     {
  11.         for(pos=0;pos<16;pos++)
  12.         {
  13.             temp=asc2_1608[(u16)num*16+pos];
  14.             for(t=0;t<8;t++)
  15.           {
  16.                 if(temp&0x01)LCD_WR_DATA(color);
  17.                 else LCD_WR_DATA(BACK_COLOR);
  18.                 temp>>=1;
  19.                 x++;
  20.           }
  21.             x=x0;
  22.             y++;
  23.         }
  24.     }
  25.     else
  26.     {
  27.         for(pos=0;pos<16;pos++)
  28.         {
  29.             temp=asc2_1608[(u16)num*16+pos];
  30.             for(t=0;t<8;t++)
  31.             {
  32.                 if(temp&0x01) LCD_DrawPoint(x+t,y+pos,color);
  33.                 temp>>=1;
  34.             }
  35.         }
  36.     }
  37. }

  38. void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)
  39. {
  40.     while(*p!='\0')
  41.     {
  42.         if(x>LCD_W-16){x=0;y+=16;}
  43.         if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
  44.         LCD_ShowChar(x,y,*p,0,color);
  45.         x+=8;
  46.         p++;
  47.     }
  48. }
实现图示效果的主程序为:
  1. void main(void)
  2. {
  3.         Delay(50);
  4.         P0CON = 0xFF;
  5.         P0PH  = 0x00;
  6.         P4CON = 0xFF;
  7.         P4PH  = 0x01;
  8.         P5CON = 0xFF;
  9.         P5PH  = 0x00;
  10.         GPIO_Init(GPIO0, GPIO_PIN_6, GPIO_MODE_OUT_PP);
  11.         GPIO_Init(GPIO5, GPIO_PIN_3, GPIO_MODE_OUT_PP);
  12.     GPIO_Init(GPIO4, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5, GPIO_MODE_OUT_PP);
  13.         Delay(100);
  14.         Lcd_Init();
  15.     LCD_Clear(RED);
  16.         BACK_COLOR=RED;
  17.         LCD_ShowString(20,10,"NBK-RD8x3x TEST",YELLOW);
  18.         LCD_ShowString(20,30,"Redfine",YELLOW);
  19.         while(1);
  20. }
本打算以该显示来完成图像的显示,可惜的是在编译程序时才发现程序的存储较为有限,以致无法存放下160*80像素图片的显示。
ingramward 发表于 2023-2-7 20:08 | 显示全部楼层
支持触摸的功能吗              
 楼主| jinglixixi 发表于 2023-2-7 20:23 | 显示全部楼层
ingramward 发表于 2023-2-7 20:08
支持触摸的功能吗

这款屏没有触摸功能,可选相近的带触摸功能的屏。
xiaoyaodz 发表于 2023-2-7 20:57 | 显示全部楼层
这个可以使用ips屏幕。              
pentruman 发表于 2023-2-7 22:13 | 显示全部楼层
可以使用硬件spi驱动的吗?              
 楼主| jinglixixi 发表于 2023-2-8 08:31 | 显示全部楼层
pentruman 发表于 2023-2-7 22:13
可以使用硬件spi驱动的吗?

应该可以,只是自己习惯用模拟发送。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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

518

主题

2933

帖子

39

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