因为在网上没有找到完整的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采集时,可以将采集到的数据存入数组中,调用函数显示波形。文章来源:https://www.toymoban.com/news/detail-512540.html
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.git文章来源地址https://www.toymoban.com/news/detail-512540.html
到了这里,关于OLED显示图像和波形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!