标题: oled清屏不起效果,附单片机程序 [打印本页]

作者: 单片机55818    时间: 2021-3-8 23:16
标题: oled清屏不起效果,附单片机程序
#include <reg52.h>
#define OLED_CMD  0        //写命令
#define OLED_DATA 1        //写数据
#define OLED_MODE

sbit  IIC_CLK = P4^3;
sbit  IIC_DATA = P4^0;

void OLED_Clear (void);
        void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_WR_Byte(unsigned char dat, unsigned char cmd);
void OLED_WritrDate(unsigned char dat);
void OLED_WriteCommand(unsigned char dat);
void IIC_Start(void);
void IIC_Stop(void);
unsigned char IIC_Wait_Ack(void);
void Write_IIC_Byte(unsigned char IIC_Byte);

void main (void)
{
        while(1)
        {
                OLED_Clear ();
        }
}

void OLED_Clear (void)
{
        unsigned char i, n;
        for (i = 0; i <8; i++)
        {
                OLED_Set_Pos(0, i);
                for (n =0; n<128; n++)OLED_WR_Byte(0x00, OLED_DATA);
        }
}
void OLED_Set_Pos(unsigned char x, unsigned char y)
{         
        OLED_WR_Byte(0xb0+y,OLED_CMD);
        OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//高地址
        OLED_WR_Byte((x&0x0f),OLED_CMD); //低地址
}
void OLED_WR_Byte(unsigned char dat, unsigned char cmd)
{
        
        if (cmd == OLED_DATA)
                OLED_WritrDate(dat);
        else
                OLED_WriteCommand(dat);
}
void OLED_WritrDate(unsigned char dat)
{
        IIC_Start();
        Write_IIC_Byte (0x78);
        IIC_Wait_Ack();
        Write_IIC_Byte(0x40);//数字寄存器
        IIC_Wait_Ack();
        Write_IIC_Byte(dat);
        IIC_Wait_Ack();
  IIC_Stop();
}
void OLED_WriteCommand(unsigned char dat)
{
        IIC_Start();
        Write_IIC_Byte (0x78);
        IIC_Wait_Ack();
        Write_IIC_Byte(0x00);//命令寄存器
        IIC_Wait_Ack();
        Write_IIC_Byte(dat);
        IIC_Wait_Ack();
  IIC_Stop();

}
void IIC_Start(void)
{
        IIC_CLK = 1;
        IIC_DATA = 1;
        //delay();
        IIC_DATA = 0;
        //delay();
        IIC_CLK = 0;
        //delay();
}
void IIC_Stop(void)
{
        IIC_DATA = 0;
        //delay();
        IIC_CLK = 1;
        //delay();
        IIC_DATA = 0;
        //delay();
        
}
unsigned char IIC_Wait_Ack(void)
{
        unsigned char ucErrTime=0;
        
        IIC_DATA=1; //准备、待拉低
        //_nop_();_nop_();
        IIC_CLK=1;  
        //_nop_();_nop_();
        
        while(IIC_DATA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        //SendString("ERORR\n");
                        return 1;
                }
        }
        
        IIC_CLK=0;
        //delay();
        return 0;
        
        
        
}

void Write_IIC_Byte(unsigned char IIC_Byte)
{
        unsigned char i;
        unsigned char m,da;
        da=IIC_Byte;
        //IIC_CLK = 0;
        for(i=0;i<8;i++)               
        {
                //delay();
                m=da&0x80;
                if(m==0x80)   
                {
                        IIC_DATA = 1;
                }
                else IIC_DATA = 0;
                        da=da<<1;                //移往下一位
                //delay();               
                IIC_CLK = 1; //开始传输
                //delay();
                IIC_CLK = 0; //传输完毕
        }

}


作者: hhdsdy    时间: 2021-3-9 00:03
是什么情况也要说一下啊,当我们是神仙什么都知道啊?
作者: wwh2382    时间: 2021-3-9 08:19
和不同厂家不同驱动有很大关系
作者: zyczyczyc    时间: 2021-3-9 08:53
有些oled,需要refresh一下,刷新缓存,才能显示
作者: 心有浮生    时间: 2021-3-9 13:26
不知道你的有没有片选信号,看程序应该没啥问题,你查一下iic是不是时序不对之类的。清屏最好不要放while(1)里面,不停的刷屏幕也可能有问题。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1