在软件IIC测试128*96 像素的OLED(SSD1315) 后,决定用硬件IIC驱动,看是否能成功。
于是参考网上大师的例程,几经调试,终于能正常显示:

主代码如下:
SSD1315.h
ifndef SSD1315_H
define SSD1315_H
void OLED_Init();//OLED初始化
void ClearAll();//清屏
void Show_Font6x8_char(u8 page,u8 col,u8 chr);//显示68单个字符
void Show_Font6x8_str(u8 page,u8 col,u8 str);//显示68字符串
void Show_Font8x16_char(u8 page,u8 col,u8 chr);//显示816单个字符
void Show_Font8x16_str(u8 page,u8 col,u8 str);//显示816字符串
void Show_Font16x16_char(u8 page,u8 col,u8 chr);//显示1616单个字符
void Show_Font16x16_str(u8 page,u8 col,u8 str);//显示1616字符串
void IIC_Init(); //IIC初始化
endif
SSD1315.c
include "stc.h"
include "delay.h"
//#include "config.h"
include "SSD1315.h"
include "ASC6X8.h"
include "ASC8X16.h"
include "CH16X16.h"
const unsigned int CH_NUM=(sizeof GB_16)/34;//计算字库字数
void IIC_Init() //IIC初始化
{
I2C_S1 =0; //I2C功能脚选择,00:P1.5,P1.4; 01:P2.5,P2.4; 11:P3.2,P3.3
I2C_S0 =1;
I2CCFG = 0XE0;
I2CMSST = 0;
}
void I2C_Wait()
{
while (!(I2CMSST & 0x40));
I2CMSST &= (~0x40);
}
void I2C_Start()
{
I2CMSCR = 0x01;
I2C_Wait();
}
void I2C_Stop()
{
I2CMSCR = 0x06;
I2C_Wait();
}
void I2C_Ack()
{
I2CMSCR = 0x03;
I2C_Wait();
}
void I2C_Send(u8 mcmd)
{
I2CTXD = mcmd;
I2CMSCR = 0x02;
I2C_Wait();
}
void Write_Command(u8 Data)//写命令
{
I2C_Start();
I2C_Send(0x78);
I2C_Ack();//
I2C_Send(0x00);
I2C_Ack();
I2C_Send(Data);
I2C_Ack();
I2C_Stop();
}
void Write_Data(u8 Data)//写数据
{
I2C_Start();
I2C_Send(0x78);
I2C_Ack();//
I2C_Send(0x40);
I2C_Ack();
I2C_Send(Data);
I2C_Ack();
I2C_Stop();
}
void OLED_Init()//OLED初始化
{
Write_Command(0xae); //--turn off oled panel
Write_Command(0x00); //--set low column address
Write_Command(0x10); //--set high column address
Write_Command(0x40); //--set start line address
Write_Command(0xb0); //--set page address
Write_Command(0x81); //--set contrast control register
Write_Command(0xff);
Write_Command(0xa1); //--set segment re-map 127 to 0 a0:0 to seg127
Write_Command(0xa6); //--set normal display
Write_Command(0xc9); //--set com(N-1)to com0 c0:com0 to com(N-1)
Write_Command(0xa8); //--set multiples ratio(1to64)
Write_Command(0x3f); //--1/64 duty
Write_Command(0xd3); //--set display offset
Write_Command(0x00); //--not offset
Write_Command(0xd5); //--set display clock divide ratio/oscillator frequency
Write_Command(0x80); //--set divide ratio
Write_Command(0xd9); //--set pre-charge period
Write_Command(0xf1);
Write_Command(0xda); //--set com pins hardware configuration
Write_Command(0x12);
Write_Command(0xdb); //--set vcomh
Write_Command(0x40);
Write_Command(0x8d); //--set chare pump enable/disable
Write_Command(0x14); //--set(0x10) disable
//Write_Command(0x10); //--set(0x10) disable
Write_Command(0xaf); //--turn on oled panel
}
void ClearAll()
{
u8 i,j;
for(i=0;i<8;i++)
{
Write_Command(0x22);
Write_Command(i);
Write_Command(0x07);
for(j=0;j<128;j++)
{
Write_Data(0x00);
}
}
}
void set_pos(u8 page,u8 col)
{
Write_Command(0x22);
Write_Command(page);
Write_Command(0x07);
Write_Command(0x21);
Write_Command(col);
Write_Command(127);
}
void Show_pic(u8 page,u8 col,u8 len,u8 dat)
{
u8 j;
set_pos(page,col);
for(j=0;j<len;j++)
Write_Data(dat++);
}
void Show_Font6x8_char(u8 page,u8 col,u8 chr)//显示68单个字符
{
Show_pic(page,col,6,&Font6x8[(chr-32)6]);
}
void Show_Font6x8_str(u8 page,u8 col,u8 str)//显示68字符串
{
while(str!='\0')
{
Show_Font6x8_char(page,col,str++);
col+=8;
}
}
void Show_Font8x16_char(u8 page,u8 col,u8 chr)//显示816单个字符
{
Show_pic(page,col,8,&Font8x16[(chr-32)16]);
Show_pic(page+1,col,8,&Font8x16[(chr-32)*16+8]);
}
void Show_Font8x16_str(u8 page,u8 col,u8 str)//显示816字符串
{
while(str!='\0')
{
Show_Font8x16_char(page,col,str++);
col+=8;
}
}
void Show_Font16x16_char(u8 page,u8 col,u8 chr)//显示1616单个字符
{
u8 i;
for(i=0;i<=CH_NUM;i++)
{
if((GB_16[i].Index[0]*chr)&&(GB_16[i].Index[1]*(chr+1)))
{
Show_pic(page,col,16,&GB_16[i].Msk);
Show_pic(page+1,col,16,&(GB_16[i].Msk+16));
}
}
}
void Show_Font16x16_str(u8 page,u8 col,u8 str)//显示1616字符串
{
while(str!='\0')
{
Show_Font16x16_char(page,col,str);//显示1616单个字符
col +=16;
str +=2;
}
}
2026.8.1

欢迎关注本人公众号,了解更多。
