lao4jiadian 发表于 2024-11-10 17:44:30

OLED刷新闪烁,大家在程序中如何处理呢 | 用硬件I2C/SPI

本帖最后由 lao4jiadian 于 2024-11-11 19:30 编辑

玩OLED时发现刷新数据时屏幕眨眼睛的时间非常明显,
大家在程序中怎么处理,避免减轻屏幕闪烁的呢?

我的是4线I2C屏, P1.4 / P1.3端口模拟 I2C
---------------------------------------------------------------------------------------------------------------------------------------
找淘宝要来一份硬件I2C的例程,源程序是1.3寸屏幕的,淘宝客服表示可以用.因为我的硬件已固定.没移植测试.


DebugLab 发表于 2024-11-10 17:51:43

用硬件I2C,OLED内部时钟设置为最高频率

王昱顺 发表于 2024-11-10 18:01:50

提高iic速率,或者使用局部刷新。
或者使用全屏缓存刷新,避免使用空白数据复制进去一遍。

soma 发表于 2024-11-10 18:03:47

用什么芯片,有硬件I2C就用硬件。

神农鼎 发表于 2024-11-10 18:15:04



51 开源 电容表: 8H8K64U比较器+OLED12864-I2C 实现 - 开源示波器,频谱分析仪-FFT,PID控制,四轴飞行器,智能小车 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)



QQ624353765 发表于 2024-11-10 18:20:07

DMA+SPI高刷

lao4jiadian 发表于 2024-11-10 23:11:51

DebugLab 发表于 2024-11-10 17:51
用硬件I2C,OLED内部时钟设置为最高频率

没有找到这个屏的硬件I2C的例程,梁工的充放电式电容表例程好像也是模拟I2C

DebugLab 发表于 2024-11-10 23:29:51

lao4jiadian 发表于 2024-11-10 23:11
没有找到这个屏的硬件I2C的例程,梁工的充放电式电容表例程好像也是模拟I2C ...

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

void I2C_Isr(void) interrupt 24
{
        _push_(P_SW2);
        P_SW2|=EAXFR;
        if(I2CMSST&MSIF)
        {
                I2CMSST&=~MSIF;
                I2C_Busy=0;
        }
        _pop_(P_SW2);
}

lao4jiadian 发表于 2024-11-11 19:32:25

找淘宝要来一份硬件I2C的例程,源程序是1.3寸屏幕的,淘宝客服表示可以用.因为我的硬件已固定,所以没移植.原包发上来,分享给大家.附件在1楼
页: [1]
查看完整版本: OLED刷新闪烁,大家在程序中如何处理呢 | 用硬件I2C/SPI