打印
[其他ST产品]

自己改的是stm32驱动oled代码,就是点不亮屏幕

[复制链接]
1050|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
发GV第几啊|  楼主 | 2023-11-30 23:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己改的是stm32驱动oled代码,就是点不亮屏幕,怀疑是时序问题,有哪位帮我看看不,感激不尽oled.c
#include "oled.h"
#include "stdlib.h"
#include "oledfont.h"      
#include "delay.h"
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127   
//[1]0 1 2 3 ... 127   
//[2]0 1 2 3 ... 127   
//[3]0 1 2 3 ... 127   
//[4]0 1 2 3 ... 127   
//[5]0 1 2 3 ... 127   
//[6]0 1 2 3 ... 127   
//[7]0 1 2 3 ... 127               
/**********************************************
//IIC Start
**********************************************/
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
    OLED_SCLK_Set() ;
    OLED_SDIN_Set();
    OLED_SDIN_Clr();
    OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
    OLED_SCLK_Set() ;
//    OLED_SCLK_Clr();
    OLED_SDIN_Clr();
    OLED_SDIN_Set();
   
}

void IIC_Wait_Ack()
{
    //GPIOB->CRH &= 0XFFF0FFFF;    //设置PB12为上拉输入模式
    //GPIOB->CRH |= 0x00080000;
//    OLED_SDA = 1;
//    delay_us(1);
    //OLED_SCL = 1;
    //delay_us(50000);
/*    while(1)
    {
        if(!OLED_SDA)                //判断是否接收到OLED 应答信号
        {
            //GPIOB->CRH &= 0XFFF0FFFF;    //设置PB12为通用推免输出模式
            //GPIOB->CRH |= 0x00030000;
            return;
        }
    }
*/
    OLED_SCLK_Set() ;
    OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
    unsigned char i;
    unsigned char m,da;
    da=IIC_Byte;
//    OLED_SCLK_Clr();
    for(i=0;i<8;i++)        
    {
        m=da;
        OLED_SCLK_Clr();
        m=m&0x80;
        if(m==0x80)
        {OLED_SDIN_Set();}
        else OLED_SDIN_Clr();
        OLED_SCLK_Set();
        OLED_SCLK_Clr();
        da=da<<1;
    }
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
    IIC_Start();
    Write_IIC_Byte(0x78);            //Slave address,SA0=0
    IIC_Wait_Ack();   
    Write_IIC_Byte(0x00);            //write command
    IIC_Wait_Ack();   
    Write_IIC_Byte(IIC_Command);
    IIC_Wait_Ack();   
    IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
    IIC_Start();
    Write_IIC_Byte(0x78);            //D/C#=0; R/W#=0
    IIC_Wait_Ack();   
    Write_IIC_Byte(0x40);            //write data
    IIC_Wait_Ack();   
    Write_IIC_Byte(IIC_Data);
    IIC_Wait_Ack();   
    IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
    if(cmd)
    {
        Write_IIC_Data(dat);
    }
    else
    {
        Write_IIC_Command(dat);
    }
}


/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
    unsigned char m,n;
    for(m=0;m<8;m++)
    {
        OLED_WR_Byte(0xb0+m,0);        //page0-page1
        OLED_WR_Byte(0x00,0);        //low column start address
        OLED_WR_Byte(0x10,0);        //high column start address
        for(n=0;n<128;n++)
        {
            OLED_WR_Byte(fill_Data,1);
        }
    }
}


/***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms)
{
    unsigned int m;
    for(;Del_50ms>0;Del_50ms--)
        for(m=6245;m>0;m--);
}

void Delay_1ms(unsigned int Del_1ms)
{
    unsigned char j;
    while(Del_1ms--)
    {   
        for(j=0;j<123;j++);
    }
}

//坐标设置
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);
}         
//开启OLED显示   
void OLED_Display_On(void)
{
    OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
    OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
    OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//关闭OLED显示     
void OLED_Display_Off(void)
{
    OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
    OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
    OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}                        
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!      


//void OLED_Refresh(void)
//{
//    u8 i,n;
//    for(i=0;i<8;i++)
//    {
//       OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
//       OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
//       OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
//       for(n=0;n<128;n++)
//         OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
//  }
//}

void OLED_Clear(void)  
{  
    u8 i,n;            
    for(i=0;i<8;i++)  
    {  
        OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
        OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
        OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
        for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
    } //更新显示
}
void OLED_On(void)  
{  
    u8 i,n;            
    for(i=0;i<8;i++)  
    {  
        OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
        OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
        OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
        for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
    } //更新显示
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示                 
//size:选择字体 16/12
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{         
    unsigned char c=0,i=0;   
    c=chr-' ';//得到偏移后的值            
    if(x>Max_Column-1){x=0;y=y+2;}
    if(Char_Size ==16)
    {
        OLED_Set_Pos(x,y);   
        for(i=0;i<8;i++)
        OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
        OLED_Set_Pos(x,y+1);
        for(i=0;i<8;i++)
        OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
    }
    else
    {   
        OLED_Set_Pos(x,y);
        for(i=0;i<6;i++)
        OLED_WR_Byte(F6x8[c][i],OLED_DATA);   
    }
}
//m^n函数
u32 oled_pow(u8 m,u8 n)
{
    u32 result=1;     
    while(n--)result*=m;   
    return result;
}                  
//显示2个数字
//x,y :起点坐标     
//len :数字的位数
//size:字体大小
//mode:模式    0,填充模式;1,叠加模式
//num:数值(0~4294967295);               
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{            
    u8 t,temp;
    u8 enshow=0;                           
    for(t=0;t<len;t++)
    {
        temp=(num/oled_pow(10,len-t-1))%10;
        if(enshow==0&&t<(len-1))
        {
            if(temp==0)
            {
                OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
                continue;
            }
            else enshow=1;
              
        }
         OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
    }
}
//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
    unsigned char j=0;
    while (chr[j]!='\0')
    {        
        OLED_ShowChar(x,y,chr[j],Char_Size);
        x+=8;
        if(x>120){x=0;y+=2;}
        j++;
    }
}
//显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{                     
    u8 t,adder=0;
    OLED_Set_Pos(x,y);   
    for(t=0;t<16;t++)
    {
        OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
        adder+=1;
    }   
    OLED_Set_Pos(x,y+1);   
    for(t=0;t<16;t++)
    {   
        OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
        adder+=1;
    }                    
}
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{     
    unsigned int j=0;
    unsigned char x,y;

    if(y1%8==0) y=y1/8;      
    else y=y1/8+1;
    for(y=y0;y<y1;y++)
    {
        OLED_Set_Pos(x0,y);
        for(x=x0;x<x1;x++)
        {      
            OLED_WR_Byte(BMP[j++],OLED_DATA);            
        }
    }
}

//初始化SSD1306                        
void OLED_Init(void)
{     
    GPIO_InitTypeDef  GPIO_InitStructure;
   
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);     //使能A端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;     
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
     GPIO_Init(GPIOC, &GPIO_InitStructure);      //初始化GPIOD3,6
     GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_6);   
   

   
   
    OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
    OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
    OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
    OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
    OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
    OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
    OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
    OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
    OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
    OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
    OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
    OLED_WR_Byte(0x00,OLED_CMD);//-not offset
    OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
    OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
    OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
    OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
    OLED_WR_Byte(0x12,OLED_CMD);
    OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
    OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
    OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
    OLED_WR_Byte(0x02,OLED_CMD);//
    OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
    OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
    OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
    OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
    OLED_WR_Byte(0xAF,OLED_CMD);
    OLED_Clear();
   
   
}





使用特权

评论回复
沙发
maudlu| | 2023-12-5 10:54 | 只看该作者
所有的GPIO引脚都正确连接到OLED屏幕的控制引脚上,特别是电源引脚和数据引脚。

使用特权

评论回复
板凳
jackcat| | 2023-12-5 12:10 | 只看该作者
在程序开始时,对OLED模块进行了正确的初始化,包括设置通信协议、时钟速度、数据传输格式等。

使用特权

评论回复
地板
abotomson| | 2023-12-5 15:27 | 只看该作者
是否存在硬件故障,如电源线路是否正常、屏幕是否烧毁等

使用特权

评论回复
5
nomomy| | 2023-12-5 15:50 | 只看该作者
需要检查的内容包括:SPI或I2C的配置是否正确、寄存器的设置是否正确、数据的发送是否正确等。

使用特权

评论回复
6
sdCAD| | 2023-12-5 16:13 | 只看该作者
过高的刷新频率可能会导致OLED屏幕无法显示

使用特权

评论回复
7
rosemoore| | 2023-12-5 16:42 | 只看该作者
OLED屏幕本身是否正常工作              

使用特权

评论回复
8
wwppd| | 2023-12-5 17:25 | 只看该作者
可以查看OLED屏幕的数据手册              

使用特权

评论回复
9
linfelix| | 2023-12-5 19:56 | 只看该作者
SCL和SDA引脚连接正确?              

使用特权

评论回复
10
pixhw| | 2023-12-5 20:33 | 只看该作者
STM32板子的时钟设置正确              

使用特权

评论回复
11
caigang13| | 2023-12-6 10:28 | 只看该作者
看过OLED屏幕的驱动时序没

使用特权

评论回复
12
jackcat| | 2023-12-6 22:53 | 只看该作者
更换一个OLED屏幕来进行测试              

使用特权

评论回复
13
minzisc| | 2023-12-9 14:57 | 只看该作者
OLED屏幕需要3.3V的电源电压

使用特权

评论回复
14
updownq| | 2023-12-9 20:15 | 只看该作者
需要注意代码的逻辑是否正确              

使用特权

评论回复
15
jkl21| | 2023-12-9 21:14 | 只看该作者
指令控制是否正确、时钟配置是否正确

使用特权

评论回复
16
iyoum| | 2023-12-10 16:50 | 只看该作者
如果驱动程序不可用或版本不匹配,可能会导致OLED屏无法正常显示。

使用特权

评论回复
17
vivilyly| | 2023-12-12 14:47 | 只看该作者
可以参考官方的示例代码              

使用特权

评论回复
18
timfordlare| | 2023-12-12 16:04 | 只看该作者
请确保您的代码中包含了适当的延时函数, 给OLED显示屏足够的时间来处理数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

276

帖子

0

粉丝