天天看點

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

文章目錄

  • 簡介
  • 硬體相關
    • SSD1306控制
    • OLED顯存
    • 初始化過程
  • 操作相關
    • 寫入資料(或指令)
    • 尋址模式
      • 頁尋址模式
      • 水準尋址模式
      • 垂直尋址模式
  • 代碼相關
  • 附:取模工具
    • 取模工具
    • 配置

簡介

OLED:Organic Light-Emitting Diode,即有機發光二極管,又稱為有機電雷射顯示(Organic Electroluminesence Display,OELD)。

OLED 由于同時具備自發光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面闆、使用溫度範圍廣、構造及制程較簡單等優異之特性,被認為是下一代的平面顯示器新興應用技術。

stm32使用的OLED有多種模式可以選擇,包括8080模式(13條信号線),6800模式(13條信号線),SPI模式(四線),IIC模式(兩線)(也被稱為I2C),四種模式通過子產品的BS1及BS2進行設定。本文主要介紹IIC模式的原理及相關代碼配置。

IIC 總線接口詳細介紹

8080與6800的差別:存取的控制

8080是通過“讀使能(RE)”和“寫使能(WE)”兩條控制線進行讀寫操作

6800是通過“總使能(E)”和“讀寫選擇(W/R)”兩條控制線進行

硬體相關

SSD1306控制

SSD1306,即OLED上的晶片。

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

0:這個指令包含了兩個位元組,第一個 0X81 為指令(預告即将發出設定對比度的值),随後發送的一個位元組為要設定的對比度的值。

1:0XAE 為關閉顯示指令; 0XAF 為開啟顯示指令 。

2:第一個 0X8D為指令,第二個位元組 表示電荷泵的開關狀态 。(必開,否則看不到顯示)

3:用于設定頁位址,其低三位的值對應頁位址。 (三位可以設定8個位址)

OLED顯存

SSD1306的顯存容量總共為128*64bit,SSD1306将這些顯存分為8page,每個page包含8行,每行128bit,即每一page包含128個位元組。

顯存:用來存儲要處理的圖形資訊的部件(大概就等于記憶體吧)
STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

初始化過程

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

操作相關

寫入資料(或指令)

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

總結一下,每一次寫入資料(或指令)的步驟:

1.使用起始信号

I2C_Start();

2.發送OLED位址:0x78

Send_Byte(0x78);

3.發送應答信号

I2C_WaitAck();

4.發送寄存器位址(指令或資料)

5.發送應答信号

6.發送指令或資料

7.再一次發送應答信号

8.使用結束信号

I2C_Stop();;

//mode:資料/指令标志 0,表示指令;1,表示資料;
void OLED_WR_Byte(u8 dat,u8 mode)
{
 I2C_Start();
 Send_Byte(0x78);
 I2C_WaitAck();
 if(mode){Send_Byte(0x40);}
  else{Send_Byte(0x00);}
 I2C_WaitAck();
 Send_Byte(dat);
 I2C_WaitAck();
 I2C_Stop();
}
           

開始信号:讓SCL時鐘保持高電平,然後讓SDA資料信号由高變低表示一個開始信号。當IIC總線上的裝置檢測到開始信号就知道處理器要發送資料。

停止信号:讓SCL時鐘保持高電平,然後讓SDA資料信号由低變高表示一個停止信号。當IIC總線上的裝置檢測到停止信号就知道處理器結束資料傳輸。

尋址模式

OLED的顯存分為8page,每個page都有8行,每行又有128個位,為了控制總共128* 8* 8個bit,總共有三種尋址模式。(即尋找相應的位址來控制相應位)

具體尋址模式可以自己設計代碼,但下面三種比較通用

頁尋址模式

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

該模式下,顯示RAM讀/寫後,列位址指針自動加一(每一列8位),當列位址指針到達列結束位址,自動重置為列開始位址,頁位址指針不變。需要設定新的頁和列位址才能去到下一頁。

水準尋址模式

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

該模式下,顯示RAM讀/寫後,列位址指針自動加一(每一列8位),當列位址指針到達列結束位址,列位址指針重置為列開始位址,頁位址指針增加。當頁位址與列位址指針都到達結束位址,指針重置為列起始位址與頁起始位址。

垂直尋址模式

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

該模式下,顯示RAM讀/寫後,頁位址指針自動加一,當頁位址指針到達頁結束位址,頁位址指針重置為頁開始位址,列位址指針增加。當頁位址與列位址指針都到達結束位址,指針重置為列起始位址與頁起始位址。

代碼相關

1.開啟OLED顯示

void OLED_DisPlay_On(void)
{
 OLED_WR_Byte(0x8D,OLED_CMD);//電荷泵使能
 OLED_WR_Byte(0x14,OLED_CMD);//開啟電荷泵
 OLED_WR_Byte(0xAF,OLED_CMD);//點亮螢幕
}

           

2.關閉OLED顯示

void OLED_DisPlay_Off(void)
{
 OLED_WR_Byte(0x8D,OLED_CMD);//電荷泵使能
 OLED_WR_Byte(0x10,OLED_CMD);//關閉電荷泵
 OLED_WR_Byte(0xAE,OLED_CMD);//關閉螢幕
}
           

3.畫點

void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
 u8 i,m,n;
 i=y/8;//确定頁
 m=y%8;//确定行
 n=1<<m;//計算點在頁的位置
 if(t){OLED_GRAM[x][i]|=n;}
 else
 {
  OLED_GRAM[x][i]=~OLED_GRAM[x][i];
 }
}

           

4.更新記憶體

void OLED_Refresh(void)
{
 u8 i,n;
 for(i=0;i<8;i++)
 {
  OLED_WR_Byte(0xb0+i,OLED_CMD); //設定行起始位址
  OLED_WR_Byte(0x00,OLED_CMD);   //設定低列起始位址
  OLED_WR_Byte(0x10,OLED_CMD);   //設定高列起始位址
  I2C_Start();
  Send_Byte(0x78);
  I2C_WaitAck();
  Send_Byte(0x40);
  I2C_WaitAck();
  for(n=0;n<128;n++)
  {
   Send_Byte(OLED_GRAM[n][i]);
   I2C_WaitAck();
  }
  I2C_Stop();
  }
           

5.顯示16*16的任意符号(通過字模擷取)

void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 mode)
{
 u8 m,temp;
 u8 x0=x,y0=y;
 u16 i,size=16*16;  //得到字型一個字元對應點陣集所占的位元組數
 for(i=0;i<size;i++)
 {

  for(m=0;m<8;m++)
  {
   if(temp&0x01)OLED_DrawPoint(x,y,mode);
   else OLED_DrawPoint(x,y,!mode);
   temp>>=1;
   y++;
  }
  x++;
  if((x-x0)==16)
  {x=x0;y0=y0+8;}
  y=y0;
 }
}

           

6.相應引腳時鐘使能及OLED的初始化

void OLED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;//初始化相應結構體
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOD, ENABLE);  //使能A端口時鐘
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    //推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(GPIOG, &GPIO_InitStructure);   //初始化GPIOG12
  GPIO_SetBits(GPIOG,GPIO_Pin_12);//初始化IO口PG12,後為SCL
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    //推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure);   //初始化GPIOD5
  GPIO_SetBits(GPIOD,GPIO_Pin_5);//初始化IO口PD5,後為SDA
 
  delay_ms(200);

  OLED_WR_Byte(0xAE,OLED_CMD);//顯示關閉 0xAF是開啟  0xAE是關閉
  OLED_WR_Byte(0x00,OLED_CMD);//設定低列位址
  OLED_WR_Byte(0x10,OLED_CMD);//設定高列位址
  OLED_WR_Byte(0x40,OLED_CMD);//設定起始行位址(0x00~0x3F)
  
  OLED_WR_Byte(0x81,OLED_CMD);//對比度設定指令
  OLED_WR_Byte(0xCF,OLED_CMD);// 設定輸出電流亮度
 
  OLED_WR_Byte(0xA1,OLED_CMD);//設定分段/列映射,IIC需要設定為0xA1
  OLED_WR_Byte(0xC8,OLED_CMD);//設定COM掃描方向   0xc0上下反置,COM0到COM N-1 左到右 0xc8正常 COM N-1到COM0  右到左
  OLED_WR_Byte(0xA6,OLED_CMD);//設定顯示方式為正常顯示
  
  OLED_WR_Byte(0xA8,OLED_CMD);//設定分辨率(1 to 64)
  OLED_WR_Byte(0x3f,OLED_CMD);//分辨率為128*64:0x3f
 
  OLED_WR_Byte(0xD3,OLED_CMD);//設定顯示偏移
  OLED_WR_Byte(0x00,OLED_CMD);//預設值00 無偏移
 
  OLED_WR_Byte(0xd5,OLED_CMD);//設定顯示時鐘分頻/振蕩器頻率
  OLED_WR_Byte(0x80,OLED_CMD);//将時鐘設定為100幀/秒 
 
  OLED_WR_Byte(0xD9,OLED_CMD);//設定預充電時期
  OLED_WR_Byte(0xF1,OLED_CMD);//預充電設為15時鐘,放電設為1時鐘 
 
  OLED_WR_Byte(0xDA,OLED_CMD);//-設定COM硬體引腳配置,适應分辨率
  OLED_WR_Byte(0x12,OLED_CMD);
  
  OLED_WR_Byte(0xDB,OLED_CMD);//設定VCOMH
  OLED_WR_Byte(0x40,OLED_CMD);//設定VCOM取消選擇級别 
  
  OLED_WR_Byte(0x20,OLED_CMD);//頁面尋址模式(0x00/0x01/0x02)
  OLED_WR_Byte(0x02,OLED_CMD);//頁尋址
 
  OLED_WR_Byte(0x8D,OLED_CMD);//充電泵設定可用或者不可用
  OLED_WR_Byte(0x14,OLED_CMD);//可用
  
  OLED_WR_Byte(0xA4,OLED_CMD);//0xa4,輸出遵循RAM内容    0xa5,輸出忽略RAM内容
  OLED_WR_Byte(0xA6,OLED_CMD);//設定顯示方式,正常顯示:0xA6,反相顯示:0xA7 
  
  OLED_Clear();
  OLED_WR_Byte(0xAF,OLED_CMD);//設定完畢,顯示開啟
}

           

附:取模工具

取模工具

使用工具:PCtoLCD2002

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具

配置

STM32學習筆記(12)OLED(IIC接口)(改)簡介硬體相關操作相關代碼相關附:取模工具