【STM32标准库】【自制库】0.96寸OLED显示屏(SSD1306)(6) 指定圆心和半径画圆

21 篇文章 10 订阅
8 篇文章 2 订阅


文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。
本文章基于此系列和开发板展开讨论。

本系列以SSD1306为主控芯片的I2C接口的0.96寸OLED屏幕为例介绍
内容较多,分节进行

链接

基础命令和寻址方法
IIC(I2C)协议

  1. OLED初始化,软件I2C实现,基础数据发送
  2. 满屏图像显示
  3. 全屏动画显示
  4. 显示字母和数字,汉字
  5. 画指定的点
  6. 指定两点画线段
  7. 指定圆心和半径画圆
  8. 指定圆心半径角度画圆弧

需求分析

指定圆心位置,半径,宽度画出完整的圆

  1. 确定扫描范围
  2. 进行扫描

圆的基础知识

在平面内,圆是到定点的距离等于定长的点的集合叫做圆

方程是(x-a)+(y-b)=r
这也就是我们的做选择的基础

确定扫描范围

在这里插入图片描述
在图中已经将关键点标出来了

我们只需要在左右顶点之间扫描列在上下顶点之间扫描页即可

	X_Left = X - R - Width - 1;
	X_Right = X + R + Width + 1;
	Y_Up = (Y - R) / 8 - 1;
	Y_Down = (Y + R) / 8 + 1;

这就是计算扫描范围的式子

扫描

这部分只需要扫描整个范围即可,在计算范围时已经包围全部范围进去了

	for (int y = Y_Up; y < Y_Down; y++) //扫描页
	{
		for (int x = X_Left; x < X_Right; x++) //扫描列
		{
			Circular_Zj = 0;
			for (int z = 0; z < 8; z++) //页内的led
			{
				Circular_Zj >>= 1;
				if (Solid == DISABLE) //空心圆
				{
					if (OLED_Abs(powf(x - X, 2) + powf((y * 8 + z) - Y, 2) - powf(R, 2)) < powf(Width, 2))
					{
						Circular_Zj |= 0x80;
					}
				}
				else if (Solid == ENABLE) //实心圆
				{
					if ((powf(x - X, 2) + powf((y * 8 + z) - Y, 2)) < (powf(R, 2) + powf(Width, 2)))
					{
						Circular_Zj |= 0x80;
					}
				}
			}
			OLED_Buffer[y][x] |= Circular_Zj;
		}
	}

powf是头文件"arm_math.h"里的函数,作用是算次方

空心圆判断条件OLED_Abs(powf(x - X, 2) + powf((y * 8 + z) - Y, 2) - powf(R, 2)) < powf(Width, 2)因为扫描的时候是平方进行的,因此我们将宽度(Width)平方,避免其数值过大

实心圆(powf(x - X, 2) + powf((y * 8 + z) - Y, 2)) < (powf(R, 2) + powf(Width, 2))同样将宽度平方,只需要扫描小于最外边界的即可

函数

c文件(OLED.C)

//画圆 输入横纵坐标,半径和粗细
void OLED_Circular(int X, int Y, int R, int Width, FunctionalState Solid)
{
	int X_Left, X_Right, Y_Up, Y_Down;
	u8 Circular_Zj;
	X_Left = X - R - Width - 1;
	X_Right = X + R + Width + 1;
	Y_Up = (Y - R) / 8 - 1;
	Y_Down = (Y + R) / 8 + 1;
	OLED_CandA_LimMaxMin(&X_Left, &X_Right, &Y_Up, &Y_Down);
	for (int y = Y_Up; y < Y_Down; y++) //扫描页
	{
		for (int x = X_Left; x < X_Right; x++) //扫描列
		{
			Circular_Zj = 0;
			for (int z = 0; z < 8; z++) //页内的led
			{
				Circular_Zj >>= 1;
				if (Solid == DISABLE) //空心圆
				{
					if (OLED_Abs(powf(x - X, 2) + powf((y * 8 + z) - Y, 2) - powf(R, 2)) < powf(Width, 2))
					{
						Circular_Zj |= 0x80;
					}
				}
				else if (Solid == ENABLE) //实心圆
				{
					if ((powf(x - X, 2) + powf((y * 8 + z) - Y, 2)) < (powf(R, 2) + powf(Width, 2)))
					{
						Circular_Zj |= 0x80;
					}
				}
			}
			OLED_Buffer[y][x] |= Circular_Zj;
		}
	}
	OLED_Full_Picture(OLED_Buffer);
}
//画圆和圆弧用 限制最大最小值
void OLED_CandA_LimMaxMin(int *X_Left, int *X_Right, int *Y_Up, int *Y_Down)
{
	OLED_LimMin(X_Left, 0);
	OLED_LimMin(Y_Up, 0);
	OLED_LimMax(X_Right, 127);
	OLED_LimMax(Y_Down, 63);
}

OLED_LimMinOLED_LimMax在之前文章中给出过了,传送门,作用使输入的数不能超过范围

成品

在这里插入图片描述

CSDN

链接:百度网盘
提取码:ierk

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32是STMicroelectronics公司推出的一款32位微控制器系列产品,具有高性能、低功耗和丰富的外设功能。而LCD2004是一种常见的字符型液晶显示器,由20列4行的字符组成,能够显示20个字符。在STM32中,可以通过GPIO口或者专用的LCD控制器来驱动LCD2004。 要驱动LCD2004,首先需要连接STM32与LCD2004。可以使用8位的数据线连接STM32的GPIO口与LCD2004的D0~D7引脚,还需要将STM32的几个GPIO口连接到LCD2004的控制引脚:RS连接到使能引脚,RW连接到读写引脚,E连接到时钟引脚。同时,还需要给LCD2004供电。 接下来,需要编写相关的代码来控制STM32与LCD2004的通信。可以使用STM32提供的GPIO函数来控制GPIO口的状态,例如设置输入输出模式和电平状态。需要根据LCD2004的驱动原理书写相应的代码,例如发送指令和数据到LCD2004。可以使用延时函数来控制读写操作的时间。 在代码中,可以定义一些常用的指令,例如清屏、光标复位、设置光标位置等。可以使用这些指令来控制LCD2004的显示效果。在STM32中,还可以通过中断来实现LCD2004的刷新,提高显示的效率。 使用STM32驱动LCD2004可以实现各种功能,例如显示字符、数字、图标等。还可以根据需要设计自定义字符,并通过代码加载到LCD2004中。LCD2004可以应用于各种场景,例如嵌入式系统的人机交互界面、智能家居设备的显示、工控设备的显示等。 总之,STM32 LCD2004的组合可以实现高性能的微控制器与大容量的字符型液晶显示器的完美结合,广泛应用于各种领域。 ### 回答2: STM32 LCD2004是一种常见的液晶显示模块,适用于STM32系列单片机。它由2004个像素点排列而成,可以显示2行16个字符。这种液晶模块一般由液晶屏、驱动电路、背光源等部分组成,并且使用了STM32单片机作为控制器。具有以下特点: 1. 显示效果:LCD2004具有高分辨率和明亮度,能够清晰地显示字符和图形。通过控制单片机脚脚来控制液晶显示内容。 2. 硬件设计:该模块采用了标准的I2C通讯接口,使得与STM32单片机的通信更加简单方便。同时,它还有背光源控制接口,可以通过单片机控制背光的亮度和关闭。 3. 软件开发:STM32单片机支持多种编程语言,如C和C++,可以方便地编写液晶显示的控制程序。开发人员可以利用软件函数来实现字符和图形的显示。 4. 应用领域:STM32 LCD2004广泛应用于各种嵌入式系统中,比如智能家居、工控设备、医疗仪器等。它能够在有限的显示区域内显示有用的信息,增强产品的用户体验和交互性。 总之,STM32 LCD2004是一种高性能的液晶显示模块,适用于STM32单片机,并且在嵌入式系统中有着广泛的应用。它通过控制单片机脚脚来显示字符和图形,具有高分辨率、明亮度高等特点,是开发人员在项目中常用的显示设备之一。 ### 回答3: STM32 LCD2004是指一种基于STM32微控制器的LCD显示模块。它采用了2004型号的液晶显示屏,具有20个字符每行,4行的显示区域。该模块可以通过I2C总线与STM32微控制器进行通信,以实现显示文本和图形等功能。 STM32是意法半导体公司开发的一款32位ARM Cortex-M系列微控制器。它具有低功耗、高性能和丰富的外设资源等特点,被广泛应用于各种嵌入式系统中。STM32微控制器可以通过GPIO口和I2C总线等接口来与外部模块进行通信和控制。 LCD2004模块是一款常见的字符型液晶显示模块,它能够以可视化的方式显示文字、数字、符号和简单图形。该模块通过控制液晶屏上的像素点来实现显示效果,并通过I2C总线与STM32微控制器进行通信。用户可以通过编程控制STM32来实现对LCD2004模块的显示内容、亮度和对比度等参数的调节。 使用STM32 LCD2004模块,可以方便地在嵌入式系统中实现文本和图形的显示功能。用户可以使用STM32开发环境的函数或者自编的驱动程序,通过控制LCD2004模块的接口,实现各种显示效果。在实际应用中,可以利用该模块实现系统状态显示、消息提示、数据监控等功能,提高系统的可视化程度和用户体验。 综上所述,STM32 LCD2004是一种基于STM32微控制器的LCD显示模块。它具有丰富的显示功能和易于使用的接口,可以方便地在嵌入式系统中实现文本和图形的显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值