OLED显示器实现图像和波形显示的方法详解

因为在网上没有找到完整的OLED显示波形的代码,所以自己写了一个,但是在网上居然都没找到详细的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位
}

物联沃分享整理
物联沃-IOTWORD物联网 » OLED显示器实现图像和波形显示的方法详解

发表评论