精华内容
下载资源
问答
  • STM32 OLED显示程序

    2018-11-18 09:49:07
    这是基于正点原子探索者单片机的OLED显示实验程序,亲测可用
  • STM32 OLED屏幕 显示测试程序,并且带编码器程序,编码器计算结果显示在屏幕上,有问题请联系我QQ1056247163
  • stm32OLED显示

    2018-09-08 15:23:03
    Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz delay_init(180); //初始化延时函数 LED_Init(); //初始化LED OLED_Init(); //初始化OLED OLED_ShowString(0,0,"ALIENTEK",24); OLED_ShowString(0,24, ...
  • STM32OLED显示

    2018-02-09 13:36:46
    STM32OLED显示-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------...
  • STM32OLED显示程序

    千次阅读 2020-09-04 16:25:18
    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可...

    00. 目录

    01. OLED概述

    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

    LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。

    02. OLED初始化

    在这里插入图片描述

    驱动 IC 的初始化代码,我们直接使用厂家推荐的设置就可以了,只要对细节部分进行一些修改,使其满足我们自己的要求即可,其他不需要变动。

    OLED 显示需要的相关设置步骤如下:

    1 )设置 STM32F4 与 与 OLED 模块相连接的 IO 。
    这一步,先将我们与 OLED 模块相连的 IO 口设置为输出,具体使用哪些 IO 口,这里需要根据连接电路以及 OLED 模块所设置的通讯模式来确定。

    2 )初始化 OLED 模块。
    其实这里就是上面的初始化框图的内容,通过对 OLED 相关寄存器的初始化,来启动 OLED的显示。

    3 )通过函数将字符和数字显示到 OLED 模块上。
    这里就是通过我们设计的程序,将要显示的字符送到 OLED 模块就可以了

    通过以上三步,我们就可以使用 ALIENTEK OLED 模块来显示字符和数字了。

    03. 硬件设计

    用到的硬件资源有:
    1) 指示灯 DS0
    2) OLED 模块

    硬件上,OLED 与探索者 STM32F4 开发板的 IO 口对应关系如下:
    OLED_CS 对应 DCMI_VSYNC,即:PB7;
    OLED_RS 对应 DCMI_SCL,即:PD6;
    OLED_WR 对应 DCMI_HREF,即:PA4;
    OLED_RD 对应 DCMI_SDA,即:PD7;
    OLED_RST 对应 DCMI_RESET,即:PG15;
    OLED_D[7:0]对应 DCMI_D[7:0],即:PE6/PE5/PB6/PC11/PC9/PC8/PC7/PC6;

    04. 程序示例

    oled.h

    #ifndef __OLED_H
    #define __OLED_H			  	 
    #include "sys.h"
    #include "stdlib.h"	    
    
    //OLED模式设置
    //0: 4线串行模式  (模块的BS1,BS2均接GND)
    //1: 并行8080模式 (模块的BS1,BS2均接VCC)
    #define OLED_MODE 	1 
    		    						  
    //-----------------OLED端口定义----------------  					   
    #define OLED_CS 	PBout(7)
    #define OLED_RST  PGout(15)	
    #define OLED_RS 	PDout(6)
    #define OLED_WR 	PAout(4)		  
    #define OLED_RD 	PDout(7)
     
    //使用4线串行接口时使用 
    #define OLED_SCLK 	PCout(6)
    #define OLED_SDIN 	PCout(7)
    		     
    #define OLED_CMD  	0		//写命令
    #define OLED_DATA 	1		//写数据
    //OLED控制用函数
    void OLED_WR_Byte(u8 dat,u8 cmd);	    
    void OLED_Display_On(void);
    void OLED_Display_Off(void);
    void OLED_Refresh_Gram(void);		   
    							   		    
    void OLED_Init(void);
    void OLED_Clear(void);
    void OLED_DrawPoint(u8 x,u8 y,u8 t);
    void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
    void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size);	 
    #endif  
    

    oled.c

    #include "oled.h"
    #include "stdlib.h"
    #include "oledfont.h"  	 
    #include "delay.h"
    
    //OLED的显存
    //存放格式如下.
    //[0]0 1 2 3 ... 127	
    //[1]0 1 2 3 ... 127	
    //[2]0 1 2 3 ... 127	
    //[3]0 1 2 3 ... 127	
    //[4]0 1 2 3 ... 127	
    //[5]0 1 2 3 ... 127	
    //[6]0 1 2 3 ... 127	
    //[7]0 1 2 3 ... 127 		   
    u8 OLED_GRAM[128][8];	 
    
    //更新显存到LCD		 
    void OLED_Refresh_Gram(void)
    {
    	u8 i,n;		    
    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
    		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
    		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
    		for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); 
    	}   
    }
    //8080并口
    //通过拼凑的方法向OLED输出一个8位数据
    //data:要输出的数据
    void OLED_Data_Out(u8 data)
    {
    	u16 dat=data&0X0F;
    	GPIOC->ODR&=~(0XF<<6);		//清空6~9
    	GPIOC->ODR|=dat<<6;			//D[3:0]-->PC[9:6]
    	GPIO_Write(GPIOC,dat<<6);
    	PCout(11)=(data>>4)&0X01;	//D4
    	PBout(6)=(data>>5)&0X01;	//D5
    	PEout(5)=(data>>6)&0X01;	//D6
    	PEout(6)=(data>>7)&0X01;	//D7 
    } 
    //向SSD1306写入一个字节。
    //dat:要写入的数据/命令
    //cmd:数据/命令标志 0,表示命令;1,表示数据;
    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
    	OLED_Data_Out(dat);	    
     	OLED_RS=cmd;
    	OLED_CS=0;	   
    	OLED_WR=0;	 
    	OLED_WR=1;
    	OLED_CS=1;	  
    	OLED_RS=1;	 
    } 	    	    
    	  	  
    //开启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 OFF
    	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
    }		   			 
    //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
    void OLED_Clear(void)  
    {  
    	u8 i,n;  
    	for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;  
    	OLED_Refresh_Gram();//更新显示
    }
    //画点 
    //x:0~127
    //y:0~63
    //t:1 填充 0,清空				   
    void OLED_DrawPoint(u8 x,u8 y,u8 t)
    {
    	u8 pos,bx,temp=0;
    	if(x>127||y>63)return;//超出范围了.
    	pos=7-y/8;
    	bx=y%8;
    	temp=1<<(7-bx);
    	if(t)OLED_GRAM[x][pos]|=temp;
    	else OLED_GRAM[x][pos]&=~temp;	    
    }
    //x1,y1,x2,y2 填充区域的对角坐标
    //确保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63	 	 
    //dot:0,清空;1,填充	  
    void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)  
    {  
    	u8 x,y;  
    	for(x=x1;x<=x2;x++)
    	{
    		for(y=y1;y<=y2;y++)OLED_DrawPoint(x,y,dot);
    	}													    
    	OLED_Refresh_Gram();//更新显示
    }
    //在指定位置显示一个字符,包括部分字符
    //x:0~127
    //y:0~63
    //mode:0,反白显示;1,正常显示				 
    //size:选择字体 12/16/24
    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
    {      			    
    	u8 temp,t,t1;
    	u8 y0=y;
    	u8 csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数
    	chr=chr-' ';//得到偏移后的值		 
        for(t=0;t<csize;t++)
        {   
    		if(size==12)temp=asc2_1206[chr][t]; 	 	//调用1206字体
    		else if(size==16)temp=asc2_1608[chr][t];	//调用1608字体
    		else if(size==24)temp=asc2_2412[chr][t];	//调用2412字体
    		else return;								//没有的字库
            for(t1=0;t1<8;t1++)
    		{
    			if(temp&0x80)OLED_DrawPoint(x,y,mode);
    			else OLED_DrawPoint(x,y,!mode);
    			temp<<=1;
    			y++;
    			if((y-y0)==size)
    			{
    				y=y0;
    				x++;
    				break;
    			}
    		}  	 
        }          
    }
    //m^n函数
    u32 mypow(u8 m,u8 n)
    {
    	u32 result=1;	 
    	while(n--)result*=m;    
    	return result;
    }				  
    //显示2个数字
    //x,y :起点坐标	 
    //len :数字的位数
    //size:字体大小
    //mode:模式	0,填充模式;1,叠加模式
    //num:数值(0~4294967295);	 		  
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
    {         	
    	u8 t,temp;
    	u8 enshow=0;						   
    	for(t=0;t<len;t++)
    	{
    		temp=(num/mypow(10,len-t-1))%10;
    		if(enshow==0&&t<(len-1))
    		{
    			if(temp==0)
    			{
    				OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
    				continue;
    			}else enshow=1; 
    		 	 
    		}
    	 	OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); 
    	}
    } 
    //显示字符串
    //x,y:起点坐标  
    //size:字体大小 
    //*p:字符串起始地址 
    void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size)
    {	
        while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
        {       
            if(x>(128-(size/2))){x=0;y+=size;}
            if(y>(64-size)){y=x=0;OLED_Clear();}
            OLED_ShowChar(x,y,*p,size,1);	 
            x+=size/2;
            p++;
        }  
    	
    }	
    //初始化SSD1306					    
    void OLED_Init(void)
    { 	 		 
      GPIO_InitTypeDef  GPIO_InitStructure;
    	
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOG, ENABLE);//使能PORTA~E,PORTG时钟
      
    //使用8080并口模式		
    	
    	//GPIO初始化设置
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
    	
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7 ;	
    	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;	
    	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化	
      
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	
    	GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化	
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_5;	
    	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化	
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	
    	GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化	
     
    	
     	OLED_WR=1;
    	OLED_RD=1; 
    
    	OLED_CS=1;
    	OLED_RS=1;	 
    	
    	OLED_RST=0;
    	delay_ms(100);
    	OLED_RST=1; 
    					  
    	OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
    	OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
    	OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
    	OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
    	OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64) 
    	OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
    	OLED_WR_Byte(0X00,OLED_CMD); //默认为0
    
    	OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
    													    
    	OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
    	OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
    	OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
    	OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
    	OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
    	OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
    	OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
    	OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
    		 
    	OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
    	OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
    	OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
    	OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
    	OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
    	OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
    
    	OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
    	OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示	    						   
    	OLED_WR_Byte(0xAF,OLED_CMD); //开启显示	 
    	OLED_Clear();
    }  
    
    

    main.c

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "led.h"
    #include "oled.h"
    
    
    int main(void)
    { 
    	u8 t=0;
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    	delay_init(168);     //初始化延时函数
    	uart_init(115200);	//初始化串口波特率为115200
    	LED_Init();					//初始化LED
     	OLED_Init();				//初始化OLED
      OLED_ShowString(0,0,"ALIENTEK",24);  
    	OLED_ShowString(0,24, "0.96' OLED TEST",16);  
     	OLED_ShowString(0,40,"ATOM 2014/5/4",12);  
     	OLED_ShowString(0,52,"ASCII:",12);  
     	OLED_ShowString(64,52,"CODE:",12);  
    	OLED_Refresh_Gram();//更新显示到OLED	 
    	t=' ';  
    	while(1) 
    	{		
    		OLED_ShowChar(36,52,t,12,1);//显示ASCII字符	
    		OLED_ShowNum(94,52,t,3,12);	//显示ASCII字符的码值    
    		OLED_Refresh_Gram();        //更新显示到OLED
    		t++;
    		if(t>'~')t=' ';  
    		delay_ms(500);
    		LED0=!LED0;
    	}
    }
    

    05. 结果显示

    06. 附录

    6.1 【STM32】STM32系列教程汇总

    网址:【STM32】STM32系列教程汇总

    07. 声明

    该教程参考了正点原子的《STM32 F4 开发指南》

    展开全文
  • STM32超声波OLED程序

    2017-01-01 21:29:35
    STM32程序 OLED程序 超声波程序
  • STM32OLED显示程序,亲测可用。内有详细注释和说明文档,很好的参考资料。
  • STM32OLED显示程序,亲测能用,亲测能用。内有详细的讲解文档,很好的学习资料。
  • STM32 OLED显示流程(简略)

    万次阅读 多人点赞 2016-05-13 10:27:11
    前两天刚学了战舰的OLED显示实验,下面是我总结的OLED显示方法: 比如我们想让OLED显示屏显示一个字符串:“CODE”,主函数是这么两条语句:,(63和48是字符串在屏幕中显示的位置,这里我们不管他。。)这两条语句...

    前两天刚学了战舰的OLED显示实验,下面是我总结的OLED显示方法:

    比如我们想让OLED显示屏显示一个字符串:“CODE”,主函数是这么两条语句:,(63和48是字符串在屏幕中显示的位置,这里我们不管他。。)这两条语句的拆解步骤如下:

    1、既然是显示字符串,我们就得调用字符串显示函数:
    2、这个字符串显示函数通过指针*p不断调用字符显示函数:来显示字符串中的每个字符
    3、字符是怎么组成的?由点组成的嘛。。在OLED_ShowChar()函数中又调用画点函数:把每个字符的点阵全部画完(如1206,1608,2412)
    4、每次画一个点不能没地方保存呐。所以我们再STM32的SRAM中开辟的一块128*8字节(128*8*8位)的空间OLED_GRAM[128][8]。用来存放每个点对应屏幕上的坐标,也就是OLED_GRAM中保存了所有点的坐标
    5、以上都是围绕着字符串显示函数。现在终于到第二条语句:OLED_Refresh——Gram()语句了。这个语句的作用就是把我们之前在系统里开辟的那段128*8字节空间(OLED_GRAM[128][8]),里的数据通过两个for循环全部更新到(写入)SSD1306(OLED模块控制器)的GRAM中。
    怎么写入呢?这里又调用了OLED_WR_Byte()函数。这个函数作用是向SSD1306中写入一个字节数据。
    6、最后,由于之前对OLED进行过初始化,字符串就显示在屏幕上了。
     

    展开全文
  • STM32 OLED显示流程

    2020-07-19 20:26:20
    前两天刚学了战舰的OLED显示实验,下面是我总结的OLED显示方法: 比如我们想让OLED显示屏显示一个字符串:“CODE”,主函数是这么两条语句:,(63和48是字符串在屏幕中显示的位置,这里我们不管他。。)这两条语句...

    前两天刚学了战舰的OLED显示实验,下面是我总结的OLED显示方法:

    比如我们想让OLED显示屏显示一个字符串:“CODE”,主函数是这么两条语句:,(63和48是字符串在屏幕中显示的位置,这里我们不管他。。)这两条语句的拆解步骤如下:

    1、既然是显示字符串,我们就得调用字符串显示函数:
    2、这个字符串显示函数通过指针*p不断调用字符显示函数:来显示字符串中的每个字符
    3、字符是怎么组成的?由点组成的嘛。。在OLED_ShowChar()函数中又调用画点函数:把每个字符的点阵全部画完(如1206,1608,2412)
    4、每次画一个点不能没地方保存呐。所以我们再STM32的SRAM中开辟的一块128*8字节(128*8*8位)的空间OLED_GRAM[128][8]。用来存放每个点对应屏幕上的坐标,也就是OLED_GRAM中保存了所有点的坐标
    5、以上都是围绕着字符串显示函数。现在终于到第二条语句:OLED_Refresh——Gram()语句了。这个语句的作用就是把我们之前在系统里开辟的那段128*8字节空间(OLED_GRAM[128][8]),里的数据通过两个for循环全部更新到(写入)SSD1306(OLED模块控制器)的GRAM中。
    怎么写入呢?这里又调用了OLED_WR_Byte()函数。这个函数作用是向SSD1306中写入一个字节数据。
    6、最后,由于之前对OLED进行过初始化,字符串就显示在屏幕上了。

    展开全文
  • STM32 OLED多级菜单显示

    2018-04-03 16:02:23
    基于STM32单片机,使OLED液晶显示屏进行多级菜单显示
  • STM32STM32 OLED打点划线画圆 OLED电子罗盘 程序

    千次阅读 多人点赞 2019-02-12 18:14:34
    STM32 MCU Keil 5 用到的库函数为 正点原子 STM32F4 库 drv_oled.c /drv_oled.h 下载链接↓↓↓: 链接:https://pan.baidu.com/s/1qYsF8yCrYWOhPRCyGoFWDQ 提取码:ft7s 一、画点函数 //画点 //x:0~1...


    注:本文仅用于学习分享

    用到的工具

    • STM32 MCU
    • Keil 5

    用到的库函数为 正点原子 STM32F4 库OLED


     自定义OLED 坐标系如下: 【构建OLED 直角坐标系, x,y轴反置 方便函数运算】
    
    			↑y
    		    |
    	      127--------
    			|	     |
    			|		 |
    			|		 |
    			|		 |
    			|		 |
    			|		 |
    		(0,0)----------→x  
    							63
    
    

    一、画点函数

    //画点 
    //x:0~127
    //y:0~63
    //t:1 填充 0,清空				   
    void OLED_DrawPoint(u8 x,u8 y,u8 t)
    {
    	u8 pos,bx,temp=0;
    	if(x>127||y>63)return;//超出范围了.
    	pos=7-y/8;
    	bx=y%8;
    	temp=1<<(7-bx);
    	if(t)OLED_GRAM[x][pos]|=temp;
    	else OLED_GRAM[x][pos]&=~temp;	    
    }
    

    二、动态划线

    此函数有限制条件:
    - 1.划线的线段在 规定的圆内.
    - 2.斜率为东北天坐标系下 解算航向斜率slope
    

    构建的是后面 OLED页面指南针 的 “ 针 ”

    /* 使用不同坐标系 为了解决函数上 x映射y时只能多对一的关系 该方法较为繁杂 */
    void draw_line(u8 x0,u8 y0,float k,u8 dot) //过固定点(x0,y0),斜率k   dot:0,清空;1,填充	  
    {
    		u8 x,y;
    		//y = (k*(x-x0)+y0); 直线函数
    /* 以下函数使用该坐标系: 
    	                            127 ↑y
    			-------------------------
    			|						|
    			|						|
    			|						|
    			|						|
    	   ←-----------------------------(0,0)x  
    			63
    */
    	for(x = 0;x <= 63;x++){
    		y = sqrt(pow(20,2)-pow(x-31,2))+31+1; //圆方程  x,y反置
    		
    		if( (JY901.Angle[2] >-135 && JY901.Angle[2] <-90 ) ||(JY901.Angle[2] >90 && JY901.Angle[2] < 145 ) || dot == 0 ){ //上半圆
    			if( ((x-x0)/k+y0) >= 31 && ((x-x0)/k+y0) < y ) {  //点限制在 圆方程内
    				OLED_DrawPoint(x,((x-x0)/k+y0),dot);
    			}
    		}
    			
    		if( (JY901.Angle[2] < -45 && JY901.Angle[2] > -90) || (JY901.Angle[2] < 90 && JY901.Angle[2] > 45) || dot == 0 ){ //上半圆
    			if(  ((x-x0)/k+y0) <= 31 && ((x-x0)/k+y0)> 63-y ) {  //点限制在 圆方程内
    				OLED_DrawPoint(x,((x-x0)/k+y0),dot);}
    		}
    	}
    /* 以下函数使用该坐标系: 
    	    127 ↑y
    			------------
    			|	      |
    			|		  |
    			|		  |
    			|		  |
    			|		  |
    			|		  |
    		(0,0)----------→x  
    					63
    */
    	for(x = 0;x <= 63;x++){
    		y = sqrt(pow(20,2)-pow(x-31,2))+31+1; //圆方程  x,y反置
    	
    		if( (JY901.Angle[2] >=-45 && JY901.Angle[2] <= 0) || (JY901.Angle[2] >=-180 && JY901.Angle[2] <= -135)  || dot == 0 ){  // JY901.Angle[2] < 0
    			if( (k*(x-x0)+y0) >= 31 && (k*(x-x0)+y0) < y ) {  //点限制在 圆方程内   上半圆
    				OLED_DrawPoint((k*(x-x0)+y0),x,dot);
    			}
    		}
    			
    		if( (JY901.Angle[2] > 0 && JY901.Angle[2] <= 45) || (JY901.Angle[2] >=135 && JY901.Angle[2] <= 180)  || dot == 0 ){  // JY901.Angle[2] < 0
    			if(((k*(x-x0)+y0)< 31 && (k*(x-x0)+y0) > 63-y)) {  //点限制在 圆方程内  下半圆
    				OLED_DrawPoint((k*(x-x0)+y0),x,dot);
    			} 
    		}
    	}
    
    }
    

    此间延时方法为 RT-Thread 操作系统中 释放内存 挂起函数 rt_thread_delay()

    /* 开机动画 */
    void Boot_Animation(void)
    {
    		static u8 x=0,y=0;
    		for(x = 63;x>=18;x--){
    				OLED_DrawPoint(108-0.7*x,x,1);//画斜线 斜率≈√3/3
    				OLED_DrawPoint(17 +0.7*x,x,1);
    				y = 64-x;
    				OLED_DrawPoint(64-0.7*y,y,1);
    				OLED_DrawPoint(64+0.7*y,y,1);
    				rt_thread_delay(2);
    			  	OLED_Refresh_Gram();//更新显示到OLED
    		}
    		
    		for(x = 30;x <= 94;x++){
    				OLED_DrawPoint(125-x,47,1);
    				OLED_DrawPoint(x,18,1);
    				rt_thread_delay(2);
    				OLED_Refresh_Gram();//更新显示到OLED
    		}
    
    		OLED_ShowString(60,20,(u8 *)"E",16);
    	  	OLED_Refresh_Gram();//更新显示到OLED
    		rt_thread_delay(100);
    		
    }
    

    效果演示:

    上下同时画两个互相倒置的三角形,形成简易六芒星.
    在这里插入图片描述

    三、画圆函数

    构建的是后面 OLED页面指南针 的 “ 圆 ”

    void draw_circle(u8 x0,u8 y0,u8 r) //圆心(x0,y0),半径r
    {
    	u8 x,y;
    	for(x = 0;x <= 63;x++){
    		y = sqrt(pow(r,2)-pow(x-x0,2))+y0; //圆方程  x,y反置
    		OLED_DrawPoint(y,x,1);      //上半圆
    		OLED_DrawPoint(63-y,x,1);   //下半圆
    	}
    }
    
    

    在这里插入图片描述

    OLED_PicturePage()
    - 1.右半边显示OLED电子罗盘
    - 2.左半边显示欧拉角:①Roll 横滚角 ②Pitch 俯仰角 ③ Yaw 偏航角 与 偏航角的正切值
    
    /* OLED第四页 【图像页】*/
    void OLED_PicturePage(void)
    {
    		static u8 y=0;
    		char str[100];
    	
    		draw_line(31,31,slope,0); //清除上一次画的线 进行刷新
    		OLED_Refresh_Gram();//更新显示到OLED
    	
    		slope = tan((float)(JY901.Angle[2]*Pi/180));  //转化弧度制 解算东北天坐标系下 航向斜率slope
    	
    		for(y = 28;y <= 36;y++){ //补圆顶底部的缺失点
    				OLED_DrawPoint(y,0,1);
    				OLED_DrawPoint(y,63,1);
    		}
    	
    		draw_line(31,31,slope,1);
    		
    		sprintf(str,"Rol:%3.1f  ",JY901.Angle[0]); //横滚脚Roll
    		OLED_ShowString(65,0, (u8 *)str,12);
    		
    		sprintf(str,"Pit:%3.1f  ",JY901.Angle[1]); //俯仰角Pitch
    		OLED_ShowString(65,16, (u8 *)str,12);
    		
    		sprintf(str,"Yaw:%3.1f  ",JY901.Angle[2]); //俯仰角Yaw
    		OLED_ShowString(65,32, (u8 *)str,12);
    		
    		sprintf(str,"k:%.1f   ",slope);
    		OLED_ShowString(65,48,(u8 *)str,12); 
    		
    
    		OLED_ShowString(29,2 ,(u8 *)"N",12);
    		OLED_ShowString(29,51,(u8 *)"S",12);
    		OLED_ShowString(3	,28,(u8 *)"W",12);
    		OLED_ShowString(55,28,(u8 *)"E",12);
    		draw_circle(31,31,32);
    
    	
    		OLED_Refresh_Gram();//更新显示到OLED						
    }
    

    效果演示

    在这里插入图片描述

    四、实心圆函数

    void draw_fill_circle(u8 x0,u8 y0,u8 r,u8 dot)//写画实心圆心(x0,y0),半径r
    {	
    		u8 x = 0,y = 0,R = 0;
    		for(x = x0-r;x <= x0+r;x++){
    			for(y = y0-r; y <= y0+r ;y++ ){
    				R = sqrt(pow(r,2)-pow(x-x0,2))+y0; //圆方程  x,y反置		
    				if( (y >= y0 && y <= R) || (y < y0 && y >= 2*y0-R )|| dot == 0 ) {  //点限制在 圆方程内	
    					OLED_DrawPoint(y,x,dot);
    				}	
    			}
    		}
    }
    

    Dwfish 淹死的鱼 2019.2.12

    展开全文
  • STM32的OLED液晶显示程序,已测试,可以直接拿来用,学习OLED显示的好程序。
  • STM32OLED程序

    2018-08-04 09:44:33
    可以显示数字、字母、显示图片、制作基于OLED的动画等,移植性好。
  • STM32CUEB关于KEIL5、stm32f103c8t6模拟IIC程序、OLED显示程序 .
  • STM32_OLED显示

    2018-02-06 08:33:23
    适合stm32OLED显示,分非常好用的程序,本人亲测。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
  • 基于STM32单片机的DHT11 温湿度传感器+OLED显示程序,用于检测空气温湿度,并用OLED 显示
  • stm32中用于oled显示程序文件,主要利用的是I2C通讯,可以实现oled的显示.包含了字库文件,头文件等.主要是作为项目辅助部分,因为之前在上传代码时候出现了字库文件不能上传的情况.
  • stm32例程 OLED显示实验

    2018-10-25 16:45:32
    stm32例程 之OLED显示实验。 (亲测有效,亲测有效,亲测有效)
  • 基于STM32单片机的MQ3 传感器+OLED显示程序,可以检测空气中的挥发性有机气体浓度,并显示
  • stm32 f103c8t6 IIC 驱动oled屏幕 亲测有效 关注bilibili个人账号号 在b站公告免费获取百度网盘下载链接
  • 旋转编码开关EC11有一个按键和AB相编码输出,通过相位变化来判断顺时针还是逆时针旋转,由编码产生外部中断配合STM32进行解析,本程序采用软件滤波,得到的编码值直接控制0.96寸OLED的多级菜单显示
  • STM32F103OLED显示菜单实验,采用中断来实现菜单的切换,有具体的实例,很好的教学程序
  • 基于STM32OLED显示仿真设计(包含源程序+Proteus仿真)
  • STM32 oled多级菜单显示

    千次阅读 多人点赞 2021-03-05 16:41:54
    只要有显示屏的地方,就要用到多级菜单的显示。在很多初学者眼里,多级菜单的显示是很难的,今天我做完了这个小项目,我就来分享一下我做的经历。 首先肯定的是,只要理清思路,就不怕多级菜单显示很难。先上几张...
  • 基于STM32F407的OLED程序,此程序是在中景园电子科技所写的OLED例程上面做的修改,自己加了一些注释,如有不对的地方,欢迎纠正。 文件包含内容: STM32F407OLED显示IIC接口程序; 取字模操作软件及步骤;
  • 该程序是基于STM32F103ZET6,OLED12864和HC-06的显示程序,用手机通过蓝牙串口向STM32发送字符串,即可在OLED上显示,该程序只支持显示英文和符号,不支持汉字。
  • STM32-0.96OLED显示

    2014-07-13 16:43:09
    stm32 0.96oled显示 io口程序里标明了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,869
精华内容 747
关键字:

stm32oled显示程序