控制/MCU
STC15W408AS单片机并没有提供IIC总线的接口,但是我们可以通过模拟IIC的方式实现。关于IIC总线的只是大家可以自行上网搜索。这里以驱动SSD1306芯片的0.96寸的128*64的OLED显示屏为例。
这里我们需要看清楚START信号和STOP信号。关于时间,芯片的数据手册也有说明。
IIC数据传输格式
这个是芯片的数据传输格式。
- The slave address is following the start condition for recognition use. For the SSD1306, the slave address is either “b0111100” or “b0111101” by changing the SA0 to LOW or HIGH (D/C pin acts as SA0).
手册中的这句话和上图右下角的,也说明了芯片的器件地址是0x78或者0x79。至于我们用的OLED液晶是哪一个,需要我们用这两个地址测试,我没找到哪个手册有说明,具体是哪一个。
关于芯片的寄存器,手册上面有很多,这里不做说明,自己查阅手册即可。
#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
#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;
}
}
#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