一、OLED顯示屏
STC15W408AS單片機并沒有提供IIC總線的接口,但是我們可以通過模擬IIC的方式實現(xiàn)。關(guān)于IIC總線的只是大家可以自行上網(wǎng)搜索。這里以驅(qū)動SSD1306芯片的0.96寸的128*64的OLED顯示屏為例。
二、SSD1306芯片的IIC時序圖
這里我們需要看清楚START信號和STOP信號。關(guān)于時間,芯片的數(shù)據(jù)手冊也有說明。
IIC數(shù)據(jù)傳輸格式
這個是芯片的數(shù)據(jù)傳輸格式。
手冊中的這句話和上圖右下角的,也說明了芯片的器件地址是0x78或者0x79。至于我們用的OLED液晶是哪一個,需要我們用這兩個地址測試,我沒找到哪個手冊有說明,具體是哪一個。
關(guān)于芯片的寄存器,手冊上面有很多,這里不做說明,自己查閱手冊即可。
三、測試程序
1.IIC.h文件
#ifndef __IIC_H_
#define __IIC_H_
#define u16 unsigned int
#define u8 unsigned char
void IIC_Start();
void IIC_Stop();
void IIC_Write_Byte(u8 byte);
void IIC_Wait_Ack();
void IIC_Write_Command(u8 cmd);
void IIC_Write_Data(u8 dat);
#endif
2.IIC.c文件
#include "stc15.h"
#include "iic.h"
#define IIC_SCL P10 // 時鐘
#define IIC_SDA P11 // 數(shù)據(jù)
// IIC 開始信號
void IIC_Start()
{
IIC_SCL = 1 ;
IIC_SDA = 1;
IIC_SDA = 0;
IIC_SCL = 0;
}
// IIC 停止信號
void IIC_Stop()
{
IIC_SCL = 1 ;
// IIC_SCL = 0;
IIC_SDA = 0;
IIC_SDA = 1;
}
// IIC 應(yīng)答信號
void IIC_Wait_Ack()
{
IIC_SCL = 1 ;
IIC_SCL = 0;
}
// IIC 寫一字節(jié)數(shù)據(jù)
void IIC_Write_Byte(u8 IIC_Byte)
{
u8 i;
u8 m,da;
da = IIC_Byte;
IIC_SCL = 0;
for(i = 0;i < 8;i++)
{
m = da;
// IIC_SCL = 0;
m = m&0x80;
if(m==0x80)
{
IIC_SDA = 1;
}
else IIC_SDA = 0;
da = da< 1;
IIC_SCL = 1;
IIC_SCL = 0;
}
}
3.OLED.h文件
#ifndef __OLED_H_
#define __OLED_H_
#define u16 unsigned int
#define u8 unsigned char
#define OLED_CMD 0 // 寫命令
#define OLED_DATA 1 // 寫數(shù)據(jù)
#define OLED_MODE 0 // 顯示模式
//OLED模式設(shè)置
//0:4線串行模式
//1:并行8080模式
#define OLED_Address 0x78
#define OLED_Cmd 0x00
#define OLED_Data 0x40
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
//OLED控制用函數(shù)
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);
void OLED_ShowNum(u8 x,u8 y,u16 num,u8 len,u8 size2);
void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);
void OLED_Set_Pos(u8 x, u8 y);
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_DrawBMP(u8 x0, u8 y0,u8 x1, u8 y1,u8 BMP[]);
void fill_picture(u8 fill_Data);
void Picture();
#endif