一、OLED显示屏
STC15W408AS单片机并没有提供IIC总线的接口,但是我们可以通过模拟IIC的方式实现。关于IIC总线的只是大家可以自行上网搜索。这里以驱动SSD1306芯片的0.96寸的128*64的OLED显示屏为例。
二、SSD1306芯片的IIC时序图
这里我们需要看清楚START信号和STOP信号。关于时间,芯片的数据手册也有说明。
IIC数据传输格式
这个是芯片的数据传输格式。
手册中的这句话和上图右下角的,也说明了芯片的器件地址是0x78或者0x79。至于我们用的OLED液晶是哪一个,需要我们用这两个地址测试,我没找到哪个手册有说明,具体是哪一个。
关于芯片的寄存器,手册上面有很多,这里不做说明,自己查阅手册即可。
三、测试程序
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 // 数据
// 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 应答信号
void IIC_Wait_Ack()
{
IIC_SCL = 1 ;
IIC_SCL = 0;
}
// IIC 写一字节数据
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 // 写数据
#define OLED_MODE 0 // 显示模式
//OLED模式设置
//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控制用函数
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