找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6586|回复: 20
收起左侧

为什么我的51单片机+oled不显示?求帮助

[复制链接]
ID:761375 发表于 2020-7-13 18:38 | 显示全部楼层 |阅读模式
IMG_20200713_183809.jpg

是哪里出问题了嘛
#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit SCL = P2^0;
sbit SDA = P2^1;

u8  dis_tab[] =
{0x00,0xE0,0x10,0x08,0x08,
0x10,0xE0,0x00,0x00,0x0F,
0x10,0x20,0x20,0x10,0x0F,0x00};/*"0",0*/

void delay(u16 num)
{
        u16 x,y;
        for(x = num;x > 0;x--)
        for(y = 110;y > 0;y--);
}

void delay5us()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

void iic_start()
{
        SCL = 1;
        _nop_();
        SDA = 1;
        delay5us();
        SDA = 0;
        delay5us();
}

void iic_stop()
{
        SDA = 0;
        _nop_();
        SCL = 1;
        delay5us();
        SDA = 1;
        delay5us();
}

bit iic_ack()
{
        SCL = 1;
        delay5us();
        if(SDA)                   //SDA为高:非应答
        {
                SCL = 0;
                _nop_();
                iic_stop();
                return 0;
        }
        else                   //SDA为低:应答
        {
                SCL = 0;
                _nop_();
                return 1;
        }
}

void iic_send_1byte(u8 byte)
{
        u8 i;
        for(i = 0;i < 8;i++)
        {
                SCL = 0;
                _nop_();
                if(byte & 0x80)
                {
                        SDA = 1;
                        _nop_();
                }
                else
                {
                        SDA = 0;
                        _nop_();
                }
                SCL = 1;
                _nop_();
                byte <<= 1;
        }
        SCL = 0;
        _nop_();
        SDA = 1;
        _nop_();
}

/************
/*lcd写命令
************/
void LCD12864_write_command(u8 cmd)
{
        iic_start();
        iic_send_1byte(0x78);
        if(!iic_ack())
        {
                iic_stop();
                return 0;
        }
        iic_send_1byte(0x00);
                if(!iic_ack())
        {
                iic_stop();
                return 0;
        }
        iic_send_1byte(cmd);
        iic_send_1byte(0x00);
        if(!iic_ack())
        {
                iic_stop();
                return 0;
        }
        _nop_();
        iic_stop();
}

/**********
/*lcd写数据
**********/
void LCD12864_write_data(u8 *dat)
{
        iic_start();
        iic_send_1byte(0x78);
        if(!iic_ack())
        {
                iic_stop();
                return 0;
        }
        iic_send_1byte(0x40);
           if(!iic_ack())
        {
                iic_stop();
                return 0;
        }
        iic_send_1byte(*dat);
        if(!iic_ack())
        {
                iic_stop();
                return 0;
        }
        iic_stop();
        _nop_();
}

/**********
/*寻址
**********/
void LCD12864_position(u8 i,u8 j)
{
        LCD12864_write_command(0xb0 + i);
        LCD12864_write_command(0x00 | (j >> 4));
        LCD12864_write_command(0x10 | (j & 0x0f));
}

/**********
/*初始化
**********/
void LCD12864_Initial()
{
        Delay(3);

        LCD12864_write_command(0x8d);
        LCD12864_write_command(0x14);
        LCD12864_write_command(0xaf);
        LCD12864_write_command(0xae);
        LCD12864_write_command(0x20);
        LCD12864_write_command(0x10);
        LCD12864_write_command(0xb0);
        LCD12864_write_command(0xc8);
        LCD12864_write_command(0x00);
        LCD12864_write_command(0x10);
        LCD12864_write_command(0x40);
        LCD12864_write_command(0x81);
        LCD12864_write_command(0xff);
        LCD12864_write_command(0xa1);
        LCD12864_write_command(0xa6);
        LCD12864_write_command(0xa8);
        LCD12864_write_command(0x3f);
        LCD12864_write_command(0xa4);
        LCD12864_write_command(0xd3);
        LCD12864_write_command(0x00);
        LCD12864_write_command(0xd5);
        LCD12864_write_command(0xf0);
        LCD12864_write_command(0xd9);
        LCD12864_write_command(0x22);
        LCD12864_write_command(0xda);
        LCD12864_write_command(0x12);
        LCD12864_write_command(0xdb);
        LCD12864_write_command(0x20);
        LCD12864_write_command(0x8d);
        LCD12864_write_command(0x14);
        LCD12864_write_command(0xaf);

}

/***********
/*lcd连续显示
***********/
void LCD12864_more_show(u8 *dat)
{
        u8 i,j;
        for(i = 0;i < 8;i++)
        {
                for(j = 0;j < 128;j++)
                {
                        LCD12864_position(i.j);
                        LCD12864_write_data(*dat++);
                }
        }
}

void main()
{
        LCD12864_Initial();
        LCD12864_position();
        while(1)
        {
                LCD12864_more_show(dis_tab);        
        }
}


回复

使用道具 举报

ID:789121 发表于 2020-7-13 23:14 | 显示全部楼层
背光没亮吧,电源是不是接错了,只接电源试一下
回复

使用道具 举报

ID:738987 发表于 2020-7-13 23:33 | 显示全部楼层
电源问题
回复

使用道具 举报

ID:761375 发表于 2020-7-14 09:37 | 显示全部楼层
不要黑 发表于 2020-7-13 23:14
背光没亮吧,电源是不是接错了,只接电源试一下

哪里出问题了嘛??我感觉我连的没问题啊
IMG_20200714_093448.jpg
回复

使用道具 举报

ID:761375 发表于 2020-7-14 10:55 | 显示全部楼层
不要黑 发表于 2020-7-13 23:14
背光没亮吧,电源是不是接错了,只接电源试一下

请问该怎么解决啊???我重新接了下还是不显示也没有背光
回复

使用道具 举报

ID:789121 发表于 2020-7-14 13:46 | 显示全部楼层
wtryb 发表于 2020-7-14 10:55
请问该怎么解决啊???我重新接了下还是不显示也没有背光

有没有万用表,测一下两个引脚电压有没有问题,如果电压和接线都没问题考虑换一个屏
回复

使用道具 举报

ID:606956 发表于 2020-7-14 14:30 | 显示全部楼层
先查一下电压是不是正常,再搞个逻辑分析仪看下数据对不对
回复

使用道具 举报

ID:606956 发表于 2020-7-14 14:30 | 显示全部楼层
IIC有没有接上拉啊
回复

使用道具 举报

ID:761375 发表于 2020-7-14 20:31 | 显示全部楼层
不要黑 发表于 2020-7-14 13:46
有没有万用表,测一下两个引脚电压有没有问题,如果电压和接线都没问题考虑换一个屏

没有万用表啊我用的是单片机的DC电源模块,请问还有什么方法嘛?我的代码有什么问题嘛?
回复

使用道具 举报

ID:282850 发表于 2020-7-15 10:16 | 显示全部楼层
沙发回答是乱说的。OLED啊,要看清。
我的一个帖子里有IIC的程序及问题。注意硬件连线,特别是RST
回复

使用道具 举报

ID:761375 发表于 2020-7-15 10:19 | 显示全部楼层
f556 发表于 2020-7-15 10:16
沙发回答是乱说的。OLED啊,要看清。
我的一个帖子里有IIC的程序及问题。注意硬件连线,特别是RST

我这个是四脚的oled貌似没有RST这个脚
回复

使用道具 举报

ID:789121 发表于 2020-7-15 16:34 | 显示全部楼层
wtryb 发表于 2020-7-14 20:31
没有万用表啊我用的是单片机的DC电源模块,请问还有什么方法嘛?我的代码有什么问题嘛?

void LCD12864_write_data(u8 *dat)这个函数里为什么有return 0;能编译通过么
回复

使用道具 举报

ID:789121 发表于 2020-7-15 16:45 | 显示全部楼层
wtryb 发表于 2020-7-14 10:55
请问该怎么解决啊???我重新接了下还是不显示也没有背光

程序还有一些其他小问题,编译都会提示的,IIC程序参考屏幕卖家给的程序,
IIC程序可以优化一下
回复

使用道具 举报

ID:282850 发表于 2020-7-15 16:56 | 显示全部楼层
wtryb 发表于 2020-7-15 10:19
我这个是四脚的oled貌似没有RST这个脚

我没看仔细,模块化的是不用关注RST。
程序执行中SCL=1 后停止,用电压表看SCL是否高电平,SCL=0后看是否低电平。SDA同理。所有clear不执行,init完后停止几秒,看有没有杂乱的点显示。
回复

使用道具 举报

ID:789121 发表于 2020-7-21 13:41 | 显示全部楼层
wtryb 发表于 2020-7-14 10:55
请问该怎么解决啊???我重新接了下还是不显示也没有背光

oled确实没有背光,开始以为是普通led,问题解决没有?
回复

使用道具 举报

ID:676437 发表于 2020-7-27 17:48 来自手机 | 显示全部楼层
楼主搞好了嘛 我和你一样,有解决办法嘛
回复

使用道具 举报

ID:761375 发表于 2020-9-22 16:31 | 显示全部楼层
6998 发表于 2020-7-27 17:48
楼主搞好了嘛 我和你一样,有解决办法嘛

http://www.51hei.com/bbs/dpj-113388-1.html 参照这个
回复

使用道具 举报

ID:811284 发表于 2020-9-22 16:42 | 显示全部楼层
可以用串口显示数据比如6666,一行一行的网下放,模拟断点调试,可以验证是否是程序问题
回复

使用道具 举报

ID:294296 发表于 2020-9-22 17:51 | 显示全部楼层
连接开发板可能数据脚和板上其它器件芯片冲突了
回复

使用道具 举报

ID:342822 发表于 2020-9-22 18:44 | 显示全部楼层
换个其他成功的程序验证i2c  oled
回复

使用道具 举报

ID:342822 发表于 2020-9-22 18:49 | 显示全部楼层
程序有问题慢慢找吧~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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