zfgansuchina 发表于 2026-3-6 07:36:42

试图用AI8051U的硬件IIC驱动0.91寸OLED

试图用AI8051U的硬件IIC驱动0.91寸OLED,折腾了一周都没成功,怎么都点不亮!有哪位成功的,交流一下。
软件方式是非常成功的。

神农鼎 发表于 2026-3-6 10:43:04



https://www.stcaimcu.com/thread-18574-1-1.html

狂热主宰 发表于 2026-3-6 10:50:47

通常无高速要求
硬件可能有专利问题
软件方式方便移植受欢迎

DebugLab 发表于 2026-3-6 13:51:20

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);
}

zfgansuchina 发表于 2026-3-6 15:38:23

DebugLab 发表于 2026-3-6 13:51
SSD1316

非常感谢!

zfgansuchina 发表于 2026-3-6 15:39:06

神农鼎 发表于 2026-3-6 10:43
https://www.stcaimcu.com/thread-18574-1-1.html

非常感谢!{:baoquan:}
页: [1]
查看完整版本: 试图用AI8051U的硬件IIC驱动0.91寸OLED