温锦文欧普厨电及净水器总代理 发表于 2022-6-23 21:36:46

OLED显示曲线

大家好,我是程序员小哈。
问题由来

前两天有网友留言,能否做一个显示波形的实例,之前也有人提过类似问题,那么今天我们就来安排一下。
https://img-blog.csdnimg.cn/9e71e86fe3f8491e9a01ea0f6d30b791.png
问题分析

我们在网上经常能看到一些大佬用0.96寸OLED制作的迷你示波器。
https://img-blog.csdnimg.cn/db52f794c6a64398ae07ab155e2c0198.png
制作这个mini示波器,界面中的曲线绘制是一个难点。
小哈哥的主要工作是做上位机VC++开发的,由于要做谱图显示,所以也用到了曲线的绘制,下图中就是使用VC++进行曲线绘制的部分代码,我们可以看出,曲线是由一系列首尾相连的直线组成,所以要想绘制曲线,首先要实现移动到线条起点的函数MoveTo,以及实现画线的函数LineTo。
https://img-blog.csdnimg.cn/cde768d088ae490d80a941c72cc13527.png
因为直线(其实说成线段更好)是由多个点组成,所以我们要实现画线的函数,只要实现画点的函数即可,然后在计算出来的位置依次画点,即可实现直线的绘制。
实现目标



[*]实现画点函数
[*]封装画点函数,进而实现画线函数
[*]绘制一个三角形
显示原理

OLED的核心驱动芯片是SSD1306,单片机与SSD1306通信,SSD1306再驱动OLED点亮对应的OLED像素点。
要想实现绘制三角形,我们就要先实现画点和绘制直线的函数,在这之前,我们先了解一下OLED的显示原理。
OLED的构造

OLED由128*64个像素组成,64行和128列。
https://img-blog.csdnimg.cn/7720aa5d5095416783a584b1f40bff3a.png
图中每个晶格表示一位图像数据,这些像素点对应SSD1306内部的一个GDDRAM数据内存,它有128*8字节,即128*64bit,每一个位对应一个像素点。
其中,每8行组成一个PAGE,该OLED一共分为8个PAGE(PAGE0~PAGE7)。
https://img-blog.csdnimg.cn/d9aa297bbeb54d9988ed5383dc230cb7.png
我们控制显示的内容,只需要控制SSD1306的内部GDDRAM即可。下面是封装的刷新GDDRAM的函数,其中 unsigned char OLED_GRAM; 中缓存的就是待显示的内容,我们先将要显示的内容赋值给这个数组,然后将这个数组整体写入GDDRAM即可,如果这个数组内的数据都为0,则相当于将显示屏清屏(不显示内容)。
void OLED_Refresh_Gram(void){    unsigned char i,n;    for(i=0;i63) return;            // 因为此OLED是按页显示,每页8个像素,所以/8用于计算待显示的点在哪页中        pos=(y)/8;            // 一列中有8个像素,所以计算一下待显示的点,在当前列中的第几个点        bx=y%8;            // 移位,让temp的第bx位为1        temp=10)                incx=1;        else if(offset_x==0)                incx=0;                                //垂直线        else         {                incx=-1;                offset_x=-offset_x;        }                if(offset_y>0)                incy=1;        else if(offset_y==0)                incy=0;                                //水平线        else        {                incy=-1;                offset_y=-offset_y;        }        if(incx==0)        {                for(t=0;t
页: [1]
查看完整版本: OLED显示曲线