OLED显示曲线

这篇具有很好参考价值的文章主要介绍了OLED显示曲线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我是程序员小哈。

问题由来

前两天有网友留言,能否做一个显示波形的实例,之前也有人提过类似问题,那么今天我们就来安排一下。

OLED显示曲线

问题分析

我们在网上经常能看到一些大佬用0.96寸OLED制作的迷你示波器。

OLED显示曲线

制作这个mini示波器,界面中的曲线绘制是一个难点。

小哈哥的主要工作是做上位机VC++开发的,由于要做谱图显示,所以也用到了曲线的绘制,下图中就是使用VC++进行曲线绘制的部分代码,我们可以看出,曲线是由一系列首尾相连的直线组成,所以要想绘制曲线,首先要实现移动到线条起点的函数MoveTo,以及实现画线的函数LineTo

OLED显示曲线

因为直线(其实说成线段更好)是由多个点组成,所以我们要实现画线的函数,只要实现画点的函数即可,然后在计算出来的位置依次画点,即可实现直线的绘制。

实现目标

  • 实现画点函数
  • 封装画点函数,进而实现画线函数
  • 绘制一个三角形

显示原理

OLED的核心驱动芯片是SSD1306,单片机与SSD1306通信,SSD1306再驱动OLED点亮对应的OLED像素点。

要想实现绘制三角形,我们就要先实现画点绘制直线的函数,在这之前,我们先了解一下OLED的显示原理。

OLED的构造

OLED由128*64个像素组成,64行和128列。

OLED显示曲线

图中每个晶格表示一位图像数据,这些像素点对应SSD1306内部的一个GDDRAM数据内存,它有128*8字节,即128*64bit,每一个位对应一个像素点。

其中,每8行组成一个PAGE,该OLED一共分为8个PAGE(PAGE0~PAGE7)。

OLED显示曲线

我们控制显示的内容,只需要控制SSD1306的内部GDDRAM即可。下面是封装的刷新GDDRAM的函数,其中 unsigned char OLED_GRAM[128][8]; 中缓存的就是待显示的内容,我们先将要显示的内容赋值给这个数组,然后将这个数组整体写入GDDRAM即可,如果这个数组内的数据都为0,则相当于将显示屏清屏(不显示内容)。

void OLED_Refresh_Gram(void)
{
    unsigned char i,n;
    for(i=0;i<8;i++)
    {
        OLED_WR_Byte(0xb0+i,OLED_CMD);  //设置页地址(0~7)
        OLED_WR_Byte(0x00,OLED_CMD);    //设置显示位置—列低地址
        OLED_WR_Byte(0x10,OLED_CMD);    //设置显示位置—列高地址  
         
        for(n=0;n<128;n++)  //写一PAGE的GDDRAM数据
        {
            OLED_WR_Byte(OLED_GRAM[n][i],1);
        }
    }
}

画点函数

由于 OLED_WR_Byte(OLED_GRAM[n][i],1); 函数一次操作一个字节,所以我们不能一次控制一个像素点,只能8个像素点一起控制;而且是垂直方向扫描控制;如下图所示。因此垂直方向坐标可选为0~7;(8*8=64);水平方向可选坐标0~127。

OLED显示曲线

我们封装的画点函数,即随便给一个点的坐标(x,y),我们要计算出,这个像素点所属的PAGE,然后看控制的是这列8个像素(对应一个字节数据)中的哪一个(对应1 bit数据)。

void OLED_DrawDot(unsigned char x,unsigned char y,unsigned char t)
{
	unsigned char pos,bx,temp=0;
    
	// 此OLED的分辨率为128*64,横坐标大于127,纵坐标大于63,则参数非法	
    
	if(x>127||y>63) return;
    
	// 因为此OLED是按页显示,每页8个像素,所以/8用于计算待显示的点在哪页中
	pos=(y)/8;
    
	// 一列中有8个像素,所以计算一下待显示的点,在当前列中的第几个点
	bx=y%8;
    
	// 移位,让temp的第bx位为1
	temp=1<<(bx);
    
	if(t) 
		OLED_GRAM[x][pos]|=temp;		//第bx位,置1,其他位值不变
	else 
		OLED_GRAM[x][pos]&=~temp;		//第bx位,置0,其他位值不变
        
	// 刷新整个液晶屏
	OLED_Refresh_Gram();	
}

参数说明:

  • x:显示的横坐标,即一行128个像素中的哪一个像素点
  • y:显示的纵坐标,即一列64个像素中的哪一个像素点
  • t:0表示该像素不显示,1表示该像素显示

画线函数

画点的函数我们已经实现了,那么要想画一条直线,我们就要计算出直线上都有哪些点,将直线上的点依次用画点函数绘制出来,即完成了直线的绘制。

那怎么来求得直线上的任意点的坐标呢?如下图所示,一般绘制一个直线都会给两个已知点(x1,y1),(x2,y2),有了这两个点的坐标,我们就可以求出这条直线的斜率,然后根据这个斜率和横轴的范围(x1,x2),依次代入直线方程,即可求出所有直线上的点的坐标。

OLED显示曲线

我们举个栗子,加深一下理解:

如果(x1=32,y1=48),(x2=96,y2=16),那么:

曲线斜率: K =(16-48)/(96-32)= -0.5
==>该曲线上任意点坐标关系为: y = 48+K*(x – 32)

如果x=64,
因为 K=-0.5,所以 y=48-0.5*(64-32)=32 。

所以,(x=64,y=32)。

利用斜率法,我们封装画线函数如下:

void OLED_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2,unsigned int y2)
{
	unsigned int t; 
	int offset_x,offset_y; 
	int incx,incy,uRow,uCol; 
	float K = 0.0f;
	offset_x=x2-x1;
	offset_y=y2-y1; 
	uRow=x1; 
	uCol=y1; 
	if(offset_x>0)
		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<=offset_y+1;t++ )
		{ 
			OLED_DrawDot(uRow,uCol+t*incy,1);
		}
	}
	else if(incy==0)
	{
		for(t=0;t<=offset_x+1;t++ )
		{ 
			OLED_DrawDot(uRow+t*incx,uCol,1);
		}
	}
	else
	{
		K = (float)(((float)y2-(float)y1)*1.000/((float)x2-(float)x1));
		printf("K=%.3f\r\n",K);
		for(t=0;t<=offset_x+1;t++ )
		{ 
			printf("X=%d,Y=%d\r\n",uRow+t,(u8)(uCol+t*K));
			OLED_DrawDot(uRow+t,(u8)(uCol+t*K),1);
		}
	}
}

注意:因为水平线和垂直线比较特殊,所以上面函数中对这两种情况进行了单独的绘制,没有使用斜率法计算直线上的坐标。

结果展示

我们按如下坐标绘制一个三角形:

OLED显示曲线

有了画线函数,我们只要将上面三个点的坐标依次代入画线函数即可,绘制三角形的代码具体如下所示:

OLED_DrawLine(32, 48, 96,16);
OLED_DrawLine(96, 16, 96,48);
OLED_DrawLine(96, 48, 32,48);

编译代码生成结果如下:

OLED显示曲线

双十一福利

上面的板子使用的是综合实例《基于手势控制的吸油烟机》的PCB板(暂时尚未完成,全部验证完毕会开源)。

OLED显示曲线

电路图我已经分享到小哈哥的知识星球中,接下来一个月的分享就围绕着这个板子开展,有想一起玩起来的,可以加入小哈哥的知识星球,我们一起同行。星球内会定期组织一些DIY内容,一起陪伴学习。

借着双十一分享一些优惠券,大家可以扫描加入,知识星球加入后,三天内可以无条件退款,想体验的朋友可以进去看看哈(加入的球友,记得微信加我好友,我拉你进球友群。)。

一本书的价格,小哈哥陪你一起成长,早加入,早陪伴。

小哈哥的知识星球补充两点球友权益:

  • 对于单个球友的价格永远不变,比如你现在69元加入,来年续费的时候还是69元;年费永不涨价;因为小哈哥的星球价格只会越来越高,所以越早加入,越合适。

  • 为了更好的鼓励球友之间互帮互助,一个续费有效期内,知识星球内,个人精华帖大于等于十篇,免次年年费!加精的内容包括但不限于回答网友问题,分享有价值的资料,自己遇到的坑(知识、经验或者商家,或者成长经历),跟小哈哥一起做的DIY,提交的作业等等,总之,能帮助他人,有利于自己成长的,小哈哥都鼓励支持!~ 这样,如果你乐于帮助别人,你只要加入了,以后就可以一直免费在星球内一起交流学习啦。

源码获取

公众号后台回复:OLED画线 ,获取本文测试工程源码。

总结

有了今天的知识点,其他任何图形、曲线,只要能计算出曲线经过的坐标点,那么就都可以绘制出来。

各位可以试着画一个时钟,看看自己是否能够完成。

不过这个Demo还有很多需要优化的地方,比如目前每画一个点就刷新了一下整个GDDRAM,很费时间,再一个,这里使用软件模拟的SPI总线,速度也没有硬件自带的SPI总线通信速度快,所以大家感兴趣的话,自己可以继续完善一下哈。

另外这个OLED的使用还有很多细节没有交代,比如初始化的时候这些命令的含义是什么呢?

OLED_WR_Byte(0x20,OLED_CMD);	//-Set Page Addressing Mode (0x00/0x01/0x02) // 设置内存寻址,模式
OLED_WR_Byte(0x02,OLED_CMD);	//页地址模式 // [1:0],00:垂直地址模式,01:水平地址模式,10:页地址模式

要说的还有很多,大家可以自行看看,如果有必要,小哈哥以后可以分享一下,总之,我们拿到一个新的模块、芯片,第一步先想办法用起来,细节可以稍后再考虑。

今天的文章内容到这里就结束了,希望对你有帮助,我们下一期见。

参考阅读

STM32驱动0.96寸OLED液晶屏

OLED液晶屏如何显示中文呢?

那位同学需要的:STM32驱动四针OLED,来了

OLED显示图片的技能,你Get了吗?

欢迎关注

点击名片,发送加群,加入作者优质技术交流群。

如果想了解小哈哥的知识星球,可以点击下方链接,查看球友的福利,我们可以一起交流、一起玩耍。

知识星球简介链接:
https://mp.weixin.qq.com/s/LIZlGiqExmSVohLgkUbkoA文章来源地址https://www.toymoban.com/news/detail-446707.html

到了这里,关于OLED显示曲线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 半路出家自学当程序员这一年的经历,大家一起共勉

    2022年3月7日,我来到了上海。那是一个寒冷的夜晚。虽然因为提前找到了工作,心里还是比较踏实的。当时是我的牛马兄弟来接的我,然后我们住在了一起。这才使得我当时月薪4,000的人能够在上海得以生存。 来到上海没多久就出现了疫情,当时真的挺惨的。基本上一直是被

    2023年04月18日
    浏览(54)
  • 当程序员的好处和坏处,我用七年经历来和大家聊一聊

    首先,我毕业于四川某不知名的二本院校,于2016年进入工作岗位,到目前为止已经工作了快七年的时间。我干着一份朝九晚八的工作,目前坐标是在成都,也在那里买了房子,过着一个普通小老百姓的生活。这七年来,我遇到了很多挑战,但也学到了很多技能和知识。回顾这

    2023年04月21日
    浏览(41)
  • 作为一名普通的java程序员,我想和大家分享一下4年来的工作内容

    我是16届毕业生,我的第一份工作是做外包,第一年的时间里测试偏多,比如用Excel文档生成测试代码进行单元测试,也会写一些简单的增删改查,以及用shell处理数据,还有一些纯测试的工作,比如点页面啊截图。到了第二年,开发的工作也变得多了一些,但大部分还是增删

    2024年02月05日
    浏览(48)
  • 程序员的浪漫—利用Matlab 实现圣诞树动态显示

            圣诞节是基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节,天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期,《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人认为选择这天庆祝圣诞,是因为基督教

    2024年02月04日
    浏览(45)
  • OLED显示曲线

    大家好,我是程序员小哈。 前两天有网友留言,能否做一个显示波形的实例,之前也有人提过类似问题,那么今天我们就来安排一下。 我们在网上经常能看到一些大佬用0.96寸OLED制作的迷你示波器。 制作这个mini示波器,界面中的曲线绘制是一个难点。 小哈哥的主要工作是做

    2024年02月05日
    浏览(81)
  • CSS笔记(黑马程序员pink老师前端)选择器,字体,文本属性,Emmet语法,元素显示模式,CSS背景

    选择器分为基础选择器和复合选择器两大类。 基础选择器 包括:标签选择器、类选择器、id选择器和通配符选择器。 多类名 可以把一些标签元素共同的样式放到一个类里面。这些标签都可以调用这个公共的类,然后再调用自己独有的类。 复合选择器 基础选择器的组合.包括后

    2024年02月09日
    浏览(57)
  • 程序员简历程序员简历.pdf

    你们在制作简历时,是不是基本只关注两件事: 简历模板,还有基本信息的填写 。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“ 看起来最好看的模板 ”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象: 许多求职

    2024年04月14日
    浏览(49)
  • AI程序员对程序员的影响

    最近,全球首位AI程序员Devin的出现引发了广泛关注,也引发了人们对人工智能在编程领域的潜力和影响的讨论。尽管AI技术在编程领域得到广泛应用,但人们仍然在探讨它是否能完全取代人类程序员。本文将探讨AI程序员的优势、局限性以及对程序员职业的影响,并展望未来

    2024年03月23日
    浏览(59)
  • 普通程序员和厉害程序员的差距!

    大家好,我是 程序员陶朱公 。 今天跟大家聊一下关于代码重构的话题。 话说,很多程序员对自己写的代码平时很随心所欲(各种魔法变量,一个方法几十上百行代码,还有各种让人崩溃的变量或方法命名)。 当有一天让他维护他人的代码,他就会抓狂,很容易激发他体内重构

    2024年03月23日
    浏览(64)
  • 大批程序员失业,大龄程序员出路在哪里?

    在程序员这个群体中,时常有人陷入技术迷信和思维僵化的困境,但实际上,当前市场对于技术的需求是非常广泛的。因此,我提出了一些建议,希望能够帮助程序员跳出技术框架,更好地利用技能创造实际价值。以下是一些建议供参考: 开发小而实用的工具类软件: 以“

    2024年01月22日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包