独立按键控制流水灯
我们先讲解一下上次布置给大家的双向流水灯作业。该实验的现象很明确就是将我们已经做过的循环左移流水效果和循环右移流水效果重合起来,双向流水代码如下:
#include <reg51.h>
#include <intrins.h>
void main()
{
unsigned char x,y;
unsigned int i;
x=0xFE;
y=0x7F;
while(1)
{
P1=x & y;
for(i=0;i<=10000;i++); //延时
x=_crol_(x, 1); //循环左移1位
y=_cror_(y, 1); //循环右移1位
}
}
本节实验内容是:利用开发板上的S1、S2、S3、S4按键来控制流水灯效果,若按下S1,8个LED呈现从左向右单向流水,若按下S2,8个LED呈现从右向左单向流水,若按下S3,8个LED呈现呈现双向流水效果,若按下S4,关闭8个LED。本实验的关键是单片机如何判断哪个按键按下?我们直接介绍过I/O接口,称为输入/输出接口,顾名思义它既有输出功能,也有输入功能,之前我们做的实验都体现了它的输出功能,我们现在介绍一下它
的输入功能。
51单片机的4个I/O口具有输入和输出输出功能,但是在同一时刻只能有一个功能被使用,所以用之前要把引脚设定为你需要的功能。作输出功能时,不用管它,直接用就行了,例如我们上面的实验,都是直接使用,不做任何设置;通常作输入功能使用时,要先将对应的寄存器位置为1,但单片机上电后,默认的是置1的,只要你不是先做出其它功能用,再做输入,就不用置1了。但为保险起见,多置一次1,没有关系。至于为什么要这样设置,就必须知道I/O接口电路原理,其实这些原理我们并不需要去深入理解,不需要把内部的工作原理及电路都完全弄懂,我们是要用单片机不是设计单片机芯片的,所以我们只需要会用就行了。
将对应I/O接口设置为输入功能后,I/O引脚上的输入电平若为高电平,对应寄存器的对应位则为1,否则为0,也就是CPU可以通过读取I/O寄存器的值,判断对应I/O引脚输入的高电平还是低电平。回到我们这次实验上来,我们知道做单片机实验要从硬件和软件两个方面去考虑。本实验硬件上需要8个LED,4个按键和一个单片机,8个LED灯如何接到单片机上我们在之前的实验中都已经掌握,下面我们分析4个按键怎么和单片机连接,我们首先分析一下按键电路图,如图7.1所示,本实验只用了S1、S2、S3、S4,我们就先只分析这四个按键。从图中可以看出这四个按键一端都接到了J9最下面的插针上,我们用一根导线将这个插针接到开发板的GND上,另一端分别接到了J9上面的四个插针上,我们可以将这四个插针接到单片机I/O引脚上,由于P1口已用于控制LED灯,我们可以选用P0、P2、P3口,开发板上P3口插针刚好在J9插针的右两列,为了方便接线,我们选用P3口,用跳线帽将四个按键的另一端插针分别接到P3插针的P30、P31、P32、P33上,本实验全部的接线如图7.2所示。
接下来我们以S1为例来分析硬件电平的变化,当我们不按S1时,S1处于断开状态,与S1右端相连的P3口的第0脚的电平为I/O默认的高电平,与之相应的P0寄存器的第0位就为1,当按下S1,S1左右短接通,左端我们接到了GND上,那右端电平也变为低电平,与右端相连,P30也变为低电平,与之相应的P0寄存器的第0位就为0。这样我们得出一个结论:单片机的P3寄存器的第0位若为1表示按键没按下,若为0表示按键按下。也就是软件上我要判断按键是按下还是没按下,我们可以用C语言中的判断语句判断P3寄存器的第0位为0还是1就行了。
下面大家自行完成本实验的软件部分。(结合大家完成的情况作出讲解)
讲解本实验的代码:
#include <reg51.h>
#include <intrins.h>
void main()
{
unsigned char x,y,r,z,key=0x0f;
unsigned int i;
x=0xFE; //做流水初始化
y=0x7F; //右流水初始化
z=0xfe; //双向流水初始化
r=0x7f;
while(1)
{
if((P3 & 0x0f) !=0x0f)
{
key=P3 & 0x0f;
}
if(key==0x0e) //判断按下的是否为S1
{
P1=z;
for(i=0;i<=10000;i++); //延时
z=_crol_(z,1