知识蒙蔽了我的双眼.jpg

INIT

INIT.jpg

INIT:本节内容正式开始。action!

引言

本节课我们来学习OLED调试工具。本节课比较简单,我会给大家提供一个OLED显示屏的驱动函数模块,大家先学会如何使用我提供的模块就可以了。至于OLED屏幕的原理和代码编写,我之后会再讲的。现在我们就是用OLED当一个调试的显示屏,方便我们调试程序。在以后的教程中我们会经常用到这个显示屏,所以在这一节先提前介绍一下。

我们先来看一下本节课程序的现象。本节课只有一个程序,OLED显示屏,我们下载看一下。

这时可以看到我们插在面包板上的OLED显示了一些字符和数字。第一个是显示一个字符A,第二个是显示字符串hello world,下面左边是显示一个数字12345,然后右边是显示有符号的数字-66,再下面是显示16进制数字AA55,最后是显示二进制数字1010101001010101,这个就是16进制AA55的二进制数。

图:实验现象


P9-OLED调试工具.png

这些就是我提供的OLED驱动函数模块能显示的内容,当然这个屏幕也能显示中文或者图像,但是我暂时还没有加进来。我们这个屏幕目前主要用于调试,有这些显示内容就足够了。

看过我51单片机视频的同学,应该对这些显示内容就比较熟悉了。我提供的这个OLED模块和51视频里的LCD模块,它的驱动函数基本都是一模一样的。所以上手这个OLED屏幕应该还是比较容易的。

单片机的调试方式

那么回到PPT,首先我们先来看一下目前常用的程序调试方式。

对于我们的单片机编程而言,经常会遇到一个很大的问题就是程序调试。因为单片机不像电脑,电脑有一个很大的屏幕,想看什么变量、参数、直接打印到屏幕就可以了。

但是单片机不一样,很多时候由于成本和电路结构的限制,它并不会有一个像电脑屏幕那样强大的显示屏,这就对我们的调试造成了困难。比如如果让你学习C语言,但是不允许使用printf这个打印函数,那你想一下C语言是不是就根本没法学,对吧?

同样给你一个单片机,但没有任何可以显示参数的东西,那你也没法学单片机是吧?所以我们本节先来学习一下程序调试方法。我们来看一下,这里我列举了三种常用的程序调试方法。

  • 串口调试:通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息
  • 显示屏调试:直接将显示屏连接到单片机,将调试信息打印在显示屏上
  • Keil调试模式:借助Keil软件的调试模式,可使用单步运行、设置断点、查看寄存器及变量等功能

串口调试

第一种就是串口调试,它是通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息,这种调试方式是非常常见的。就是用串口将单片机连接到电脑,相当于把电脑的屏幕挂在单片机上,方便单面机显示调试信息。

一般我们设计PCB电路板的时候都会像这样,在PCB边上留一个串口通信的引脚。需要调试程序的时候,把单片机连在电脑上,然后就可以在电脑屏幕打印信息了。调试好之后,就断开串口,程序就能正常工作了。

所以你看其他的教程,如果是使用串口调试的话,那一上来都应该会先学一下串口通信,这样才好继续之后的课程。

显示屏调试

但我一般比较喜欢用显示屏来调试程序,我觉得显示屏调试会更加舒服,所以我就先开了本节OLED调试工具的课,串口通信的课我会放在后面再讲的。

那接下来我们就来看一下显示屏调试,它是直接将显示屏连接到单片机,将调试信息打印在显示屏上。这个方法就比较直接。单片机没有显示参数的东西,那我们就直接接个屏幕上去。这里我们使用的是这种比较小巧的0.96寸OLED显示屏,使用还是非常方便的。

当然串口调试和显示屏调试也是各有利弊的。串口的优势是可以借助强大的电脑来调试。电脑端的软件不仅可以显示单独的参数,而且可以显示曲线、图形、图像等。还可以自己做一个软件,来实现一个强大的用户交互界面。

串口调试的弊端,就是调试的时候需要拖着电脑。而且通常的串口助手只能以信息流的方式呈现数据,就是只能一行一行的打印。

如果有很多不断变化的数据要显示,那就只能在电脑上刷屏显示,这样用起来就不太好,太方便。接着显示屏调试的优势是对于不断变化的数据可以覆盖刷新显示,而且显示屏可以始终接在单片机上,显示方式很直接。

还有一般我们做一些稍微复杂的东西,都会需要有一个人机交互的界面。这样就可以直接把显示屏当做产品的一部分,还是比较好用的。

那显示屏的弊端就是屏幕太小,显示内容有限,没有电脑软件那么强大的功能,是吧?所以这两种方法各有各的适用场景,需要根据实际情况选择合适的方法。

本套课程中基本上都是一些参数变量的显示,所以我觉得用OLED显示会更加方便。

Keil调试方式

最后我这里还列举了一种调试方式,就是Keil调试模式,它是借助Keil软件的调试模式,可使用单步运行、设置断点、查看寄存器及变量等高级功能。

Keil调试模式的功能还是非常强大的,这个在下一小节可以给大家具体演示一下。

其他调试方式

点灯调试法

当然除了这三种方法之外,还有很多种程序调试的方法,比如点灯调试法,如果你不清楚程序是不是执行到了某个位置,就可以在那个位置放一个点灯的代码。如果运行到了,灯就亮,没运行到,灯就不亮。

注释调试法

还有注释调试法,如果你的程序原来是好的,但是加了某段程序就死了。这时你可以把新加入的程序全部注释掉,恢复到正常运行的状态。然后依次一行一行的解除注释,直到错误出现,或者注释掉一部分来测试另一部分,然后再注释掉另一部分,测试这一部分,减少程序运行的部分,来定位出问题的程序在哪里。

对照法

另外还有对照法,这就是你找到一个没问题的程序,它的执行逻辑没问题。你感觉你自己写的逻辑也没问题,但是它的可以运行,你的却不能运行。这时就可以对照一下,在它的程序逻辑上逐步替换成你的程序逻辑,这样就比较容易发现错误在什么地方。

测试程序的基本思想

总之测试程序的基本思想就是缩小范围、控制变量、对比测试等。

测试的方法是多样的,这个还得大家在实践中多想想了。

OLED简介

好,介绍完这些调试方法,我们来看一下OLED显示屏的介绍。

  • OLED(Organic Light Emitting Diode):有机发光二极管
  • OLED显示屏:性能优异的新型显示屏,具有功耗低、相应速度快、宽视角、轻薄柔韧等特点
  • 0.96寸OLED模块:小巧玲珑、占用接口少、简单易用,是电子设计中非常常见的显示屏模块
  • 供电:3~5.5V,通信协议:I2C/SPI,分辨率:128*64

首先OLED它是这一串英文的缩写,意思是有机发光二极管。

OLED显示屏就是用这个有机发光二极管做出来的屏幕。它是一种性能优异的新型显示屏,功耗低。这个是因为OLED每一个像素都是一个单独的发光二极管,每一个像素都是可以自发光的,不像LCD那样需要有背光。所以OLED屏幕会比较省电,响应速度快,这个特性可以使OLED有更高的刷新率,总线时序快,也可以避免阻塞我们的程序。

宽视角。因为OID屏幕上自发光的,所以在任何角度看显示内容都是清晰的。对比LCD的话,比如我现在录视频的这个电脑屏幕就是LCD屏。如果我从上面或者下面斜着看这个屏幕,那屏幕就会变黑,很难看清上面的内容。而我现在这个手机的屏幕是OLED屏幕,基本上各个视角都可以看清屏幕,这就是可视视角的差别。

最后轻薄柔韧,比如现在手机上的折叠屏、柔性屏等,用的就是OLED显示屏。

接着来看一下本节用的0.96寸OLED模块,介绍是小巧玲珑、占用接口少、简单易用,是电子设计中非常常见的显示屏模块。

这个显示屏也算是单片机领域的一个经典显示屏。当然它不会像我们手机、电脑上的屏幕那么强大。这个OLED一般都只有一种颜色,分别率也比较低。驱动这个OLED只需要几根线和简单的通信协议,占用资源比较小。

OLED的外观和种类

下面这些图片就是这个OLED的外观和种类,它有几种规格。

图:OLED的外观和种类


P9-OLED调试工具-1.png

第一种就是我们视频使用的总共有四个针脚,像素是白色的。右边这里还有一种7针脚版本的,需要占用的IO口就多一些。对应这个像素颜色除了有白色像素的版本,还有这种蓝色像素的版本,和这种黄蓝双色的版本。

这个黄蓝双色并不是真正的双色,它是上面4分之1的像素固定是黄色的,下面4分之3的像素固定是蓝色。这种屏幕适合做一个需要显示标题行的界面,上面的黄色显示标题,下面的蓝色显示内容了,这样比较好看一些。

当然无论像素颜色是哪种,它的驱动方式都是一样的。

最后看一下参数,它的供电是3到5.5V,3.3V和5V的单片机都是兼容的,通信协议是I2C或SPI。像下面这种4针脚的屏幕,一般用的是I2C的通信协议,这种7针脚的屏幕一般用的是SPI的通信协议。

这个I2C通信和SPI通信我们之后的课程会讲,现在了解一下即可。最后它的分辨率是128 * 64项数,这个分辨率对于手机电脑而言,那太低了是吧。不过对于单片机而言还是非常够用的。

OLED硬件电路

图:OLED硬件电路


P9-OLED调试工具-2.png

接着我们来看一下OLED的硬件电路,左边这个是4针脚版本的OLED电路。这里GND接GND,VCC接3.3V,给OLED供电,然后剩下的SCL和SDA是I2C的通信引脚,需要接在单片机I2C通信的引脚上。

当然我给的驱动函数模块用的是GPIO口模拟的I2C通信。所以这两个端口就可以接在任意的GPIO口上。然后右边7针脚版本的OLED电路也是一样,GND,VCC接电源,剩下的引脚是SPI通信协议的引脚。

如果是GPIO口模拟的通讯协议,那也是接在任意的GPIO口上就行了,这就是硬件电路。

OLED驱动函数模块

最后来看一下我给的驱动函数模块都有哪些东西,这个表里可以看到这些就是我提供的驱动函数。

图:OLED驱动函数模块


P9-OLED调试工具-3.png

这两个图是OLED的实物图和屏幕坐标图,我把这个OLED分割成了4行16列的小区块。从左上开始,向下依次是第1行、第2行、第3行、第4行,向右依次是第1列、第2列,一直到第16列。

图:屏幕坐标图


P9-OLED调试工具-4.png

图:OLED的实物图


P9-OLED调试工具-5.png

然后看一下下面的驱动函数,第一个是OLED_Init,这个是OLED初始化函数。在使用OLED之前需要调用一下这个函数,对OLED进行初始化,然后就可以正常使用了。

第二个是OLED_Clear,这个是清屏函数,调用这个函数屏幕就会清空,然后下面的这些函数就都是OLED的显示函数了。

OLED_ShowChar()

首先OLED_ShowChar,显示一个字符,第一个参数指定起始行,第二个参数指定起始列,第三个参数是要显示的字符。

OLED_ShowChar(1, 1, 'A');

比如1行1列显示字符A,那在屏幕上1行1列的位置就会像这样显示一个A,右边这里是它的实际效果(看上面的两个图)。

OLED_ShowString()

接着OLED_ShowString()显示字符串,比如在1行3列显示字符串hello world!,那就会从这里开始显示hello world!,右边是这样的。

OLED_ShowNum()

然后OLED_ShowNum(),这个是显示无符号十进制数字。

OLED_ShowNum(2, 1, 12345, 5);

前两个参数指定起始坐标,第三个参数是要显示的数字,第四个参数是数字的长度。

比如2行1列,显示数字12345长度为5,就会在屏幕的这个位置显示12345。

OLED_ShowSignedNum()

OLED_ShowSignedNum(),就是显示有符号十进制数字在显示的时候会带一个正负号。

OLED_ShowHexNum()

OLED_ShowBinNum()

然后OLED_ShowHexNum()显示16进制数,OLED_ShowBinNum()显示2进制数,这些我就不过多介绍了,相信大家很容易就能看懂怎么用的。我们下一小节写代码的时候再来具体演示。

这个屏幕还可以显示中文图像的内容,我这里给的驱动函数并没有涉及这些东西,这些东西我们调试的时候也暂时用不到。

如果大家需要的话,我们之后单独学习OLED的时候再来演示这些功能。好,那本小节的内容就到这里,我们下一小节来学习一下如何使用这个驱动函数模块。

END

END:本节内容到此结束。

个人提升之余,别忘了和小伙伴积极交流,很多人觉得他们在思考,而实际上他们只是在重新整理自己的偏见。请珍惜和他人交流讨论的机会。


END1.jpg

希望你每一天都有所收获,进步up up up。今天的我们并不比昨天更聪明,但一定要比昨天更睿智。


END2.jpg