四针IIC接口OLED屏幕
四针IIC接口 OLED屏幕lie通讯协议简介lie通信是串行同步全双工:单 片 机起始信号s: SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 终止信号P: SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:每次传输8bit(1字节)数据后,必须要有的响应信号,由接收方来 发出在SCK为高时(一个脉冲内),将SDA拉低。非应答信号:在SCK为高时(一个脉冲内),将SDA置高。硬件连接:IIC 0.96 寸 0LED 屏幕与 stm32f103zet6OLED屏 幕oled.c 文件:void IIC_Start(void)OLED_SCLK_Set() ;OLED_SDIN_Set();OLED_SDIN_Clr();OLED_SCLK_Clr();/M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M*/ *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W/IIC StopM* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* M* / #|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W *|W /void IIC_Stop(void)OLED_SCLK_Set() ;/ OLED_SCLK_Clr();OLED_SDIN_Clr();OLED_SDIN_Set();void IIC_Wait_Ack(void)/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();da=da<<1;OLED_SCLK_Set();OLED_SCLK_Clr();/ IIC Write Command void Write_IIC_Command(unsigned char IIC_Command)IIC_Start();Write_IIC_Byte(0x78); /Slave address,SA0=0IIC_Wait_Ack();Write_IIC_Byte(0x00); /write commandIIC_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#=0IIC_Wait_Ack();Write_IIC_Byte(0x40);/write dataIIC_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-page1OLED_WR_Byte(0x00,0);/low column start addressOLED_WR_Byte(0x10,0);/high column start addressfor(n=0;n<128;n+) OLED_WR_Byte(fill_Data,1);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 OFFOLED_WR_Byte(0XAE,OLED_CMD); /DISPLAY OFF/清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样void OLED_Clear(void)u8 i,n;for(i=0;i<8;i+)OLED_WR_Byte (0xb0+i,OLED_CMD);/设置页地址(07)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);/设置页地址(07)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:0127/y:063mode:0,反白显示;1,正常显示/size :选择字体 16/12void 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(F8X16c*16+i,OLED_DATA); OLED_Set_Pos(x,y+1);for(i=0;i<8;i+) OLED_WR_Byte(F8X16c*16+i+8,OLED_DATA); else OLED_Set_Pos(x,y); for(i=0;i<6;i+) OLED_WR_Byte(F6x8ci,OLED_DATA);/mAn函数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:数值(04294967295);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,u