SSD1306以四线SPI方式驱动,包括D0(CLK),D1(DATA),DC(数据/命令),CS(片选),另外还有RES(复位)线,SSD1306上电后必须复位,然后初始化,不复位会无法显示,目前未在官方手册中找到复位方法介绍,在网上找到的复位方式是:RES拉高–延时–RES拉低–延时–RES拉高,完成复位,延时时间10ms左右可行,其他时间长度未测试;DATA线在CLK线上升沿时读取数据,CLK线空闲时保持低电平未发现问题,空闲保持高电平未测试。
SSD1306初始化指令:
SPI_WR(0xAE,0); //关显示
SPI_WR(0X00,0); //页显示列起始地址
SPI_WR(0X10,0); //页显示高半字节地址(每8列为1高半字节)
SPI_WR(0X40,0); //页显示起始行地址
SPI_WR(0X81,0); //设置对比度寄存器//
SPI_WR(0XCF,0); //设置对比度//
SPI_WR(0XA1,0); //左右非镜像(0xa0:左右镜像)
SPI_WR(0XC0,0); //上下非镜像(0xc8:上下镜像)
SPI_WR(0XA6,0); //正常显示(0xa7:反白)
SPI_WR(0XA8,0); //多路复用//
SPI_WR(0X3F,0); //设置多路复用参数//
SPI_WR(0XD3,0); //上下偏移//
SPI_WR(0X00,0); //设置上下偏移量//
SPI_WR(0XD5,0); //时钟/振荡频率//
SPI_WR(0x80,0); //设置时钟/振荡频率的参数//
SPI_WR(0XD9,0); //预充电周期//
SPI_WR(0XF1,0); //设置预充电周期参数//
SPI_WR(0XDA,0); //设置列引脚硬件配置//
SPI_WR(0X12,0); // //
SPI_WR(0XDB,0); //调整VCOMH输出//
SPI_WR(0X40,0); // //
SPI_WR(0X20,0); //寻址模式//
SPI_WR(0X02,0); //0x00:水平寻址,0x01:垂直寻址,0x02:页寻址,0x03:未定义//
SPI_WR(0X8D,0); //电荷泵启停//
SPI_WR(0X14,0); //0x14:电荷泵启用,0x10:电荷泵禁用//
SPI_WR(0XA4,0); //ROM映射使能,0xa4:允许映射,0xa5:禁止映射(黑屏)
SPI_WR(0XAF,0); //开显示
复位指令中用****隔开结尾加//的为一组指令,0X8D(启停电荷泵)指令在官方手册中未找到说明,但必须写,不写OLED不亮屏,还有部分指令未列入主要都是与偏移量和循环显示有关,静态显示未用到就没列入。
下面插入目前使用程序:
#include
#define RES PC_ODR_ODR1
#define CLK PC_ODR_ODR5
#define DATA PC_ODR_ODR6
#define DC PC_ODR_ODR2
typedef unsigned char u8;
typedef unsigned int u16;
u8 tabe[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF8,0xE0,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xF8,0x80,0x1F,0xFF,0xFF,0xEF,0xEF,0xE0,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0xE1,0x07,
0x3F,0x3F,0x07,0x00,0xE0,0xFC,0xFF,0xFF,0xFF,0xDF,0xCF,0x80,0x80,0x8F,0x9F,0x9F,
0x8F,0x87,0xC0,0xE0,0xFF,0xFF,0xF0,0xC0,0xCF,0xBF,0xBF,0xBF,0x9F,0xC7,0xE0,0xF0,
0xFF,0xFF,0x00,0x00,0xCF,0xCF,0xCF,0xFF,0xFF,0x00,0x00,0xE7,0xDF,0x9F,0x9F,0x8F,
0xC0,0xE0,0xFF,0xFF,0xFC,0xE0,0xC0,0x9C,0xBC,0xBC,0x9C,0x80,0xC0,0xF1,0xEF,0xEF,
0xC0,0xC0,0xF3,0xEF,0xCF,0xC3,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xE0,0x02,0x3E,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x1E,0x02,0x80,0xF8,0xFE,0xFA,0xFB,0x03,0x03,0xFB,0xFF,0xFF,
0xFF,0xE3,0x03,0x03,0xFB,0xFF,0x0F,0x07,0xF3,0xFB,0xFB,0xFB,0xFB,0xE7,0x0F,0x1F,
0xFF,0xFF,0x03,0x03,0xF3,0xF3,0xF7,0xFF,0xFB,0x03,0x03,0xFB,0xFB,0xFF,0xFF,0xFF,
0x00,0x00,0xFF,0xFF,0x3F,0x0F,0x03,0xE3,0xF3,0xFB,0xFB,0xF3,0xF3,0xFF,0xFF,0xFF,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x3F,0x3F,0xBF,0xBF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
void delay_ms(u16 x);
void gpio_init();
void stm8_SPI_init();
void SPI_WR(u8 data_1,u8 DC_pin);
void SSD1306_init();
void display(u8 *poin);
void clean();
void main()
{
gpio_init();
delay_ms(100);
stm8_SPI_init();
delay_ms(100);
SSD1306_init();
clean();
delay_ms(100);
display(tabe);
while(1);
}
void delay_ms(u16 x) //默认时钟16m/8 1ms
{
unsigned int a,b;
while(x--)
{
for (a=0;a<18;a++)
for(b=0;b<19;b++);
}
}
void gpio_init()
{
PC_DDR_DDR1=1;
PC_CR1_C11=1;
PC_CR2_C21=1;
PC_DDR_DDR5=1;
PC_CR1_C15=1;
PC_CR2_C25=1;
PC_DDR_DDR6=1;
PC_CR1_C16=1;
PC_CR2_C26=1;
PC_DDR_DDR2=1;
PC_CR1_C12=1;
PC_CR2_C22=1;
}
void stm8_SPI_init()
{
SPI_CR1=0x04;
SPI_CR2=0xC3;
SPI_ICR=0X00;
SPI_CR1|=0X40;
}
void SPI_WR(u8 data_1,u8 DC_pin)
{
if(DC_pin==0)
{DC=0;} //0写命令
else
{DC=1;} //1写数据
while(!(SPI_SR&0x02));
SPI_DR=data_1;
}
void SSD1306_init()
{
RES=1;
delay_ms(100);
RES=0;
delay_ms(100);
RES=1;
SPI_WR(0xAE,0); //关显示
SPI_WR(0X00,0); //页显示列起始地址
SPI_WR(0X10,0); //页显示列内位地址
SPI_WR(0X40,0); //页显示起始行地址
SPI_WR(0X81,0); //设置对比度寄存器
SPI_WR(0XCF,0); //设置对比度
SPI_WR(0XA1,0); //左右非镜像(0xa0:左右镜像)
SPI_WR(0XC0,0); //上下非镜像(0xc8:上下镜像)
SPI_WR(0XA6,0); //正常显示(0xa7:反白)
SPI_WR(0XA8,0); //多路复用
SPI_WR(0X3F,0); //设置多路复用参数
SPI_WR(0XD3,0); //上下偏移
SPI_WR(0X00,0); //设置上下偏移量
SPI_WR(0XD5,0); //时钟/振荡频率
SPI_WR(0x80,0); //设置时钟/振荡频率的参数
SPI_WR(0XD9,0); //预充电周期
SPI_WR(0XF1,0); //设置预充电周期参数
SPI_WR(0XDA,0); //设置列引脚硬件配置
SPI_WR(0X12,0); //
SPI_WR(0XDB,0); //调整VCOMH输出
SPI_WR(0X40,0); //
SPI_WR(0X20,0); //寻址模式
SPI_WR(0X02,0); //0x00:水平寻址,0x01:垂直寻址,0x02:页寻址,0x03:未定义
SPI_WR(0X8D,0); //电荷泵启停
SPI_WR(0X14,0); //0x14:电荷泵启用,0x10:电荷泵禁用
SPI_WR(0XA4,0); //ROM映射使能,0xa4:允许映射,0xa5:禁止映射(黑屏)
SPI_WR(0XAF,0); //开显示
}
void display(u8 *poin)
{
u8 i,j;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:{SPI_WR(0XB7,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 1:{SPI_WR(0XB6,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 2:{SPI_WR(0XB5,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 3:{SPI_WR(0XB4,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 4:{SPI_WR(0XB3,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 5:{SPI_WR(0XB2,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 6:{SPI_WR(0XB1,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 7:{SPI_WR(0XB0,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
}
for(j=0;j<128;j++)
{
SPI_WR(*poin,1);
poin++;
}
}
}
void clean()
{
u8 i,j;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:{SPI_WR(0XB7,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 1:{SPI_WR(0XB6,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 2:{SPI_WR(0XB5,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 3:{SPI_WR(0XB4,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 4:{SPI_WR(0XB3,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 5:{SPI_WR(0XB2,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 6:{SPI_WR(0XB1,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
case 7:{SPI_WR(0XB0,0);SPI_WR(0X00,0);SPI_WR(0X10,0);}break;
}
for(j=0;j<128;j++)
{
SPI_WR(0x00,1);
}
}
}
本人初学能力有限,如有错误还请指正,谢谢。