描述
<div class="document">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/oIeMduC90m9UQwlXyjb8JOgu3zspFsJXDBmriZzN.png" alt="" width="893" height="670"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">* 1、项目功能介绍</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><span style="color:#95a5a6;"><span style="font-size:14px;"> 基于瑞萨MCU R7FA2E1A72DFL设计的一款点阵屏时钟,点阵屏使用的是一款桔色的屏,分辨率是11*7,使用了两块实现了时间信息的显示。桔色的屏显示效果很漂亮,而且本身是雾化面板,所以每个像素点显示比较均匀,比LED直接露在外面会好很多。</span></span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/WFBM4616w82VoQYjbYJsTAHcAhHfQ6QzXD1KIapY.png" alt="" width="1024" height="768"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/QvXHs4UKiIOWoJd6VUZmdM2QpCOMNdRuKDbdaFkf.png" alt="" width="1024" height="768"> 这里用到的点阵屏是某宝去老五家的橙色点阵屏,价格也不贵 0.5元一个,11*7分辨率,个人感觉还是挺划算的,有兴趣可以去看看。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/B3IfAnZHr8O4vPZP23FJtGuvEZLf7YbL0G11keNu.png" alt="" width="460" height="534"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">*2、硬件部分</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><strong><span style="font-size:18px;">1) 点阵屏驱动</span></strong></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><span style="color:#95a5a6;"><span style="font-size:14px;"><img src="//image.lceda.cn/pullimage/BXOGsUtBJusRJtHdNyzNukGnxGwzDwEWMHxwHUyl.png" alt="" width="1200" height="443"> </span></span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<p> 点阵屏引脚非常多,如果使用IO口进行驱动的话,哪需要的IO就非常多了,11*7 分辨率的两块屏,哪就需要36个 IO了,这就太浪费了,所以就需要外置驱动电路。点阵屏也有专门的驱动芯片,而我这里使用了移位寄存器 74HC595D进行驱动,我们知道点阵屏实际上就是一个个LED,而LED所需要的驱动电流是比较小的,而移位寄存器的输出电流可以达到60mA以上,完全满足了我们的需要。移位寄存器74HC595D支持8bit的输出,支持级联,驱动也仅需要3个IO,并且级联也是一样只需要3个IO口,这就非常方便了,大大减少了IO口的占用。</p>
<p> 移位寄存器的工作原理非常简单,介绍的文章也非常多(这里给一篇介绍的,也可以自行搜索:https://blog.csdn.net/qq_45772756/article/details/104138422)。</p>
<p> 我这里用了5块74HC595,这样就有了40个IO口了,而实际上我仅需要36个,所以就有四个空闲了。图中U3-U7就是5块移位寄存器,我们将U7做为高位,U3做为低位,这个点阵屏的11针哪排为阳极,7 针哪端为阴极,如果我们将11针全加高电平,7脚全部为低电平,哪则会全亮。当前设计的是高14位连接阴极(除空闲的四个外),低22 位连接到阳极端,这样我们就只需要按需输出高低电平就能实现显示了。</p>
<p> 接着来看下实际进行显示时内容的处理:</p>
<p><img src="//image.lceda.cn/pullimage/9JrSubKB2KEm94rYDgf2K0AcYg21nWxQquHXJkTS.png" alt="" width="970" height="391"></p>
<p> </p>
<p> 按图中样式,假设我们要显示数字1,则按图中,就需要将第三列输出高电平,第一、二、三、四、五行输出低电平,就可以显示出1了。数字1是比较简单。如果是2的话,就应该把列 6、7、8输出高电平,第一、二、三、四、五行输出低电平,但这就有个问题了,如果按这样的输出哪整个不是显示2了,而应该变成这个:</p>
<p><img src="//image.lceda.cn/pullimage/DzWu8GRgLSCmoKtMgvdxMBgdiVarU9k7X92Cbfn8.png" alt="" width="483" height="326"></p>
<p> 整个一个方块了,哪如何才能正确的输出我们想要的呢?这时我们只能按行进行扫描,一行一行的去显示,因为我们人眼的暂留效应,当我们快速的刷新显示内容后,我们眼睛就会将内容连成一个完整的数字了。</p>
<p> 所以下面就按行扫描形式进行输出需要的内容的方式,我们这里有7个阴极,我们将阴极做为行,一行一行的去显示。我们还是按显示数字2来讲解,我们从上而下的来讲解,哪么第0行置为低,其他行都为高,接着0-10列因为都没有内容所以都输出低电平,接下往下一行 第1行输出低电平,其他输出高电平,需要将 3、6、7、8列输出高电平。以此类推,每扫描到一个新的行时,把对应列中需要显示的位置置为高电平即可,这样一行一行往下进行扫描,就能实现所需内容的显示了。下图就是按行扫描时需要输出的内容(需要注意的是我这里低位在左侧),我们每个数字分成7行,每一行转换为需要的数字,之后我们在显示时仅需要将所扫描到的行上的每个数字所对应的行的数字进行移位,然后发送出去就可以了。</p>
<p> </p>
<p><img src="//image.lceda.cn/pullimage/5qLSZz99srvy1ndrJNGoDIhCB1iQGDWgGY032dzh.png" alt="" width="1200" height="263"></p>
<p> </p>
<p>2)充电电路</p>
<p><img src="//image.lceda.cn/pullimage/CxTQJsu8t78yy1slZpjiBx0j6QVSem5x84cU3CrI.png" alt="" width="1058" height="418"></p>
<p> 这里使用是SOT23-6小封装的充电芯片 4054,设置的充电电流为500mA,然后就是Q1这里的供电切换电路,至于原理这期的训练营硬件部分视频教程中有讲解,原理也比较简单,PMOS G极为低电平时导通,高电平截止,所以当没有插USB时,Q1低电平而导通,由电池供电,当插入USB后,G极为高电而截止,此时USB 供电的5V由 D1 进行供电。</p>
<p> </p>
<p>3)蜂鸣器电路</p>
<p><img src="//image.lceda.cn/pullimage/NSyerC5FauvkxWMfZ0hu7aDUd69HTW5qYgvfR9Wa.png" alt="" width="454" height="415"></p>
<p> 蜂鸣器电路是比较简单的,主要是这里使用的无源蜂鸣器,由MCU的PWM进行驱动,这样可以发出不同的声音。</p>
<p> </p>
<p> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">*3、软件部分</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 开发是使用的Keil5开发的,所以配置是使用的 FSP Smart Configurator 进行配置的,主要是配置了uart、RTC、ADC、TIM0、TIM7、Flash,可以使用 FSP打开工程目录下的 “configuration.xml”文件,就可以看到配置信息。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/FbY0Uq7RgUN4W4Qr7h26eG2TOulBRoY622TDs5to.png" alt="" width="1200" height="1008"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;">1)UART配置:</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> UART主要用于调试信息的打印,这里得说下,虽然瑞萨的配置比较方便,但对底层配置搞不太明白,但的确是非常的方便,比如串口配置,在FSP中配置完成后,就直接使用对应的Open函数就可以了。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/3ASEV2fGfU2vQKJzmj6dTblQfdDXpoAQpnAIz848.png" alt="" width="741" height="702"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 这里的printf打印的函数 fputc还是按照其他 ARM 的配置方式配置,按这里<span style="font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"> </span><a style="font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;" href="https://blog.csdn.net/qq_24312945/article/details/128797482%EF%BC%8C" target="_blank">https://blog.csdn.net/qq_24312945/article/details/128797482 </a>的fputc<span style="font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;">配置有问题。</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><span style="font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"> 接收做了几个标志位,接收空闲中断使用了定时器实现,这个在讲定时器时再稍带讲解下。</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><span style="font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;">2)毫秒计时器:</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><span style="font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"> 我是比较喜欢开一个定时用来做毫秒定时器,为什么呢?主要是使用delay的话,比较占用MCU时间,效率比较低,而且非常多的中断中如果使用delay的话会出问题,所以使用毫秒定时器会非常好用。</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/tfIT9hPJzAiSJ1W3rAmgz17xMRxukSQejO1uUTZN.png" alt="" width="594" height="815"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;">3)点阵显示处理部分</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 在硬件部分我也讲到了按行扫描时的数值方面,哪么这里我们就需要将所需的数值转换成我们代码中可以用的,还是先看图:</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/5qLSZz99srvy1ndrJNGoDIhCB1iQGDWgGY032dzh.png" alt="" width="1200" height="263"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 哪么,我们就来定义一个数组,用来存放所需的数据:</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/1PYbfxN6ZRijsnHBOC6s9LnhM7z532lSHqJxOmkW.png" alt="" width="377" height="211"> 数据的定义请与上图进行对比下,应该就能明白,另外这里因为还需要秒跳动时闪烁的点及年月日 设置时之间的分隔符,所以定义中多了两组数据。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 这组定义的数据是阳极输出高电平的数据,而我们即按是按行扫描,就还需要定义阴极输出低电平的数据,才能正常使用:</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/KrfHqXJ8GKl3MDwh9ZZDPh47uqKMk2WdHJwzfQbJ.png" alt="" width="343" height="148"> 我们知道每个字节是8位,而我们移位寄存器总共有5个,每个也是8位,所以这里也是定义了7行数组,每组5个字节数据,正好能对应,5*8=40位的数据,我们每次发送40位数据,就能刷一次。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 从左往而依次发送,所以最左侧数据就会发送到最高位,大家应该也注意到了每行的第一个数据都是0xF0开头的,这也是对应的硬件部分讲的空出来的四位。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 这部分讲解有点费事,容易讲迷糊,我也只能尽量讲解,不清楚的再一起讨论吧!</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 哪么接下就是实际显示部分了:</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/1peMzUfyccn1AxFMjV3QHViqZpJA5eupt6oFIOwe.png" alt=""> 首先就是我们需要取出每个时间的数值,以便对应进行输出显示,假设当前时间是12:34,我们自己是非常容易分拆出所需要的数字,即 1 2 :3 4 五个,而在程序中如何实现呢?</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/1F0ivdQSH72tJ79gB3iGWTK6RYDq9WY2vd8qrbtt.png" alt="" width="327" height="79"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 其实也很简单,我将十位上的数字除以10取整后就能得到十位上的数字,然后与10取余就能得到个位上的数字了。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> <img src="//image.lceda.cn/pullimage/9JrSubKB2KEm94rYDgf2K0AcYg21nWxQquHXJkTS.png" alt="" width="970" height="391"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> 接着又得说一个让人迷糊的事情了,就是显示的移位顺序。当前左侧一个在电路图中正是按上面的标号 0-9,第二个屏标号应该是 11-21,也就是说左侧是从低到高。不知道能不理解,而每个数字是占三列的,哪么实际显示数字1的列应该是第2 、3、 4列,左侧是有空两格的,这主要是为了让时间显示时更居中一些,这里显示即然是左侧空了两格,自然就需要将第一个数字移动两格,所以我们看到代码中有移位的操作,请看下图:</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/FZXunyo5072fMfUFVlBEHpdoSV9sTP25IMSPXfHY.png" alt="" width="528" height="244"></p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">*4、BOM清单</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><span style="color:#95a5a6;"><span style="font-size:14px;">请在项目中导出BOM</span></span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">*5、大赛LOGO验证</h3>
<hr class="horizontal-splitline normal-bold-2">
<p style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"><img src="//image.lceda.cn/pullimage/THcvEbQpnEdXtSCXbf0dGZOx6nWJ3Z8vCKvYoUfi.png" alt="" width="978" height="733"></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">* 6、演示您的项目并录制成视频上传</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
</div>
评论(10)