一、OLED顯示屏
STC15W408AS單片機(jī)并沒有提供IIC總線的接口,但是我們可以通過(guò)模擬IIC的方式實(shí)現(xiàn)。關(guān)于IIC總線的只是大家可以自行上網(wǎng)搜索。這里以驅(qū)動(dòng)SSD1306芯片的0.96寸的128*64的OLED顯示屏為例。
二、SSD1306芯片的IIC時(shí)序圖
這里我們需要看清楚START信號(hào)和STOP信號(hào)。關(guān)于時(shí)間,芯片的數(shù)據(jù)手冊(cè)也有說(shuō)明。
IIC數(shù)據(jù)傳輸格式
這個(gè)是芯片的數(shù)據(jù)傳輸格式。
手冊(cè)中的這句話和上圖右下角的,也說(shuō)明了芯片的器件地址是0x78或者0x79。至于我們用的OLED液晶是哪一個(gè),需要我們用這兩個(gè)地址測(cè)試,我沒找到哪個(gè)手冊(cè)有說(shuō)明,具體是哪一個(gè)。
關(guān)于芯片的寄存器,手冊(cè)上面有很多,這里不做說(shuō)明,自己查閱手冊(cè)即可。
三、測(cè)試程序
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 // 時(shí)鐘
#define IIC_SDA P11 // 數(shù)據(jù)
// IIC 開始信號(hào)
void IIC_Start()
{
IIC_SCL = 1 ;
IIC_SDA = 1;
IIC_SDA = 0;
IIC_SCL = 0;
}
// IIC 停止信號(hào)
void IIC_Stop()
{
IIC_SCL = 1 ;
// IIC_SCL = 0;
IIC_SDA = 0;
IIC_SDA = 1;
}
// IIC 應(yīng)答信號(hào)
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