本帖最后由 yinwuqing110 于 2022-3-7 23:05 编辑
相信大家对SSD1306并不陌生,它在嵌入式产品应用比较广泛。SSD1306是一个单片CMOS OLED/PLED驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统。该芯片专为共阴极OLED面板设计。SSD1306中嵌入了对比控制器、显示RAM和晶振,并因此减少了外部器件和功耗。有256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000串口,IIC接口或SPI接口。适用于多数简介的应用,可应用在录音笔,MP3播放器和计算器等产品上。
在AT-START-F425 V1.0的开发板上,有一处管脚的布局可以与IIC接口型的OLED模块无缝连接,无需通过杜邦线连接。从顶层点位图及原理图可知,J3的第9脚连接着GPIOB9,为SDA信号引脚;J3的第10脚连接着GPIOB8,为SCL信号引脚。
而我们常用的IIC接口型的OLED模块,引脚从左至右的封装为SDA、SCL、VCC、GND,因此在代码中只需将SDA与SCL的管脚定义调换过来即可正常驱动。接下来在昨天创建的点灯工程中,添加驱动SSD1306的应用代码。在OLED屏上显示中文字符或者BMP图片,这里需要借助“PCtoLCD2002”取字模软件,见如下附件。
OLE显示屏专用取模工具_PCtoLCD2002.rar
(701.79 KB)
部分参考代码如下:
#ifndef __OLED_H
#define __OLED_H
#include "at32f425_board.h"
#include "stdlib.h"
#include "stdint.h"
#define OLED_MODE 0
#define SIZE 8
#define XLevelL 0x00
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
#define OLED_SCLK_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_9)//SCL
#define OLED_SCLK_Set() gpio_bits_set(GPIOB,GPIO_PINS_9)
#define OLED_SDIN_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_8)//SDA
#define OLED_SDIN_Set() gpio_bits_set(GPIOB,GPIO_PINS_8)
#define OLED_CMD 0
#define OLED_DATA 1
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
#endif
#include "oled.h"
#include "stdlib.h"
#include "at32f425.h"
#include "oledfont.h"
void IIC_Start()
{
OLED_SCLK_Set();
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
void IIC_Stop()
{
OLED_SCLK_Set() ;
OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
void IIC_Wait_Ack()
{
OLED_SCLK_Set() ;
OLED_SCLK_Clr();
}
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();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
}
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78);
IIC_Wait_Ack();
Write_IIC_Byte(0x00);
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
IIC_Wait_Ack();
Write_IIC_Byte(0x40);
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
#include "at32f425_board.h"
#include "oled.h"
#include "bmp.h"
int main(void)
{
int i = 0;
at32_board_init();
OLED_Init();
OLED_Clear();
while(1)
{
OLED_Clear();
OLED_ShowCHinese(6,0,20);//欢
OLED_ShowCHinese(14+10,0,21);//迎
OLED_ShowCHinese(32+10,0,22);//使
OLED_ShowCHinese(50+10,0,23);//用
OLED_ShowCHinese(68+10,0,24);//雅
OLED_ShowCHinese(86+10,0,25);//特
OLED_ShowCHinese(104+10,0,26);//力
OLED_ShowString(16,3,"AT-START-F425",16);
OLED_ShowString(26,6,"2022-03-06",16);
for(i = 0; i < 3; i++)
{
gpio_bits_reset(GPIOC,GPIO_PINS_2);
delay_ms(200);
gpio_bits_set(GPIOC,GPIO_PINS_2);
delay_ms(200);
gpio_bits_reset(GPIOC,GPIO_PINS_3);
delay_ms(200);
gpio_bits_set(GPIOC,GPIO_PINS_3);
delay_ms(200);
gpio_bits_reset(GPIOC,GPIO_PINS_5);
delay_ms(200);
gpio_bits_set(GPIOC,GPIO_PINS_5);
delay_ms(200);
}
for(i = 0; i < 8; i++)
{
gpio_bits_set(GPIOC,GPIO_PINS_2);
gpio_bits_set(GPIOC,GPIO_PINS_3);
gpio_bits_set(GPIOC,GPIO_PINS_5);
delay_ms(100);
gpio_bits_reset(GPIOC,GPIO_PINS_2);
gpio_bits_reset(GPIOC,GPIO_PINS_3);
gpio_bits_reset(GPIOC,GPIO_PINS_5);
delay_ms(100);
}
OLED_Clear();
OLED_DrawBMP(0,0,128,8,BMP3);
delay_ms(1200);
}
}
将OLED模块直接与板上相对应的排针孔位相连,编译工程无误,点击下载按钮,便可观察到代码中所设置的中文字符与绘画的BMP图片了,如下图所示。此次分享就告一段落,咱们下期再会。
|