STM32 0.96OLED I2C 显示(转载)

摘要:
转载于: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/1xFrQsbjuPpt2DRcLkoD

转载于: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被我换成了一个熊猫人,显示的很模糊我也没有去替换成其他的)

STM32 0.96OLED I2C 显示(转载)第1张STM32 0.96OLED I2C 显示(转载)第2张
复制代码
  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!='

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇查找Excel中有内容Range范围!Java高级--Java线程运行栈信息的获取 getStackTrace()下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(stm32f103学习总结)—ADC模数转换实验

一、STM32F1 ADC介绍  TM32F103 系列一般都有 3 个 ADC,这些 ADC 可以独立使用,也可 以使用双重(提高采样率)。STM32F1 的 ADC 是 12 位逐次 逼近型的模拟数字转换器。它具有多达 18个复用通道,可测量来自16 个外部源、2 个内部源信号。 这些通道的 A/D 转换可 以单次、连续、扫描或间断模式执行。ADC 的...

各种密钥的缩写和全称

BDK Base Derivation Key 基础导出密钥 CS Configure Security 安全配置 CSC Card Security Codes 卡安全码 CSCK Card Security Codes Key 卡安全码密钥 CVK Card Validation Key 卡校验密钥 CVV Card Valid...

linux驱动(七)gpiolib库详解

---恢复内容开始--- 1:什么是gpiolib,为什么要有gpiolib? linux中从2.6.35以后就开始有gpiolib库了,gpiolib的作用是对所有的gpio实行统一管理,因为驱动在工作的时候,会出现好几个驱动共同使用同一个gpio的情况; 这会造成混乱。所以内核提供了一些方法来管理gpio资源; 2:如何学习gpiolib 第一:gpi...

STM32---喜提点灯

一:编译第一个程序 intmain()  //主函数 { } voidSystemInit()  //在执行主函数前,会被调用。不进行实现。在启动文件中被调用 { } ; Reset handler Reset_Handler PROC EXPORT Reset_Handler...

高通Android Camera Bring up

高通Android Camera的移植 注:此文档以在高通8916平台移植OV5648为例,给大家讲解Android SOC的底层Camera。 Reference: https://blog.csdn.net/weijory/article/details/53811140 https://www.jianshu.com/p/70bdb79e5026...

STM32 OLED屏显示详解

不多废话,先看效果         全家福 观看演示效果: https://www.bilibili.com/video/BV13V411b78V 一、基础认识及引脚介绍 屏幕参数: 尺寸:0.96英寸 分辨率:128*64 驱动芯片:SSD1306 驱动接口协议:SPI 引脚说明: 二、 SSD1306芯片介绍 SSD1306是一款带控制器的用于OL...