前一段时间,在社区得到一块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屏显示效果
|