在线时间1537 小时
UID258281
注册时间2014-12-6
NXP金币0
TA的每日心情 | 开心 2020-1-12 00:23 |
---|
签到天数: 745 天 [LV.9]以坛为家II
金牌会员
- 积分
- 6868
- 最后登录
- 2020-7-15
|
本帖最后由 lising 于 2018-11-28 15:51 编辑
本次实验是驱动IIC接口的0.69寸OLED模块。
一、实验资源
1、LPC11U68(OM13058)开发板;
2、KEIL V5.25.2.0;
3、lpcopen_3_03_keil_iar_lpcxpresso_11u68;
4、0.69寸OLED模块;
二、实验过程
1、硬件制作、连接:0.69寸的OLED模块是热转印PCB自制的,当时觉得0.96与0.69相比没差多少,结果到手后才知道有多小。这个OLED内的主控是SSD1307Z,与常见的0.96寸OLED所用的SSD1306差不多。96*16个像素,能同时显示6个16*16点阵汉字。这个OLED非常小巧可爱,做点小东西用处还是挺多的,唯一的遗憾就是要有升压电路。我这里用了SX1308做升压,PCB有点大、布线有点乱还能再优化。PCB上引出了SDA、SCL、RST、VCC、GND分别与开发板上的PIO0_5、PIO0_4、PIO0_8及VCC、GND相连接;
2、程序实现。第一次驱动IIC接口的OLED,程序是参考了网上很多朋友的程序而稼接成的。程序其它部分都大致相同,在这个程序中由于0.96和0.69OLED的行、列地址有些差别,造成与0.96OLED驱动程序上小的区别。下面是0.96和0.69OLED的厂家数据手册截图:
从上面图中可以看出,0.96OLED的列是从0~127;行是从0~63,构成128*64;0.69OLED的列是从32~127;行是从8~23,构成96*16;刚开始测试写入字符串时发现会从第5个字符开始显示,前面4个不知道跑哪里去了。后面尝试对程序做了一些调整后可以显示了,如:
- //显示汉字
- void OLED_ShowHZ(uint8_t x,uint8_t y,uint8_t no)
- {
- uint8_t t, adder = 0;
- x += 32;//这里相当于将显示列地址向后移32列
- setPos(x,y);
- for(t=0; t<16; t++)
- {
- writeData(Hzk[2 * no][t]);
- adder += 1;
- }
- setPos(x, y+1);
- for(t=0; t<16; t++)
- {
- writeData(Hzk[2 * no + 1][t]);
- adder += 1;
- }
- }
复制代码- //显示字符串
- void showString(uint8_t x, uint8_t y, uint8_t* str, FONT_SIZE f_size)
- {
- x+=32;//这里相当于将显示列地址向后移32列
- while(*str)
- {
- showChar(x,y,*str++,f_size);
- x += f_size; //增加横坐标,移到下一个汉字位置
- }
- }
复制代码
OLED的初始化直接采用了手册里提供的:
- void OLED_Init(void)
- {
- OLED_RESPort_Init();
- /////////////////////以下为SSD1307手册////////////////////////////
- writeCommand(0xae); //display off
- writeCommand(0xd5); //Set Display ClocDivide Ratio/Oscillator Frequency
- writeCommand(0xc4); //100HZ
- writeCommand(0xa8); //Set Multiplex Ratio
- writeCommand(0x0f); //set 16mux
- writeCommand(0xd9); //Set Pre-charge Period
- writeCommand(0x22); //
- writeCommand(0x20); //Set Memory Addressing Mode
- writeCommand(0x02);
- writeCommand(0xa0); //seg re-map 0->127
- writeCommand(0xc8); //COM scan direction COM(N-1)-->COM0
- writeCommand(0xda); //Set COM Pins Hardware Configuration
- writeCommand(0x10);
- writeCommand(0x81); //Set Contrast Control
- writeCommand(0x10); //
- writeCommand(0xb0); //Set Page Start Address for Page Addressing Mode
- writeCommand(0xd3); //Set Display offset
- writeCommand(0x1f); //
- writeCommand(0xa6); //Display Normal
- writeCommand(0xa4); //Entire Display Off
- writeCommand(0xdb); //Set VCOMH Level
- writeCommand(0x30); //0.83*VCC
- writeCommand(0xaf); //display on
- }
复制代码
下面是主函数:
- int main(void)
- {
- SystemCoreClockUpdate();
-
- delay_init();
- IIC_Init();
- OLED_Init();
-
- formatScreen(0xff);//0xff全屏点亮
- delay_ms(600);delay_ms(600);delay_ms(600);
- formatScreen(0x00);//0x00全屏熄灭
-
- //SetScreenDir(SCREEN_DOWN);
- //SetScreenReverse(SCREEN_REVERSE);//反白显示
- OLED_ShowHZ(0,0,0);//依次显示“NXP社区!”
- OLED_ShowHZ(16,0,1);
- OLED_ShowHZ(32,0,2);
- OLED_ShowHZ(48,0,3);
- OLED_ShowHZ(64,0,4);
- OLED_ShowHZ(80,0,5);
-
- delay_ms(600);delay_ms(600);delay_ms(600);
- formatScreen(0x00);//0x00全屏熄灭
-
- showString(8,0,(uint8_t *)"LPCXpresso",FONT_16_EN);
- delay_ms(600);delay_ms(600);delay_ms(600);
- formatScreen(0x00);//0x00全屏熄灭
-
- showString(28,0,(uint8_t *)"Board",FONT_16_EN);//
- delay_ms(600);delay_ms(600);delay_ms(600);
- formatScreen(0x00);//0x00全屏熄灭
-
- showString(16,0,(uint8_t *)"LPC11U68",FONT_16_EN);
-
- while(1)
- {
- }
- }
复制代码
三、实验结果(模特PDIP8)
1、整体
2、近照
3、反白显示效果
4、全屏显示
四、实验总结
看手册非常重要。另外,IIC的SDA端口在改变输入、输出状态时要置高电平:
- void Set_SDA_OUT(void)
- {
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 5);//设置PIO0_5端口为输出SDA
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
- Chip_GPIO_WritePortBit(LPC_GPIO, 0, 5, 1);//拉高SDA
- }
复制代码 IIC初始化时SDA、SCL均设置为了输出状态,这两个端口也要置为高电平:
- void IIC_Init(void)
- {
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能
-
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 4);//设置PIO0_4端口为输出SCL
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 5);//设置PIO0_5端口为输出SDA
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 4, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
- Chip_GPIO_WritePortBit(LPC_GPIO, 0, 4, 1);//拉高SCL
- Chip_GPIO_WritePortBit(LPC_GPIO, 0, 5, 1);//拉高SDA
- }
复制代码 开始时没有进行置高平处理,显示汉字会有乱码出现,加入置高平语句后显示正常了。
顺便把手册传上来有需要的可以看看。
M00240_VGM096016A1B01_A01.rar
(588.56 KB, 下载次数: 35)
|
|