目录:

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

注: 本文仅用于学习分享

用到的工具

  • 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] < 0if( (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] < 0if(((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/3OLED_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();//更新显示到OLEDrt_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();//更新显示到OLEDslope = tan((float)(JY901.Angle[2]*Pi/180));  //转化弧度制 解算东北天坐标系下 航向斜率slopefor(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]); //横滚脚RollOLED_ShowString(65,0, (u8 *)str,12);sprintf(str,"Pit:%3.1f  ",JY901.Angle[1]); //俯仰角PitchOLED_ShowString(65,16, (u8 *)str,12);sprintf(str,"Yaw:%3.1f  ",JY901.Angle[2]); //俯仰角YawOLED_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】STM32 OLED打点划线画圆 OLED电子罗盘 程序相关推荐

  1. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  2. 基于STM32单片机的智能手环设计(OLED显示)(Proteus仿真+程序+报告)

    编号8 基于STM32单片机的智能手环设计(OLED显示) 功能描述: 由 STM32单片机+按键模拟计步+RTC时钟模块+DS18B20温度传感器模块+心率采集模块+串口模块+OLED显示模块+键盘 ...

  3. stm32学习记录之0.96寸OLED显示屏配置

    目录 0.96寸oled屏概述 工程实现 GPIO初始化 SSD1306 初始化 启动与停止函数 各个功能函数 0.96寸oled屏概述 本次实验所用oled显示屏为黄蓝屏,即屏上1/4 部分为黄光, ...

  4. stm32使用自定义打点函数方式移植stemwin

    stm32使用自定义打点函数方式移植stemwin 背景 显示过程 移植简述 打点函数 stemwin移植要点 实物效果 背景 oled屏移植stemwin,有两种方式,通过自定义打点方式进行移植,或 ...

  5. 【玩转嵌入式屏幕显示】(三)TFT-LCD屏幕打点 + 画线 + 画矩形 + 画圆Bresenham算法实现(基于打点函数,算法可移植到任何屏幕的驱动程序之上)

    0. 引言 TFT-LCD屏幕的画直线.画斜线.画矩形.画圆等算法都是基于打点函数的,所以此程序可以移植到任何屏幕的基本驱动程序之上. 1. 打点函数 -- 底层函数(移植需修改) 打点函数其实就是屏 ...

  6. html画圆圈原理,HTML5如何划线和画圆

    本篇教程探讨了HTML5如何划线和画圆,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 划圆 Canvas 渐变 图像 本文由职坐标整理并发布,希望对同学们有 ...

  7. 用python的turtle画圆-(python海龟绘图怎么增加每次画圆的半径)

    Python 如何调用graphics库画圆弧,半圆等 import turtle turtle.left(135) turtle.circle(120,90) turtle.done() pytho ...

  8. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法

    在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...

  9. 5.前端CSS之基本属性(长宽,字体,文体,背景图片,阴影,border画圆,display)

    1.块儿标签长宽height,width块儿标签可以设置长宽,设置长宽后依然独占一行 h1-h6,p,div行内标签无法设置长宽 写了 也不会生效 i,u,s,b span2.字体样式:font-fa ...

最新文章

  1. JavaScript 事件冒泡简介及应用(转)
  2. 类加载器双亲委派模式
  3. xgboost算法_陈天奇做的XGBoost为什么能横扫机器学习竞赛平台?
  4. Python Web部署方式总结
  5. 笔记-高项案例题-2018年下-范围管理
  6. 用Eclipse进行C/C++开发
  7. Qt工作笔记-通过 对象树 或 delete this 释放对象
  8. CVPR 2019 论文大盘点-人脸技术篇
  9. linux nginx 配置优化,nginx 配置优化指令
  10. cad2010多个文件并排显示_飞利浦显示器推荐,提升你的工作效率与水平
  11. LLVM每日谈之一 LLVM是什么
  12. Mac支持NTFS两款软件
  13. vue echarts div变化_数据可视化之echarts在Vue中的使用
  14. 手机网站前端开发经验总结
  15. OpenOffice.org 2.0已经发布了。
  16. Java中四大代码块的执行顺序(附code)
  17. VS2017安装方法
  18. 年终工作总结汇报和述职报告ppt模板,内含范文可参考,精选20套可下载
  19. python对文件进行zip和rar格式的压缩和解压缩(亲测,可用)
  20. java severs_openssl简介-指令s_server

热门文章

  1. [Python] Python 获取中文的首字母 和 全部拼音首字母
  2. 拥有一台服务器能干些什么呢
  3. 第十三届蓝桥杯大赛软件赛省赛(Java 大学B组)
  4. 驾驶证上的照片有具体要求吗?这几点需要注意
  5. html5仿mac商城css,html5+javascript+css商城(模拟联想)购物系统
  6. 今天收留了一条流浪的小狗
  7. 计算机天才陈立杰:16岁拒上清华,婉拒谷歌,网瘾少年如何逆袭?
  8. 如何使用万能地图下载器下载矢量路网
  9. 数据库设计(表与表之间的3种关系)
  10. Mac说——关闭SIP