试图用AI8051U的硬件IIC驱动0.91寸OLED
试图用AI8051U的硬件IIC驱动0.91寸OLED,折腾了一周都没成功,怎么都点不亮!有哪位成功的,交流一下。软件方式是非常成功的。
https://www.stcaimcu.com/thread-18574-1-1.html
通常无高速要求
硬件可能有专利问题
软件方式方便移植受欢迎 SSD1316
#include <STC8G.H>
#include "define.h"
#include <intrins.h>
#define RXD P30
#define TXD P31
#define SCL P32
#define SDA P33
bit I2C_Busy;
unsigned char code BMP[]=
{
#include <0.h>
};
void Delay_10ms(void)
{
unsigned char i,j;
_nop_();
_nop_();
i=144;
j=157;
do
{
while(--j);
}
while(--i);
WDT_CONTR=CLR_WDT;
}
void Delay_x10ms(unsigned char x)
{
while(--x)
Delay_10ms();
}
void I2C_Start(void)
{
I2C_Busy=1;
I2CMSCR=0x81;
while(I2C_Busy);
}
void I2C_SendData(unsigned char dat)
{
I2CTXD=dat;
I2C_Busy=1;
I2CMSCR=0x82;
while(I2C_Busy);
}
void I2C_RecvACK(void)
{
I2C_Busy=1;
I2CMSCR=0x83;
while(I2C_Busy);
}
//unsigned char I2C_RecvData(void)
//{
// I2C_Busy=1;
// I2CMSCR=0x84;
// while(I2C_Busy);
// return I2CRXD;
//}
//void I2C_SendACK(void)
//{
// I2CMSST=0x00;
// I2C_Busy=1;
// I2CMSCR=0x85;
// while(I2C_Busy);
//}
//void I2C_SendNAK(void)
//{
// I2CMSST=0x01;
// I2C_Busy=1;
// I2CMSCR=0x85;
// while(I2C_Busy);
//}
void I2C_Stop(void)
{
I2C_Busy=1;
I2CMSCR=0x86;
while(I2C_Busy);
}
void SSD1316_Write_CMD(unsigned char cmd)
{
I2C_Start();
I2C_SendData(0x78);
I2C_RecvACK();
I2C_SendData(0x00);
I2C_RecvACK();
I2C_SendData(cmd);
I2C_RecvACK();
I2C_Stop();
}
void SSD1316_Write_DATA_A(void)
{
I2C_Start();
I2C_SendData(0x78);
I2C_RecvACK();
I2C_SendData(0x40);
I2C_RecvACK();
}
void SSD1316_Write_DATA_B(unsigned char dat)
{
I2C_SendData(dat);
I2C_RecvACK();
}
void SSD1316_Write_DATA_C(void)
{
I2C_Stop();
}
void SSD1316_Clear(void)
{
unsigned char i,n;
for(i=0;i<4;i++)
{
SSD1316_Write_CMD(0xb0+i); //设置页地址(0~3)
SSD1316_Write_CMD(0x00); //设置显示位置—列低地址
SSD1316_Write_CMD(0x10); //设置显示位置—列高地址
SSD1316_Write_DATA_A();
for(n=0;n<128;n++)
{
SSD1316_Write_DATA_B(0x00);
}
SSD1316_Write_DATA_C();
}
}
void SSD1316_Display_128x32(void)
{
unsigned int i;
SSD1316_Write_CMD(0x20); //Set Memory Addressing Mode(设置内存寻址模式)
SSD1316_Write_CMD(0x01); //0x01(垂直寻址模式)
SSD1316_Write_CMD(0x21); //Set Column Address(设置列地址)
SSD1316_Write_CMD(0); //(列开始地址)
SSD1316_Write_CMD(127); //(列结束地址)
SSD1316_Write_CMD(0x22); //Set Page Address(设置页地址)
SSD1316_Write_CMD(0x00); //0
SSD1316_Write_CMD(0x03); //3
SSD1316_Write_DATA_A();
for(i=0;i<512;i++)
{
SSD1316_Write_DATA_B(BMP);
}
SSD1316_Write_DATA_C();
SSD1316_Write_CMD(0x20); //Set Memory Addressing Mode(设置内存寻址模式)
SSD1316_Write_CMD(0x02); //0x02(页寻址模式)
}
void SSD1316_Init(void)
{
SSD1316_Write_CMD(0xAE); //Set Display OFF(设置显示关)
SSD1316_Write_CMD(0xA1); //Set Segment Remap(设置列重映射)
SSD1316_Write_CMD(0xA8); //Set Multiplex Ratio(设置行通道数)
SSD1316_Write_CMD(0x1F); //31
// SSD1316_Write_CMD(0xC8); //Set COM Output Scan Direction(设置行重映射)
SSD1316_Write_CMD(0xD3); //Set Display Offset(设置垂直偏移量)
SSD1316_Write_CMD(0x00); //0
SSD1316_Write_CMD(0xD5); //Set Display Clock Divide Ratio/Oscillator Frequency(设置显示时钟分频器、振荡器频率)
SSD1316_Write_CMD(0xF0); //0xF0
SSD1316_Write_CMD(0x8D); //Charge Pump Setting(设置电荷泵)
SSD1316_Write_CMD(0x14); //0x14
SSD1316_Write_CMD(0xAF); //Set Display ON(设置显示开)
SSD1316_Clear();
// SSD1316_Write_CMD(0x81); //Set Contrast Control(设置对比度)
// SSD1316_Write_CMD(0x7F); //127
// SSD1316_Write_CMD(0xA7); //Set Normal/Inverse Display(设置反相显示)
}
void Init(void)
{
P_SW2|=EAXFR;
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
P3PU=0x0c;
I2CCFG=0xC1; //921.6K@11.0592M
I2CMSCR=EMSI;
I2CMSST=0x00;
EA=1;
Delay_x10ms(10);
SSD1316_Init();
}
void main(void)
{
Init();
SSD1316_Display_128x32();
while(1)
{
SSD1316_Write_CMD(0xA6);
Delay_x10ms(50);
SSD1316_Write_CMD(0xA7);
Delay_x10ms(50);
}
}
void I2C_Isr(void) interrupt 24
{
_push_(P_SW2);
P_SW2|=EAXFR;
if(I2CMSST&MSIF)
{
I2CMSST&=~MSIF;
I2C_Busy=0;
}
_pop_(P_SW2);
} DebugLab 发表于 2026-3-6 13:51
SSD1316
非常感谢! 神农鼎 发表于 2026-3-6 10:43
https://www.stcaimcu.com/thread-18574-1-1.html
非常感谢!{:baoquan:}
页:
[1]