老师给出这张ppt。开始讲说在此平台上P0口不是直接接LED,不能直接给P0口高低电平来点亮LED灯 ,就开始介绍锁存器和138译码器的原理
先看左下角这个东西,三路输入八路输出,左下三个是控制,ppt说了,八路输出是互斥的低有效输出,意思就是,这八路同时只能有一路是低电平,而哪一路输出低电平就是依靠三路的控制,表格中A0对应A(从右往左看),以此类推,该功能表高低电平的排布规律要学会,先看三个控制的,就是二进制,是001就对应Y1,011就对应Y3,以此类推。
再来看看锁存器。八路3态输出的非反转透明锁存器就说明左边P0口输入什么右边就输出什么。锁存器有三类引脚,第一类就在上方的控制引脚,接地的是作片选(选择芯片)来用的。再来看LE控制引脚,作用是控制什么时候锁存和打通。看表格可以知道,OE一直给低电平,LE置高电平的时候就是可以打通的。
在看到这里,上方最右边的跳线帽已经接到23脚,那或非门的WR就是低电平0,原理图中,一样的英文数字代表是接在一起的,比如或非门的Y4C就接在控制引脚LE上。(或非门:先或之后,在取反输出)。此时要打通MIR的话就要Y4输入0,此时或上0就是0,取反就会输出1,输出1就打通了。而要Y4输入0就要回到138译码器左上角的三个控制引脚。至此,代码思路就讲完了。就是从三个控制引脚的代码开始写起。
接下来讲解敲代码的过程。视频用的是keil4,但是本人还是喜欢用keil5,省赛用的是keil4.(佛山)。
值得注意的是,板子是15系列,开发还是按照C52的模式。
经典勾选。
第一步 基本框架搭建好。(基础)
第二步 根据138译码器的原理图,将引脚对应位置定义好。 (基础)这样写可以提醒自己是从从A到C这样看过去,比如100就对应着给HC138_C高电平,BA都给低电平。
第三步 (基础)延时函数,这个可以在那个烧录软件上生成,然后修改一下就可以延时任意大小的毫秒了。然后再说说格式上,模块化可以从江科大上看到,而我这样写则是国一学长的推荐,要在main.h里面进行外部声明,解耦合。
第四步 (正式)此时我们就开始写帮助我们实现目的的函数了,在此之前先把之前的Delay1ms改一下名称会舒服点。在来讲这个函数,先根据138译码器,三个控制引脚置高低电平如图所示,就能让Y4置低电平,通过或非门就会让Y4C输出高电平给LE控制MIR的打通,此时就可以通过P0口控制LED灯了。后面就可以检测一下延时函数和之前写的代码有没有问题。
(板子实验现象发现是闪烁很快,而且有非常烦人的蜂鸣器的鸣叫,后面就开始加大延时时间然后,着手把蜂鸣器等外设关闭且模块化方便以后使用,跑马灯不模块化是因为意义不大。)
(基础)再讲之前还是把 这个延时函数改一下,为了我们输入数字就能得到预期的延时时间,经过测试,发现生成500ms得到的延时时间是比较准确的,那咱们就暂时先这样写吧,一毫秒的误差太大了。因为_nop_();,所以记得包含一个intrings的头文件。
(基础)然后就是解决 蜂鸣器乱叫的问题,这是学长的写法,挺简洁的,但我暂时是看不懂,所以要等后面学到才能做出分析。至此,我们就实现了关闭外设和让LED一秒闪一次的目的。
接着实现后面的要求就简单了,先介绍我自己的写法,简单粗暴的用了三个for循环,循环实现,闪烁三遍-->依次点亮-->依次熄灭-->闪烁三遍 实验现象也符合要求。
视频教程里面也是用循环,但是只有移位操作,比较简洁,实验现象一样,建议学习。
至此,本章内容的学习介绍,如有错误,请多多纠正!谢谢观看!