新人求助~~模拟IIC 0.96寸oled无法显示

2019-07-21 01:53发布


#define                IIC_SDA   GPIO_Pin_5
#define                IIC_SCL   GPIO_Pin_7
#define                READ_SDA   GPIO_ReadInputDataBit(GPIOA,IIC_SDA)

#define                IIC_SDA_Set GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define                IIC_SDA_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define   IIC_SCL_Set GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define   IIC_SCL_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_7)




#include "Oled.h"
void IIC_Init()
{
        GPIO_InitTypeDef GPIO_Initx;
        GPIO_Initx.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initx.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initx.GPIO_Pin=IIC_SDA|IIC_SCL;
        GPIO_Init(GPIOA,&GPIO_Initx);


}

void SDA_Out()
{
        GPIO_InitTypeDef GPIO_Initx;
        GPIO_Initx.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initx.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initx.GPIO_Pin=IIC_SDA;
        GPIO_Init(GPIOA,&GPIO_Initx);
}       

void SDA_In()
{
        GPIO_InitTypeDef GPIO_Initx;
        GPIO_Initx.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Initx.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Initx.GPIO_Pin=IIC_SDA;
        GPIO_Init(GPIOA,&GPIO_Initx);
}       




void IIC_Start()
{
                SDA_Out();
                IIC_SCL_Set;
                IIC_SDA_Set;
                Delay_us(2);
                IIC_SDA_Reset;
                Delay_us(2);
                IIC_SCL_Reset;
                Delay_us(2);
}                                                                                                        //Æeê¼DÅoÅ


void IIC_Stop()       
{
                SDA_Out();
                IIC_SCL_Set;
                IIC_SDA_Reset;
                Delay_us(2);
                IIC_SDA_Set;
                Delay_us(2);
       
}                                                                                        //í£Ö1DÅoÅ

u8 IIC_Wait_Ask(void)
{
    int count=0;
    SDA_In();
    IIC_SCL_Set;
    Delay_us(2);
    while(READ_SDA)
    {
        count++;
        if(count>250)
        {
            IIC_Stop();
            return 1;
        }   
    }
   IIC_SCL_Reset;
   Delay_us(2);
   return 0;
}                                                //ó|′eDÅoÅ

void IIC_WriteByte(uint8_t data)
{
        int i;
        SDA_Out();
        for(i=0;i<8;i++)
        {
                        IIC_SCL_Reset;
                        if((data&0x80)==1)
                                IIC_SDA_Set;
                        else
                                IIC_SDA_Reset;
                Delay_us(2);       
                IIC_SCL_Set;
                Delay_us(2);
                        IIC_SCL_Reset;
                data<<=1;
        }


}                                                        //D′ò&#187;&#184;&#246;×&#214;&#189;ú

void WriteCmd(u8 command)
{
    IIC_Start();
    IIC_WriteByte(0x78);
    IIC_Wait_Ask();
    IIC_WriteByte(0x00);
    IIC_Wait_Ask();
    IIC_WriteByte(command);
    IIC_Wait_Ask();
    IIC_Stop();
}                                                        //D′&#195;üá&#238;

void WriteDat(u8 data)
{
    IIC_Start();
    IIC_WriteByte(0x78);
    IIC_Wait_Ask();
    IIC_WriteByte(0x40);
    IIC_Wait_Ask();
    IIC_WriteByte(data);
    IIC_Wait_Ask();
    IIC_Stop();
}                                //D′êy&#190;Y

void OLED_Init(void)
{
    Delay_ms(100); //????????

    WriteCmd(0xAE); //display off
    WriteCmd(0x20); //Set Memory Addressing Mode   
    WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
    WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
    WriteCmd(0xc8); //Set COM Output Scan Direction
    WriteCmd(0x00); //---set low column address
    WriteCmd(0x10); //---set high column address
    WriteCmd(0x40); //--set start line address
    WriteCmd(0x81); //--set contrast control register
    WriteCmd(0xff); //???? 0x00~0xff
    WriteCmd(0xa1); //--set segment re-map 0 to 127
    WriteCmd(0xa6); //--set normal display
    WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
    WriteCmd(0x3F); //
    WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
    WriteCmd(0xd3); //-set display offset
    WriteCmd(0x00); //-not offset
    WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
    WriteCmd(0x80); //--set divide ratio
    WriteCmd(0xd9); //--set pre-charge period
    WriteCmd(0x22); //
    WriteCmd(0xda); //--set com pins hardware configuration
    WriteCmd(0x12);
    WriteCmd(0xdb); //--set vcomh
    WriteCmd(0x20); //0x20,0.77xVcc
    WriteCmd(0x8d); //--set DC-DC enable
    WriteCmd(0x14); //
    WriteCmd(0xaf); //--turn on oled panel
}

void OLED_ON(void)
{
    WriteCmd(0X8D);  //?????
    WriteCmd(0X14);  //?????
    WriteCmd(0XAF);  //OLED??
}
void OLED_OFF(void)
{
    WriteCmd(0X8D);  //?????
    WriteCmd(0X10);  //?????
    WriteCmd(0XAE);  //OLED??
}
void OLED_SetPos(unsigned char x, unsigned char y) //???????
{
    WriteCmd(0xb0+y);
    WriteCmd(((x&0xf0)>>4)|0x10);
    WriteCmd((x&0x0f)|0x01);
}

void OLED_Fill(unsigned char fill_Data)
{
    unsigned char m,n;
    for(m=0;m<8;m++)
    {
        WriteCmd(0xb0+m);       //page0-page1
        WriteCmd(0x00);     //low column start address
        WriteCmd(0x10);     //high column start address
        for(n=0;n<128;n++)
            {
                WriteDat(fill_Data);
            }
    }
}

void OLED_CLS(void)
{
    OLED_Fill(0x00);
}


下面是我的主函数:
int  main()
{
               
                IIC_Init();
                OLED_ON();
                OLED_Init();
               
                OLED_Fill('a');

}


有点怀疑是不是我的oled坏了




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。