单片机学习小组
直播中

663593

12年用户 557经验值
私信 关注

如何实现led的控制?

如何实现led的控制?

回帖(1)

孟佳

2022-1-17 15:05:39
  led的控制

1.找到原理图的二极管位置

大概是这个样子,有的单片机比较简单,没有Y4C这个寄存器,所以可以跳过寄存机的步骤,但是,你既然点进来了,国信长天的板子,是有这个Y4C的,所以,我们要控制LED,首先,要把Y4口打开。
2.找到 Y4口(Y4口的映射位置就是Y4C)
再补充一点:
原理图上面,数字或者字母组合体,名字相同的,就是物理状态下,相连接的部分。

因为WR是低电平,所以,要想要Y4C是高电平,那么因为是或非门,根据紫色字体的解释,我们必须要将Y4置0。当Y4和WR同为低电平时,Y4C才为高电平。那我们继续找原理图上Y4的物理连接位置。

可见Y0-7口是由P25、P26、P27控制的,你们可能会有疑问,为什么,P的三个口可以控制8个Y,其实,在红色的地方我也做出了解释。
根据真值表:

我们暂时不看ABC,先看Y0-Y7端口,我们先告知一个知识点,H=HIGH,表示高电平,数值为1。那么,Y7-Y0就是11101111。对应的控制这个的ABC端口根据上上个图片,我们就得知,A对应P25,B–>P26,C–>P27。那么对应的地址由高到低来,即P7-0,的二进制就是1001 1111,(默认通电之后,端口都是高电平)。其实,搞出来这个P2口(1001 1111)可以逆推官方给的单片机实验程序上面的寄存器操作的依据。
        P2 = (P2&0x1F|0x80); 首先,我们来看代码的&(与)部分。
0x1F写成二进制是0001 1111。P2口的默认状态是1111 1111。P2&0x1f是为了把高三位清0,因为我们在目前这个寄存器来看,我们只需要控制P7-5这三个端口,所以,我们就需要通过&运算,来将对应的三个端口清零,可以理解成先初始化这三个端口,为了方便我们后期的操作。
这是这个部分的运算。
如果你不太了解,按位与&,按位或|,可以参照我之前的文章,简洁明了 (文章链接在此&、|、^).
下面,我们再来看官方例程的后半部分0x80
为什么是0x80呢?

其实它是规定的LED锁存信号。
那么就不难理解为什么官方例程写成这样了。
P2 = ((P2&0x1f)|0x80); 那下面我们来验证一下:

看!这个就是我们刚刚推出来的P2的二进制。
我们可以按照官方的来写,也可以直接把16进制打上去,看个人喜好。但其实官方的写法更有利于观察和理解你代码的作用。所以还是推荐按照官方的来写,led信号都是固定的,到时候如果程序出现错误,写成官方的形式,更有利于排查错误,所以显然,我这里推荐使用官方的写法。
那么截至目前,我们已经会打开寄存器了,同时,寄存器在使用结束后,还是要关闭的,因为一个寄存器,根据官方所给的原理图来看,它不仅仅连接8位共阳led灯,而且还连接了数码管,口说无凭,上图:

所以,不管是你只是单独写一个led的程序,我们还是要养成一个良好的习惯,把寄存器打开后,关闭,用以锁存这个状态。其实你单独写led亮灭的时候,你不关这个锁存器也是可以正常运行的。但是,这并不是规范操作。
那么如何关闭P2口呢,其实上面我说过了,就是P2口的初始化,也就是说
P2 &= 0x1f; 这样就关闭了。
这个寄存器的使用到此为止,下面我们来介绍蓝桥杯的国信长天单片机实训平台的板子的Led控制
这是一个共阳极的发光二极管,怎么看的呢?

由图可知:他们的阳极全部接在一起,所以叫共阳。那么想要电源流通,就必须形成电压,所以就要有压差,那么怎么营造压差呢,我们来看整个威廉希尔官方网站 图

由高到低才能有压降。那么显而易见,我们想要哪个LED灯亮,就需要让它形成压差,就需要给P0的端口一个0来让电流流通。
所以我们的点亮第一个LED灯 的程序就这么来写.


  • 引入头文件:reg52.h也可以的。
  • 选择采用位控制,还是用16进制的方式来控制也就是总线控制,原理都是一样的,位控制比较方便,也比较好纠错,所以我采用位控制。(下一个关于蜂鸣器的程序,我写一个位控制的)

#include ***it L1 = P0^0;void main(void){        P2 = ((P2&0x1f)|0x80);        L1 = 0;        P2 = (P2&0x1f);} 下面,我们来编译一下。
来吧!!展示!!!!!

好了,这就是以上点亮单个led灯的教程。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分