1、独立按键控制LED灯的亮灭(效果:按下按键灯亮,松开按键灯熄灭)
在正式编写程序前,我们先来了解独立按键。下图右3为独立按键的引脚连接方式,左边引脚连在一起,并且有两个触点,右边引脚连在一起有一个在中心的触点。当按键按下的时候,金属弹片与触点形成通路,松开按键就与触点分开。
在了解了独立按键的外在物理结构后让我们来看一下他的电路结构。
独立按键的一条引脚都接了GND。
可以看到每个独立按键与单片机的io 口都连接了,独立按键的按键io 口有点特殊,按键K4接的是P33口,K3接的是P32口,K2接的是P30口,K1接的是P31口。这点是需要我们注意的。
单片机上电时,所以io 口都默认为高电频,如果按键没有按下,这个io 口就保证是高电频,如果按下了,这个io 口就为低电频了,单片机上有寄存器,我们写一个值他就会送到io口上。同时寄存器还有另一个作用,他会检测io 口的高低电频,再读取回寄存器中。
在了解完其电路结构后,我们便可编写程序了。
之前我们是对P2寄存器上整个值来进行操作,现在我们只想对寄存器中的一位进行操作,这时就可以引入我们的头文件,即可对其中一位进行操作
前面我们说到寄存器会对io 口进行检测,检测的值会返回到寄存器中,所以,我们对寄存器进行判断是否为0(即知道我们是否按下了)。这样我们第一个独立按键控制LED的亮灭即完成了。
在编写第二个程序前我们先了解编写C51的数据运算以及基本语句
上面的加减乘除与判断部分不多赘述,我们来看除法与取余
其中除法就是取他的商,取余就是取他的余数。
接着我们来看逻辑操作符与位运算,逻辑操作符可看我的初识c语言,接下来我来简单说下位运算。
<<(按位左移)即从最高位左移,最高位移出,最低位补0;
>>(按位右移)即从最高位右移,最低位移出,最高位补0;
&(按位与)二进制位与位相与,都为真才为真(在C语言中,我们以非0为真,0为假);
|(按位或)二进制位与位相或,有真即为真;
^(按位异或)相同为0;不相同为1;
~(按位取反)0变1,1变0;
下面便是一些选择结构和循环结构的语句,想要了解的可以去看我的初识C语言
2、独立按键控制LED灯的状态
在正式编写程序前先补充一些知识,在我们按下按键和松开按键后里面的振片都会抖动,从而导致对硬件的误操作,所以我们在实际操作中需要消除按键抖动。(我们可以通过硬件消抖,也可以用Delay函数进行消抖)
一种好的习惯,边写边测试。比如下面的Delay函数,我们可以写完简单的测试一下程序是否正确。
接下来就编写我们的主程序了,其中用if 语句来判断我们的按键是否按下,因为我们想要达到的效果是松开手后,LED灯才会电亮。所以我们需要用一个循环判断是否松手了,当松手以后,我们进行按位取反就能得到我们想要的效果了。其中的Delay函数是为了消除振片的抖动对我们的影响。
3、独立按键控制LED显示二进制
因为我们是要显示二进制,所以直接对P2寄存器进行操作,这其中也要用到Delay函数,可以直接将上节的粘贴复制。
我来解释下下面的代码,刚开始启动单片机我们的P2口都是高电频,即为1。然后对P2进行++,导致数值溢出,即P2全变为0。接着我们对P2进行按位取反,又全变为高电位。即我们按动按键LED灯也不会有什么反应。
上面已经知道对寄存器直接++,会导致其中的值发生改变,所以我们可以用一个char字符来存储数据,这里面char字符里面的位数与单片机里寄存器的位数相同。且对变量进行取法又不会改变变量本身。这样我们就得到了LED灯显示二进制。
4、独立按键控制LED移位
在独立按键控制LED移位中我们也需要用到Delay函数,如果我们在主函数的下面定义Delay函数,那么在主函数的上面就一定要声明,否则编译器会报错。
我们所想实现的代码是每按一下就加一,然后移动我们想要位数,这里左移操作符,只要我们按一下按键,我们的数值就像左移一位。
这样就能实现我们按k1 就实现LED灯移位,下面的if 判断是必要的,因为最多移动7位,当LEDNum为8时,我们便让他归零。
接下来我们想实现按K2LED灯向另一边移动,在底下加上这样代码就能控制LED灯的另一边移动。这里的if 判断条件也是必要的,当LEDNum为0时,我们如果再对他减减,他就会变为unsigned char 类型 能存放的最大数据。所以当LEDNnum为0时,我们直接将他们的值修改为7。