STM8驱动SSD1306(硬件SPI)

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);
  }
 }
}

本人初学能力有限,如有错误还请指正,谢谢。

你可能感兴趣的:(STM8驱动SSD1306(硬件SPI))