【STM32】STM32 OLED打点划线画圆 OLED电子罗盘 程序

2023-05-16

目录:

  • 一、画点函数
  • 二、动态划线
    • 效果演示:
  • 三、画圆函数
    • 效果演示
  • 四、实心圆函数

注: 本文仅用于学习分享

用到的工具

  • 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】STM32 OLED打点划线画圆 OLED电子罗盘 程序 的相关文章

  • FreeRTOS的学习(十四)——PendSV异常

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • adb命令大全

    目录 基本用法 命令语法 为命令指定目标设备 启动 停止 查看 adb 版本 以 root 权限运行 adbd 指定 adb server 的网络端口 设备连接管理 查询已连接设备 模拟器 USB 连接 无线连接 xff08 需要借助 US
  • Sallen-Key二阶低通滤波器——设计问题浅析

    目录 前言1 Sallen Key二阶低通滤波器结构2 截止频率3 结语 前言 这两天接了个简单的活 xff0c 关于设计一个Sallen Key二阶低通滤波器 xff0c 有一些体会 1 Sallen Key二阶低通滤波器结构 这个结构很
  • VsCode之常见操作01 修改背景颜色

    改变 Vscode的背景颜色 file 61 61 gt preferences 61 61 gt color theme 分别提供了亮色 xff0c 暗色主模版 也可以使用 快捷键 crtl 43 k crtl 43 t 61 61 gt
  • 学习Java一年的心得体会

    趁着这个时间 xff0c 写下我这一年来学习Java的总结 从17年的7月13号至今 xff0c 已经入坑一年了 xff0c 有汗水也有收获 最开始是在淘宝买了个五块钱的JAVA视频教程 xff0c 有基础 xff0c 进阶以及一些实战 说
  • 《Python数据结构与算法分析》读书笔记三——基本数据结构(一)

    文章目录 3 1 本章目标3 2 何谓线性数据结构3 3 栈3 3 1 何谓栈3 3 2 栈抽象数据类型3 3 3 用Python实现栈3 3 4 匹配括号3 3 5 普通情况 xff1a 匹配符号3 3 6 将十进制数转换成二进制数3 3
  • C++数据结构与算法——哈希表实现(链式法)

    解决散列冲突 文件结构字典类概念代码 哈希类概念代码 有序链表概念代码 哈希表实现概念代码 测试主函数代码输出 文件结构 字典类 概念 代码 span class token comment dictionary h span span c
  • Ubuntu编译安装LLVM(13.0.1)

    参考官方教程 xff1a https llvm org docs GettingStarted html 环境要求 我的电脑是Ubuntu 20 04虚拟机 xff0c 看一下官网的要求 xff1a 硬件要求 xff1a 软件要求 xff1
  • Ubuntu 20.04 安装docker报错

    在下载公钥后运行sudo apt update报错 xff0c 错误如图 xff1a 试了这两种方法都不好使 xff1a span class token function sudo span apt key adv keyserver k
  • 超声波传感器知识(第四部分):测量精度的影响

    摘要 xff1a 对于超声波传感器 xff0c 测量精度通常是指模拟输出的测量值的绝对精度 基于回波传输时间 xff0c 超声波传感器的测量精度依靠数个物理参数 这些参数通常与空气和内部偏差相关 对于超声波传感器 xff0c 测量精度通常是
  • STM32学习之旅④ USART串口和上位机通信

    STM32系列博客 xff1a STM32学习之旅 开发环境搭建STM32学习之旅 固件库的使用及工程模板的建立STM32学习之旅 从点灯到代码移植STM32学习之旅 USART串口和上位机通信STM32学习之旅 SPI控制TFT xff0
  • STM32-F407入门学习专题(五) STM32外设之DMA

    目录 1 DMA 2 DMA功能框图 2 1 外设通道选择 2 2 仲裁器 2 3 FIFO 2 4存储器端口 外设端口 3 DMA传输配置 1 DMA DMA xff08 Direct Memory Access xff09 xff0c
  • Linux修改用户名主机名

    首先修改主机名 george 64 George JI sudo vi etc hostname sudo password for george Daiver 修改hosts文件 george 64 George JI sudo vi e
  • SVO2安装,编译和运行q

    一 编译环境配置及安装 github address GitHub uzh rpg rpg svo pro open SVO2是在SVO的基础上的升级版 xff0c 其与SVO的不同在于 xff1a 1 SVO2 0支持透视 xff0c 鱼
  • 【统计学】Q1、Median、Q3含义

    五数概括法 xff08 Five number Summary xff09 是一种对数据离散程度的描述方法 1 Min xff1a 最小值 xff1b 2 Q1 xff1a 第一四分位数 xff08 又称 xff1a 下四分位数 xff0c
  • 【Android安全】Android app开发者证书和代码签名机制

    参考链接 xff1a 安卓证书相关验证机制 xff1a https duanqz github io 2017 09 01 Android Digital Signature xff08 部分内容不准确 xff09 关于META INF文件
  • 【Android安全】IDA 处理伪代码JUMPOUT指令(Undefine + Create Function)

    IDA 处理伪代码JUMPOUT指令 函数被IDA错误合并 IDA分析so时 xff0c 可能会遇到反编译结果不准确的情况 xff0c 如下 xff1a 这里的两个JUMPOUT其实解析有问题 xff0c 如下 xff1a 例如loc 18
  • 【Android安全】小米8刷机、救砖、root教程

    线刷 xff1a 通过计算机上的刷机软件把ROM 通过数据线传输 并安装到手机内存中 ROM包以tgz为后缀 卡刷 xff1a 把所需要的ROM下载或者复制到内存 SD卡根目录中 小米8救砖教程 xff08 线刷 xff09 按照https
  • 【Android抓包】Ubuntu mitmProxy配置

    Ubuntu 安装 mitmProxy 直接使用编译好的二进制包 参考 xff1a https cuiqingcai com 31053 html Linux E4 B8 8B E7 9A 84 E5 AE 89 E8 A3 85 直接下载
  • 【CSDN】查看自己的CSDN积分

    查看自己的CSDN积分 如何查看自己的CSDN博客积分 CSDN藏的比较深 xff0c 链接如下 xff1a https mp csdn net mp blog analysis article all CSDN博客积分与博客等级 参考 x

随机推荐

  • 【符号输入】打出撇号′

    打出撇号 撇号 xff08 apostrophe xff09 xff1a 搜狗输入法调成中文 xff0c 输入fen xff0c 第5个就是撇号
  • 【Android安全】xiaomi手机关闭adb安装应用时的确认提示

    xiaomi手机关闭adb安装应用时的确认提示 为了自动化测试 xff0c 需要关闭adb安装应用时的确认提示 需要分两步来关闭 xff1a 首先 xff0c 开发者选项 gt 启动MIUI优化 gt 关闭 xff08 第一步过后授权管理
  • 【python】报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte in position : illegal multibyte

    python读文件时报错 xff1a Traceback span class token punctuation span most recent call last span class token punctuation span F
  • STM32介绍

    目录 STM32 分类 STM8 和 STM32 分类 STM32 命名方法 STM32F103RCT6 寻找 IO 的功能 存储器映射 存储器 Block0 内部区域功能划分 存储器 Block1 内部区域功能划分 存储器 Block2
  • Putty串口打开无反应

    第一次使用putty的串口 xff0c 可能理所当然认为在Serial那里设置好参数 xff0c 然后点击Open就行了 但是显然不是 xff0c Putty的UI设计有问题 xff0c 不管你点击哪一个项 xff0c Open按钮始终都存
  • 【Android安全】r0capture使用

    r0capture使用 下载地址 xff1a https github com r0ysue r0capture 手机端启动frida server PC端安装frida client 命令 xff1a python r0capture s
  • MobaXterm或Xshell连接不上虚拟机ubuntu

    MobaXterm使用教程 xff1a MobaXterm官网下载 MobaXterm使用教程1 MobaXterm使用教程2 Xshell 使用教程 xff1a 恒源云远程登录Linux实例 包含下载地址和使用教程 Xshell使用教程
  • 591 标签验证器(模拟、栈匹配括号)

    1 问题描述 xff1a 给定一个表示代码片段的字符串 xff0c 你需要实现一个验证器来解析这段代码 xff0c 并返回它是否合法 合法的代码片段需要遵守以下的所有规则 xff1a 代码必须被合法的闭合标签包围 否则 xff0c 代码是无
  • 算法:最长公共子序列

    10 8算法实验报告 最长公共子序列 题目 输出两个字符串的最长公共子序列 要求1 不使用辅助数组 span class token comment 要求1 xff1a 不使用辅助数组 span span class token keywo
  • 呆呆和你谈谈入职CVTE一个月的感受

    呆呆和你谈谈入职CVTE一个月的感受 你盼世界 xff0c 我盼望你无bug Hello 大家好 xff01 我是霖呆呆 xff01 啊啊啊啊啊 至6 18日入职新公司CVTE已经一个多月了 xff0c 在 你盼世界 xff0c 我盼望你无
  • 编程就是调用API?如何成为造轮子的程序员

    是 xff0c 编程就是调用各种API 什么是API xff0c 就是别人把较复杂的代码封装成一个个函数 xff0c 你不用管函数怎么实现的 xff0c 直接用就好 从这个角度讲 xff0c 使用所有库 xff0c 框架 xff0c 模板
  • 【电赛】2019电子设计竞赛 纸张计数显示装置(F题)

    点击 Github项目地址 设计下载 内含 xff1a 电赛论文 程序设计 机械结构设计 硬件电路设计 综合测评相关设计 交互显示设计 设计详细说明 2019年全国大学生电子设计竞赛 纸张计数显示装置 xff08 F题 xff09 本科组
  • 【ARM裸板】LCD硬件原理、时序及初始化

    文章目录 1 LCD与OLED的区别2 LCD原理2 1 颜色如何确定 xff1f 2 2 LCD如何 行扫描 xff1f 2 3 如何跳到下一行进行 行扫描 xff1f 2 4 如何进行下一个 场扫描 xff1f 3 LCD时序4 LCD
  • 【电赛】2019电赛纸张计数显示装置Github仓库说明

    Github项目地址 设计下载 内含 xff1a 电赛论文 程序设计 机械结构设计 硬件电路设计 综合测评相关设计 交互显示设计 设计详细说明 纸张计数显示装置Github仓库说明 x1f604 个人主页 x1f57a 电赛论文 x1f4d
  • 【Linux】mjpg-streamer 源码分析

    文章目录 1 总体流程2 主进程的源码分析2 1 参数接收与解析2 2 获取参数2 3 调用输入函数2 3 1 程序手动中断信号2 3 2 strchr 函数2 3 3 strndup 函数2 3 4 分离参数 3 输入通道源码分析3 1
  • STM32之TIM 舵机控制PWM

    目录 大概步骤 定时器介绍 输入通道 输入滤波器和边沿检测器 捕获通道 定时器初始化结构体详解 1 TIM TimeBaseInitTypeDef 定时器基本初始化结构体 TIM OCInitTypeDef 定时器比较输出初始化结构体 3
  • 【树莓派】树莓派采用MJPG-Streamer双摄推流至上位机,实测延时低至200ms[CSI摄像头+USB摄像头]

    树莓派采用MJPG Streamer双摄推流至上位机 实测延时低至200ms CSI摄像头 43 USB摄像头 总体流程1 硬件连接与软件及驱动配置1 xff09 检测是否存在USB摄像头设备2 xff09 安装 MJPG Streamer
  • 【DIY】基于OpenMV的STM32追球小车

    目录 xff1a 总体设计1 基础硬件DIY设计1 xff09 整体原理图2 xff09 PCB电路 2 OpenMV简单识别程序设计 与 STM32控制程序设计1 xff09 OpenMV简单识别程序设计 microPython 2 xf
  • 【电赛】2017年电赛A题——三相逆变电源EG8030测试

    目录 xff1a 一 相关简介二 专用逆变芯片E8030控制板三 驱动板四 实物测试 xff1a Github项目地址 设计下载 注 xff1a 本文仅用于学习交流分享 xff0c 若有不妥之处 xff0c 请指正 xff0c 感谢 关键词
  • 【STM32】STM32 OLED打点划线画圆 OLED电子罗盘 程序

    目录 xff1a 一 画点函数二 动态划线效果演示 xff1a 三 画圆函数效果演示 四 实心圆函数 注 xff1a 本文仅用于学习分享 用到的工具 xff1a STM32 MCU Keil 5 用到的库函数为 正点原子 STM32F4 库