找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2582|回复: 4
打印 上一主题 下一主题
收起左侧

oled清屏不起效果,附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:880458 发表于 2021-3-8 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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; //传输完毕
        }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:88256 发表于 2021-3-9 00:03 | 只看该作者
是什么情况也要说一下啊,当我们是神仙什么都知道啊?
回复

使用道具 举报

板凳
ID:748788 发表于 2021-3-9 08:19 | 只看该作者
和不同厂家不同驱动有很大关系
回复

使用道具 举报

地板
ID:258995 发表于 2021-3-9 08:53 | 只看该作者
有些oled,需要refresh一下,刷新缓存,才能显示
回复

使用道具 举报

5#
ID:654028 发表于 2021-3-9 13:26 | 只看该作者
不知道你的有没有片选信号,看程序应该没啥问题,你查一下iic是不是时序不对之类的。清屏最好不要放while(1)里面,不停的刷屏幕也可能有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表