求助,stm32模拟iic控制oled 失败。。。

#include "led.h"
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
/** I2C ???? */
#define I2C_PORT GPIOB
#define SDA_Pin    GPIO_Pin_7
#define SCL_Pin GPIO_Pin_6

#define FAILURE 0
#define SUCCESS 1

u32 TimingDelay = 0;

void Delay_Ms(u32 nTime)
{
    TimingDelay = nTime;
    while(TimingDelay != 0);   
}

//I2C³õʼ»¯
void i2c_init()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = SDA_Pin | SCL_Pin;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;     // //I2C±ØÐ뿪©Êä³ö

      GPIO_Init(I2C_PORT, &GPIO_InitStructure);

}
//ÅäÖÃSDAΪÊäÈëģʽ
void SDA_Input_Mode()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = SDA_Pin;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//GPIO_Mode_IPU     

      GPIO_Init(I2C_PORT, &GPIO_InitStructure);
}
//ÅäÖÃSDAΪÊä³öģʽ
void SDA_Output_Mode()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = SDA_Pin;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//GPIO_Mode_AF_OD

      GPIO_Init(I2C_PORT, &GPIO_InitStructure);
}

//
void SDA_Output( uint16_t val )
{
    if ( val ) {
        GPIO_SetBits(I2C_PORT,SDA_Pin);
    } else {
        GPIO_ResetBits(I2C_PORT,SDA_Pin);
    }
}

//
void SCL_Output( uint16_t val )
{
    if ( val ) {
        GPIO_SetBits(I2C_PORT,SCL_Pin);
    } else {
        GPIO_ResetBits(I2C_PORT,SCL_Pin);
    }
}

//
uint8_t SDA_Input()
{
    return GPIO_ReadInputDataBit( I2C_PORT, SDA_Pin);
}

//????
void delay1(unsigned int n)
{
    unsigned int i;
    for ( i=0;i<n;++i);
}

//I2C×ÜÏßÆô¶¯
void I2CStart(void)
{
    SDA_Output(1);delay1(500);
    SCL_Output(1);delay1(500);
    SDA_Output(0);delay1(500);
    SCL_Output(0);delay1(500);
}

//I2C×ÜÏßÍ£Ö¹
void I2CStop(void)
{
    SCL_Output(0); delay1(500);
    SDA_Output(0); delay1(500);
    SCL_Output(1); delay1(500);
    SDA_Output(1); delay1(500);

}

//µÈ´ýÓ¦´ð
unsigned char I2CWaitAck(void)
{
    unsigned short cErrTime = 5;
    SDA_Input_Mode();
    delay1(500);
    SCL_Output(1);delay1(500);
    while(SDA_Input())
    {
        cErrTime--;
        delay1(500);
        if (0 == cErrTime)
        {
            SDA_Output_Mode();
            I2CStop();
            return FAILURE;
        }
    }
    SDA_Output_Mode();
    SCL_Output(0);delay1(500);
    return SUCCESS;
}

//·¢ËÍÓ¦´ðλ
void I2CSendAck(void)
{
    SDA_Output(0);delay1(500);
    delay1(500);
    SCL_Output(1); delay1(500);
    SCL_Output(0); delay1(500);

}

//
void I2CSendNotAck(void)
{
    SDA_Output(1);
    delay1(500);
    SCL_Output(1); delay1(500);
    SCL_Output(0); delay1(500);

}

//ͨ¹ýI2C×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
void I2CSendByte(unsigned char cSendByte)
{
    unsigned char  i = 8;
    while (i--)
    {
        SCL_Output(0);delay1(500);
        SDA_Output(cSendByte & 0x80); delay1(500);
        cSendByte += cSendByte;
        delay1(500);
        SCL_Output(1);delay1(500);
    }
    SCL_Output(0);delay1(500);
}

//ͨ¹ýI2C×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý
unsigned char I2CReceiveByte(void)
{
    unsigned char i = 8;
    unsigned char cR_Byte = 0;
    SDA_Input_Mode();
    while (i--)
    {
        cR_Byte += cR_Byte;
        SCL_Output(0);delay1(500);
        delay1(500);
        SCL_Output(1);delay1(500);
        cR_Byte |=  SDA_Input();
    }
    SCL_Output(0);delay1(500);
    SDA_Output_Mode();
    return cR_Byte;
}



void WriteCmd(u8 data)//EEPROM_Wirte(0x0B);
{    /***дÈë***/                     
  I2CStart();            //¿ªÊ¼
  I2CSendByte(0x76);    //oled µØÖ·
  I2CSendAck();
  I2CSendByte(0x00);         //·¢ËÍ
  I2CSendAck();
  I2CSendByte(data);     //дÈë
  I2CSendAck();
  I2CStop();              //Í£Ö¹
  Delay_Ms(10);//µÈ´ý
}
//Random Read
u8 WriteDat(u8 add)  //EEPROM_Read(i);

{    /***??***/
  u8 a;
  I2CStart();            //¿ªÊ¼
  I2CSendByte(0x78);    //´Ó´ËµØÖ·¿ªÊ¼¶ÁÊý¾Ý
  I2CSendAck();
    I2CSendByte(0x40);
     I2CSendAck();
  I2CSendByte(add);         //дÈëACK
  I2CSendAck();
  I2CStop();               //Í£Ö¹
//  I2CStart();
//  I2CSendByte(0xA1);      //ÏÂÒ»¸öµØÖ·
//  I2CSendAck();
//  a=I2CReceiveByte();      //½ÓÊÕÊý¾Ý£¬±£´æÓÚa
//  I2CSendNotAck();
//  I2CStop();               //Í£Ö¹
//  return a;
}

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(0xf0); //--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_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);
            }
    }
}

int main(void)
{   
    delay_init();           
    LED_Init();            
    i2c_init();
    OLED_Init();      
    OLED_Fill(0Xff);
    while(1)
    {
        
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41059892/article/details/80375362