本帖最后由 jinglixixi 于 2020-11-21 10:36 编辑
OLED屏是一种自身发光的显示器件,它有许多种类,如按色彩分,可分为单色屏、双色屏及彩色屏等;按尺寸分,可分为0.91'、0.96'屏等;按接口方式分,可分为I2C接口和SPI接口等。 其中,以I2C接口的OLED屏最有特点,它只用2个I/O口就可完成显示任务,且比数码管所显示的内容要丰富。 在掌握GPIO口使用的基础上,就可十分轻松地实现驱动OLED屏显示的目标。 在这里OLED屏与MCU的连接关系为: SCL---PA2 SDA--- PA3 驱动OLED屏所定义的输出高低电平的语句为: #define SCL_high GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET) #define SCL_low GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET) #define SDA_high GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_SET) #define SDA_low GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET) 配置2个引脚为输出功能的函数为: void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能与LED相关的GPIO端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; //配置GPIO引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置GPIO模式为推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO口输出速度 GPIO_Init(GPIOA,&GPIO_InitStructure); //调用库函数,初始化GPIOA GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3); //设置引脚输出高电平 } 在参考厂家提供OLED屏驱动例程的情况下,可以快速地完成程序的移植。 辅助驱动的基本函数为: void IIC_Start() { SCL_high; SDA_high; SDA_low; SCL_low; } void IIC_Stop() { SCL_low; SDA_low; SCL_high; SDA_high; } OLED屏的初始化函数为: void Initial_M096128x64_ssd1306() { Write_IIC_Command(0xAE); //displayoff Write_IIC_Command(0x20); //SetMemory Addressing Mode Write_IIC_Command(0x10); //00,HorizontalAddressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode(RESET);11,Invalid Write_IIC_Command(0xb0);//Set Page Start Address for Page Addressing Mode,0-7 Write_IIC_Command(0xc8);//Set COM Output Scan Direction Write_IIC_Command(0x00);//---set low column address Write_IIC_Command(0x10);//---set high column address Write_IIC_Command(0x40);//--set start line address Write_IIC_Command(0x81);//--set contrast control register Write_IIC_Command(0xdf); Write_IIC_Command(0xa1);//--set segment re-map 0 to 127 Write_IIC_Command(0xa6);//--set normal display Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64) Write_IIC_Command(0x3F);// Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAMcontent Write_IIC_Command(0xd3);//-set display offset Write_IIC_Command(0x00);//-not offset Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency Write_IIC_Command(0xf0);//--set divide ratio Write_IIC_Command(0xd9);//--set pre-charge period Write_IIC_Command(0x22); // Write_IIC_Command(0xda);//--set com pins hardware configuration Write_IIC_Command(0x12); Write_IIC_Command(0xdb);//--set vcomh Write_IIC_Command(0x20);//0x20,0.77xVcc Write_IIC_Command(0x8d);//--set DC-DC enable Write_IIC_Command(0x14);// Write_IIC_Command(0xaf);//--turn on oled panel } 显示图片的函数为: void Picture() { unsigned char x,y; unsigned int i=0; for(y=0;y<8;y++) { Write_IIC_Command(0xb0+y); Write_IIC_Command(0x0); Write_IIC_Command(0x10); for(x=0;x<132;x++) { Write_IIC_Data(show[i++]); } } } 经程序编译,其结果如图1所示。 图1 完成编译
在通过编译后,使用下载工具即可完成下载,其界面如图2所示。 图2 完成下载
在完成下载,程序的运行效果如图3所示。 图3 运行效果
在添加字符库及相关显示函数的情况下,其效果为: 图5 混排显示效果
|
@21小跑堂 :感谢您的指导,明确了方向,继续努力!
感谢参与原创文章奖励活动,本篇文章字数方面还请多多加油哈!