请选择 进入手机版 | 继续访问电脑版
查看: 1447|回复: 2

[原创] 在LPC54114开发板上实现OLED屏显示

[复制链接]
  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7095
    最后登录
    2023-4-20
    发表于 2021-2-3 22:30:47 | 显示全部楼层 |阅读模式
    前一段时间,在社区得到一块LPC54114开发板,为了不让它在角落吃灰,决定为它配上一块OLED屏来做显示。该OLED屏采用I2C接口工作,故只需占用2I/O口就能解决问题。
    为了免去连线的麻烦,决定直接用板上的Arduino接口来连接,相应的Arduino接口图见图1所示。
    1.png
    1 Arduino接口

    为此,OLED屏与MCU的连接关系如下:
    GND---GND
    VCC---3.3V
    SCL---P0.26
    SDA--- P0.25
    使相应引脚输出高低电平的语句定义为:
    #define OLED_SCLK_Set()  GPIO->B[0][26] = 1;
    #define OLED_SCLK_Clr()  GPIO->B[0][26] = 0;
    #define OLED_SDIN_Set()  GPIO->B[0][25] = 1;
    #define OLED_SDIN_Clr()  GPIO->B[0][25] = 0;
    相关的辅助数据传递的函数为:
    void IIC_Start()
    {
             OLED_SCLK_Set();
             delay_us(5);
             OLED_SDIN_Set();
             delay_us(5);
             OLED_SDIN_Clr();
             delay_us(5);
             OLED_SCLK_Clr();
             delay_us(5);
    }
    void IIC_Stop()
    {
        OLED_SCLK_Set();
             delay_us(5);
        OLED_SDIN_Clr();
             delay_us(5);
             OLED_SDIN_Set();
             delay_us(5);
    }
    void IIC_Wait_Ack()
    {
             OLED_SCLK_Set();
             delay_us(5);
             OLED_SCLK_Clr();
             delay_us(5);
    }
    void Write_IIC_Byte(unsigned char IIC_Byte)
    {
             unsigned char i;
             unsigned char m,da;
             da=IIC_Byte;
             OLED_SCLK_Clr();
             for(i=0;i<8;i++)
             {
                      m=da;
                      m=m&0x80;
                      if(m==0x80)
                      {
                              OLED_SDIN_Set();
                      }
                      elseOLED_SDIN_Clr();
                              da=da<<1;
                      delay_us(5);
                      OLED_SCLK_Set();
                      delay_us(5);
                      OLED_SCLK_Clr();
                      delay_us(5);
                      }
    }
    设置I/O进行输出的配置函数为:
    void OLED_IO_Init(void)
    {
        GPIO->DIR[0] |= 1U << 25;
             GPIO->B[0][25]= 1;
             IOCON_PinMuxSet(IOCON, 0, 25,IOCON_MODE_PULLUP | IOCON_FUNC0 | IOCON_GPIO_MODE | IOCON_DIGITAL_EN |IOCON_INPFILT_OFF);
             
             GPIO->DIR[0]|= 1U << 26;
             GPIO->B[0][26]= 1;
             IOCON_PinMuxSet(IOCON, 0, 26,IOCON_MODE_PULLUP | IOCON_FUNC0 | IOCON_GPIO_MODE | IOCON_DIGITAL_EN |IOCON_INPFILT_OFF);
    }
    OLED屏的初始化函数为:
    void OLED_Init(void)
    {
        OLED_SCLK_Set();
       OLED_SDIN_Set();
        delay_ms(800);
       OLED_WR_Byte(0xAE,OLED_CMD);//--display off
             OLED_WR_Byte(0x40,OLED_CMD);//--setstart line address  
             OLED_WR_Byte(0xB0,OLED_CMD);//--setpage address
             OLED_WR_Byte(0xC8,OLED_CMD);//Comscan direction
             OLED_WR_Byte(0x81,OLED_CMD);// contract control
             OLED_WR_Byte(0xFF,OLED_CMD);//--128   
             OLED_WR_Byte(0xA1,OLED_CMD);//setsegment remap
             OLED_WR_Byte(0xA6,OLED_CMD);//--normal/ reverse
             OLED_WR_Byte(0xA8,OLED_CMD);//--setmultiplex ratio(1 to 64)
             OLED_WR_Byte(0x1F,OLED_CMD);//--1/32duty
             OLED_WR_Byte(0xD3,OLED_CMD);//-setdisplay offset
             OLED_WR_Byte(0x00,OLED_CMD);//
             OLED_WR_Byte(0xD5,OLED_CMD);//setosc division
             OLED_WR_Byte(0xf0,OLED_CMD);//
             OLED_WR_Byte(0xD9,OLED_CMD);//SetPre-Charge Period
             OLED_WR_Byte(0x22,OLED_CMD);//
             OLED_WR_Byte(0xDA,OLED_CMD);//setcom pin configuartion
             OLED_WR_Byte(0x02,OLED_CMD);//
             OLED_WR_Byte(0xDB,OLED_CMD);//setVcomh
             OLED_WR_Byte(0x49,OLED_CMD);//
             OLED_WR_Byte(0x8D,OLED_CMD);//setcharge pump enable
             OLED_WR_Byte(0x14,OLED_CMD);//
             OLED_WR_Byte(0xAF,OLED_CMD);//--turnon oled panel
    }
    实现显示效果的主程序为:
    int main(void)
    {
             BOARD_InitPins();
             BOARD_BootClockRUN();
        CLOCK_EnableClock(kCLOCK_InputMux);
        CLOCK_EnableClock(kCLOCK_Iocon);
       CLOCK_EnableClock(kCLOCK_Gpio0);
       OLED_IO_Init();
             delay_us(10);
             OLED_Init();
             OLED_Clear();
             OLED_ShowString(0,0,"LPC54114TEST",16);
             OLED_ShowString(0,2,"OLEDDISPLAY",16);
             while(1);
    }
    OLED屏的显示效果如图2所示
    2.png
    2 OLED屏显示效果

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-17 16:33
  • 签到天数: 268 天

    [LV.8]以坛为家I

    3334

    主题

    6603

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32473
    最后登录
    2024-5-29
    发表于 2021-2-4 09:24:32 | 显示全部楼层
    感谢分享
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7095
    最后登录
    2023-4-20
     楼主| 发表于 2021-2-4 09:35:25 | 显示全部楼层

    应尽之力,感谢支持!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-29 09:31 , Processed in 0.100704 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表