转载于:https://www.cnblogs.com/hjf-log/p/stm32-oled.html
使用stm32工程模板,移植其他人使用0.96寸的Oled代码,在OLED上显示字符,使用的引脚是PB3和PB4,是用了重映射的引脚
这里使用的IC是stm32f103vet6,软件是keil5
百度网盘链接:https://pan.baidu.com/s/1xFrQsbjuPpt2DRcLkoDnjA
提取码:wzya
包含keil5工程和取字模工具
接线方法:
stm32 oled
PB3 <-------------------> SCL
PB4 <-------------------> SDA
GND <-------------------> GND
VCC <-------------------> VCC
我们使用的屏幕是长128 * 宽64的OLED屏,可以将每个点想象成有个像素点
OLED_ShowString(0,0,“ABCDEFG”,8)
第一个参数0意思是从x方向的第1个像素开始,填1就是从第2个像素开始,范围是(0~127)
第二个参数0意思是从y方向的第1个像素开始,填1就是从第9个像素开始(这里y每次+1间隔的是8个像素),范围是(0~7)
第三个参数就是我们要显示的字符,要现在工程的"oled_font.h"中设置函数才能找到需要显示的字符,汉字也是如此
这里第四个参数8就是设置一个字符占了 8 * 8个像素,相当于一个64像素的正方形(只能填写8或者16)
下面贴出oled使用的.c和.h文件,还有在main.c的使用
(另外提一下,oled_bmp.c的第一幅图像bmp1被我换成了一个熊猫人,显示的很模糊我也没有去替换成其他的)
1 #include "oled.h" 2 #include "oled_bmp.h" 3 #include "oled_font.h" 4 5 //字符串 6 u8 string[16]; 7 8 //如果是IIC接口 9 10 /********************************************** 11 //IIC Start 12 **********************************************/ 13 void IIC_Start(void) 14 { 15 GPIO_SetBits(SCL_GPIO,SCL_GPIO_Pin); 16 GPIO_SetBits(SDA_GPIO,SDA_GPIO_Pin); 17 GPIO_ResetBits(SDA_GPIO,SDA_GPIO_Pin); 18 GPIO_ResetBits(SCL_GPIO,SCL_GPIO_Pin); 19 } 20 21 /********************************************** 22 //IIC Stop 23 **********************************************/ 24 void IIC_Stop(void) 25 { 26 GPIO_ResetBits(SCL_GPIO,SCL_GPIO_Pin); 27 GPIO_ResetBits(SDA_GPIO,SDA_GPIO_Pin); 28 GPIO_SetBits(SCL_GPIO,SCL_GPIO_Pin); 29 GPIO_SetBits(SDA_GPIO,SDA_GPIO_Pin); 30 } 31 /********************************************** 32 // IIC Write byte 33 **********************************************/ 34 void Write_IIC_Byte(u8 IIC_Byte) 35 { 36 u8 i; 37 for(i=0;i<8;i++) 38 { 39 GPIO_ResetBits(SCL_GPIO,SCL_GPIO_Pin); 40 if(IIC_Byte & 0x80) 41 GPIO_SetBits(SDA_GPIO,SDA_GPIO_Pin); 42 else 43 GPIO_ResetBits(SDA_GPIO,SDA_GPIO_Pin); 44 GPIO_SetBits(SCL_GPIO,SCL_GPIO_Pin); 45 IIC_Byte<<=1; 46 } 47 GPIO_ResetBits(SCL_GPIO,SCL_GPIO_Pin); 48 GPIO_SetBits(SDA_GPIO,SDA_GPIO_Pin); 49 GPIO_SetBits(SCL_GPIO,SCL_GPIO_Pin); 50 GPIO_ResetBits(SCL_GPIO,SCL_GPIO_Pin); 51 } 52 void OLED_WR_Byte(u8 dat,u8 cmd) 53 { 54 //写一个字节函数 55 //dat 要写入的数据或命令 56 //CMD 数据/命令标志位 0命令 1数据 57 if(cmd==0) 58 { 59 IIC_Start(); 60 Write_IIC_Byte(0x78); 61 Write_IIC_Byte(0x00); 62 Write_IIC_Byte(dat); 63 IIC_Stop(); 64 } 65 else 66 { 67 IIC_Start(); 68 Write_IIC_Byte(0x78); 69 Write_IIC_Byte(0x40); 70 Write_IIC_Byte(dat); 71 IIC_Stop(); 72 } 73 } 74 75 76 void OLED_Set_Pos(u8 x,u8 y) 77 { 78 OLED_WR_Byte(0xb0+y,OLED_CMD); 79 OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); 80 OLED_WR_Byte((x&0x0f),OLED_CMD); 81 } 82 83 void OLED_Display_On(void) 84 { 85 //开启OLED显示 86 OLED_WR_Byte(0x8d,OLED_CMD); 87 OLED_WR_Byte(0x14,OLED_CMD); 88 OLED_WR_Byte(0xaf,OLED_CMD); 89 90 } 91 void OLED_Display_Off(void) 92 { 93 //关闭OLED显示 94 OLED_WR_Byte(0x8d,OLED_CMD); 95 OLED_WR_Byte(0x10,OLED_CMD); 96 OLED_WR_Byte(0xaf,OLED_CMD); 97 98 } 99 void OLED_Clear(void) 100 { 101 //清屏 102 u8 i,n; 103 for(i=0;i<8;i++) 104 { 105 OLED_WR_Byte(0xb0+i,OLED_CMD); 106 OLED_WR_Byte(0x02,OLED_CMD); 107 OLED_WR_Byte(0x10,OLED_CMD); 108 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 109 } 110 } 111 112 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size) 113 { 114 //在指定地方显示一个字符,包括部分字符 115 //x:0~127 116 //y:0~63 117 //size:选择字体16*16或8*6 118 u8 c=0,i=0; 119 c=chr-' '; 120 if(x>127) 121 { 122 x=0; 123 y=y+2; 124 } 125 if(size == 16) 126 { 127 OLED_Set_Pos(x,y); 128 for(i=0;i<8;i++) 129 { 130 OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); 131 } 132 OLED_Set_Pos(x,y+1); 133 for(i=0;i<8;i++) 134 { 135 OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); 136 } 137 138 } 139 else 140 { 141 OLED_Set_Pos(x,y); 142 for(i=0;i<6;i++) 143 { 144 OLED_WR_Byte(F6x8[c][i],OLED_DATA); 145 } 146 } 147 } 148 149 u32 oled_pow(u8 m,u8 n) 150 { 151 //m^n函数 152 u32 result = 1; 153 while(n--)result*=m; 154 return result; 155 } 156 157 void OLED_ShowNum(u8 x,u8 y,long num,u8 len,u8 size) 158 { 159 //功能:显示数字 160 //x,y :起点坐标 161 //num:+-65535; 162 //len :数字的位数,负号算一位 163 //size:字体大小 164 u32 t,temp1,temp2,temp3,flag; 165 if(num<0) 166 { 167 flag=1; //负数标志位置1 168 num=-num; //数字变正数 169 } 170 for(t=0;t<len;t++) 171 { 172 temp1=num/oled_pow(10,len-t-1); 173 temp2=temp1%10; 174 if(flag==1) 175 { 176 temp3 = num/oled_pow(10,len-t-2); 177 } 178 if(temp1!=0) 179 { 180 OLED_ShowChar(x,y,'0'+temp2,size); 181 182 } 183 else 184 { 185 if(t==len-1&&temp2==0) 186 { 187 OLED_ShowChar(x,y,'0',size); 188 } 189 else 190 { 191 if(flag==1&&temp3!=0) //该数是负数 192 { 193 OLED_ShowChar(x,y,'-',size); //输出负号 194 flag=0; //负号已输出,标志位置0 195 } 196 else 197 { 198 OLED_ShowChar(x,y,' ',size); 199 } 200 } 201 } 202 x+=8; 203 } 204 205 } 206 207 void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size) 208 { 209 //显示一个汉字串和字符号串 210 //输入 可以换行 211 //写入新汉字需要进行登记 212 u8 x0=x; 213 u16 k; 214 while(*chr!='