| 前一段时间,在社区得到一块LPC54114开发板,为了不让它在角落吃灰,决定为它配上一块OLED屏来做显示。该OLED屏采用I2C接口工作,故只需占用2个I/O口就能解决问题。 为了免去连线的麻烦,决定直接用板上的Arduino接口来连接,相应的Arduino接口图见图1所示。 图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 OLED屏显示效果 
 |