OLED显示图像和波形

本文介绍了一段用于在OLED屏幕上显示波形的C语言代码,作者通过自定义函数实现了从数学表达式生成波形图像的功能。代码包括了如何设置OLED的初始状态、坐标转换和数据写入等步骤。虽然没有坐标轴,但可以显示sin(x)函数的图形。此外,还提供了一个函数用于显示AD采集的数据波形。文章中详细解释了代码逻辑,并给出了如何根据采集数据调整显示的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为在网上没有找到完整的OLED显示波形的代码,所以自己写了一个,不过完整的驱动OLED显示数字字母代码很多。于是我在别人写好的代码下面加了显示波形的函数,但是显示波形和显示字母数字并不算兼容,因为原点设置的不一样。

这里也只展示了部分代码,OLED初始化的代码很多,将下面两个函数添加到.c文件,再调用即可。

void function_1(void)			
{
	unsigned char i;		
	unsigned char j;		
	unsigned int y;
	unsigned char a[8][8];
	unsigned char temp=0x01;
	unsigned char line=0;
	unsigned char column=0;
	OLED_WriteCommand(0xC0);				//上下反置,把原点设置在左下
	for(column=0;column<128;column+=8)
	{
		for(i=0;i<8;i++)
		{
			//y=(i+column)*(i+column)/100;    //显示y=x*x(x=i+column),x取0,1,2,3....127,表达式除100可以算成Y轴扩大100倍,显示的图形更好看
			y=sin((i+column)/3.14)*15+18;	//y=sin(x),加18相当于向上平移,对x除3.14相当于缩小X轴
			for(j=0;j<8;j++)
			{
				if(j==y/8)
				{
					if(y<8)
					{
						a[j][i]|=temp<<y;
					}
					else
					if(7<y<63)
					{
						a[j][i]|=temp<<(y-(y/8)*8);
					}
					else
					if(y>63)
					{
						a[j][i]=0x00;
					}
				}
				else
				{
					a[j][i]=0x00;
				}
			}
		}
		for(line=0;line<8;line++)
		{
			OLED_SetCursor(line,column);
			for(i=0;i<8;i++)
			{
				OLED_WriteData(a[line][i]);
			}
		}	
}
}

上面的代码是显示一个函数,给y一个数学表达式,在OLED上显示波形。

 上面我给的表达式是y=sinx, 显示的图像如上所示,不过上面代码显示是没有坐标轴的。

 图画的不是很好,意思一下。上面这个图是宏观的,整个OLED的像素点(后面没有画完),OLED的像素是128*64。我用的是描点显示波形,横坐标从0到127,纵坐标从0到63。如图所示,将OLED分成了很多块(这个块不是随便分的),将纵轴分成了八份,每一份有八位,把x轴分成了16份,每一份也是八位。要点亮某一个点,不能单独赋值,只能按块赋值,例如(0,1),(0,2)。0是熄灭,1是点亮。

 这是微观的一块,以这一块为例。我先给x值为0,根据表达式会得到一个y值,如果y为0,那这x=0的这一列我只把y=0这一个点亮(上面还有7快),这整列从上到下赋值为0x00,0x00,0x00,0x00,0x00,0x00,0x01,并把它存在数组中,这里可以看出a[8][8]存的数组就是x在0到7取值范围内,给y的值,例如a[0],这一行的值就是上面这一块的赋值,a[0][0]就是x=0时,我给这一块这一列的值0x01。这里我们可以发现一个规律,当y=1时,赋值为0x02,当y=2,赋值为0x04,y每加一,1就左移一位,所以上面赋值我用的移位,应该不难看懂。当x=0,y大于7,小于15的时候,应该在上面那一块显示,这里我给y值为14,这时从上到下赋值应为0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00。这时我应该把0x40给a[1][0]。怎么把这个值就给a[1][0],而不是a[0][0]了,可以看一下我上面的,应该很容易理解,这里就不在详细说明了。

void function_2(float*str)			
{
	unsigned char i;		
	unsigned char j;		
	unsigned int y;
	unsigned char a[8][8];
	unsigned char temp=0x01;
	unsigned char line=0;
	unsigned char column=0;
	OLED_WriteCommand(0xC0);			
	for(column=0;column<128;column+=8)
	{
		for(i=0;i<8;i++)
		{
			y=*(i+column+str);
			for(j=0;j<8;j++)
			{
				if(j==y/8)
				{
					if(y<8)
					{
						a[j][i]|=temp<<y;
					}
					else
					if(7<y<63)
					{
						a[j][i]|=temp<<(y-(y/8)*8);
					}
					else
					if(y>63)
					{
						a[j][i]=0x00;
					}
				}
				else
				{
					a[j][i]=0x00;
				}
			}
		}
		for(line=0;line<8;line++)
		{
			OLED_SetCursor(line,column);
			for(i=0;i<8;i++)
			{
				OLED_WriteData(a[line][i]);
			}
		}	
}
}

这个函数,比如在AD采集时,可以将采集到的数据存入数组中,调用函数显示波形。

void OLED_SetCursor(uint8_t Y, uint8_t X)
{
	OLED_WriteCommand(0xB0 | Y);					//设置Y位置
	OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置低4位
	OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置高4位
}

代码地址:https://gitee.com/cara23456/oled

oled: stm32f103 oled显示波形源码

要在1.3寸IIC通信OLED上绘制波形,可以按照以下步骤进行: 1. 初始化OLED屏幕,设置其分辨率IIC通信地址。 2. 创建一个缓冲区,在其中绘制波形数据。可以选择使用C语言中的数组或指针来存储波形数据。 3. 将缓冲区中的波形数据转换为屏幕像素坐标,并在屏幕上绘制波形。可以使用C语言中的for循环来遍历波形数据,并使用OLED屏幕的API函数来绘制像素。 4. 在需要更新波形时,清空缓冲区并重新绘制波形数据。 以下是一个示例代码,演示了如何在1.3寸IIC通信OLED上绘制正弦波: ```c #include <stdio.h> #include <math.h> #include "oled.h" #define PI 3.1415926 // 初始化OLED屏幕 void oled_init() { // 设置OLED屏幕的分辨率IIC通信地址 // ... } // 绘制正弦波 void draw_sine_wave() { int n, x, y; float angle, sin_value; int buffer[128]; // 清空缓冲区 for (n = 0; n < 128; n++) { buffer[n] = 0; } // 生正弦波数据 for (n = 0; n < 128; n++) { angle = (float)n / 128.0 * 2 * PI; sin_value = sin(angle); buffer[n] = (int)(sin_value * 20 + 20); // 将正弦波数据转换为像素坐标 } // 绘制正弦波 for (n = 0; n < 127; n++) { x = n; y = buffer[n]; oled_draw_pixel(x, y, 1); x = n + 1; y = buffer[n + 1]; oled_draw_line(n, buffer[n], x, y, 1); } } int main() { oled_init(); while (1) { draw_sine_wave(); // 等待一段时间后清空屏幕并重新绘制波形 // ... } return 0; } ``` 需要注意的是,以上代码仅为示例,实际应用中还需要根据具体需求进行修改。
评论 172
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值