以stm32与oled之间通信为例,配置软件(模拟)iic

static void OLED_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	//¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);	//´ò¿ªGPIOCµÄÍâÉèʱÖÓ
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;	//Ñ¡Ôñ¿ØÖƵÄÒý½Å
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;	//ÉèÖÃΪͨÓÿªÂ©Êä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//ÉèÖÃÊä³öËÙÂÊΪ50MHz
	GPIO_Init(GPIOB,&GPIO_InitStructure);	//µ÷Óÿ⺯Êý³õʼ»¯GPIOA
	
	OLED_SCLK_Set();	//ÉèPC2£¨SCL£©Îª¸ßµçƽ
	OLED_SDIN_Set();	//ÉèPC3£¨SDA£©Îª¸ßµçƽ
}


static void OLED_IIC_Start(void)
{

	OLED_SCLK_Set();	//ʱÖÓÏßÖøß
	OLED_SDIN_Set();	//ÐźÅÏßÖøß
	   delay_us(1);
	OLED_SDIN_CLr();	//ÐźÅÏßÖõÍ
	   delay_us(1);
	OLED_SCLK_CLr();	//ʱÖÓÏßÖõÍ
	   delay_us(1);
}

static void OLED_IIC_Stop(void)
{
	OLED_SDIN_CLr();	//ÐźÅÏßÖõÍ
	   delay_us(1);
	OLED_SCLK_Set();	//ʱÖÓÏßÖøß
	   delay_us(1);
	OLED_SDIN_Set();	//ÐźÅÏßÖøß
	   delay_us(1);
}


static unsigned char IIC_Wait_Ack(void)
{
	unsigned char ack;

	OLED_SCLK_CLr();	//ʱÖÓÏßÖõÍ
	 delay_us(1);
	OLED_SDIN_Set();	//ÐźÅÏßÖøß
	 delay_us(1);
	OLED_SCLK_Set();	//ʱÖÓÏßÖøß
	 delay_us(1);

	if(OLED_READ_SDIN())	//¶ÁÈ¡SDAµÄµçƽ
		ack = IIC_NO_ACK;	//Èç¹ûΪ1£¬Ôò´Ó»úûÓÐÓ¦´ð
	else
		ack = IIC_ACK;		//Èç¹ûΪ0£¬Ôò´Ó»úÓ¦´ð

	OLED_SCLK_CLr();//ʱÖÓÏßÖõÍ
	 delay_us(1);

	return ack;	//·µ»Ø¶ÁÈ¡µ½µÄÓ¦´ðÐÅÏ¢
}


static void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;  //¶¨Òå±äÁ¿
	for(i=0;i<8;i++) //forÑ­»·8´Î
	{
		OLED_SCLK_CLr();	//ʱÖÓÏßÖõͣ¬Îª´«ÊäÊý¾Ý×ö×¼±¸
		 delay_us(1);

		if(IIC_Byte & 0x80)	//¶ÁÈ¡×î¸ßλ
		  	OLED_SDIN_Set();//×î¸ßλΪ1
		else
			OLED_SDIN_CLr();	//×î¸ßλΪ0

		IIC_Byte <<= 1;  //Êý¾Ý×óÒÆ1λ
		 delay_us(1);
		OLED_SCLK_Set(); //ʱÖÓÏßÖøߣ¬²úÉúÉÏÉýÑØ£¬°ÑÊý¾Ý·¢ËͳöÈ¥
		 delay_us(1);
	}
	OLED_SCLK_CLr();	//ʱÖÓÏßÖõÍ
		 delay_us(1);

	while(IIC_Wait_Ack());	//´Ó»úÓ¦´ð
}



static void Write_IIC_Command(unsigned char IIC_Command)
{
   OLED_IIC_Start();
   Write_IIC_Byte(0x78);//дÈë´Ó»úµØÖ·£¬SD0 = 0
   Write_IIC_Byte(0x00);//дÈëÃüÁî
   Write_IIC_Byte(IIC_Command);//Êý¾Ý
   OLED_IIC_Stop();  //·¢ËÍÍ£Ö¹ÐźÅ
}


/*
	@brief			IICдÈëÊý¾Ý
	@param			IIC_Data£ºÊý¾Ý
	@retval			ÎÞ
 */
static void Write_IIC_Data(unsigned char IIC_Data)
{
   OLED_IIC_Start();
   Write_IIC_Byte(0x78);	//дÈë´Ó»úµØÖ·£¬SD0 = 0
   Write_IIC_Byte(0x40);	//дÈëÊý¾Ý
   Write_IIC_Byte(IIC_Data);//Êý¾Ý
   OLED_IIC_Stop();		//·¢ËÍÍ£Ö¹ÐźÅ
}

//¶ÔOLEDдÈëÒ»¸ö×Ö½Ú

void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
{
	if(cmd) 
	  {
       Write_IIC_Data(dat); //дÈëÊý¾Ý
	  }
	else {
       Write_IIC_Command(dat); //дÈëÃüÁî
	}
}


//ÉèÖÃÊý¾ÝдÈëµÄÆðʼÐУ¬ÁÐ
//x: ÁеÄÆðʼµÍµØÖ·ÓÚÆðʼ¸ßµØÖ·
//y: Ò³ ÆðʼҳµÄµØÖ· 0-7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值