实验要求:
使用独立按键控制8个LED从LED1-LED8依次全部点亮,然后从LED8-LED1依次全部熄灭。
实验思路:
1、LED灯D1-D8控制管脚接P2.0-P2.7管脚,并宏定义P2端口为为:LED_PORT。
2、独立按键K1控制管脚接P0.7管脚,并定义为KEY1;重定义系统数据类型。
3、定义一个数组变量led_code,用于存放LED点亮的控制码表。
4、定义一个延时函数delay_10us。
5、主程序内定义一个静态变量x,用于独立按键控制LED点亮。
完整代码:
/**************************** 程序信息 ********************************
* 实验名称:使用独立按键控制8个LED依次点亮与熄灭
* 文件名称:main.c
* 版 本:V1.00
* 日 期:2022-01-02
* 编 著:gefon
* 说 明:使用普中A7开发版,使用K1按键控制D1-D8编号LED灯依次全部点亮,
然后从D8-D1依次全部熄灭。
****************************** 声明区 ********************************/
#include <reg52.h>
#define LED_PORT P2 //宏定义LED控制端口
sbit KEY1=P0^7; //定义独立按键K1控制管脚
//重定义系统数据类型
typedef unsigned char U8;
typedef unsigned int U16;
//LED控制码表
U8 led_code[16]={0x7F, //点亮D1灯
0x3F, //点亮D1-D2灯
0x1F, //点亮D1-D3灯
0x0F, //点亮D1-D4灯
0x07, //点亮D1-D5灯
0x03, //点亮D1-D6灯
0x01, //点亮D1-D7灯
0x00, //点亮D1-D8灯
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,
};
/****************************** 子程序 ********************************
* 函 数 名 :delay_10us
* 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us
* 输 入 :ten_us
* 输 出 :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
while(ten_us--);
}
/****************************** 主程序 ********************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
***********************************************************************/
void main()
{
static U8 x=0;
while(1)
{
if(KEY1==0)
{
delay_10us(1000); //按键消抖
/***************************** 实现方案1 *****************************/
if(KEY1==0)
{
LED_PORT=led_code[x];
delay_10us(20000); //延时约200ms,以防止按下过程中再次进行判断
x++;
}
/***************************** 实现方案1 *****************************/
/***************************** 实现方案2 *****************************/
// while(KEY1==0);
// delay_10us(1000);
// LED_PORT=led_code[x];
// x++;
/***************************** 实现方案2 *****************************/
}
if(x==16)
x=0; //当静态变量x==16时,初始化x赋值。
}
}实验分析:
如何让LED的显示调用LED控制码表led_code?这里我们定义了一个静态变量,并给它赋初值x=0,用于调用LED控制码表。按键每次按下判定完,执行LED点亮后,对x的值+1。这样按键每次按下后,X值会增加一位。当x=16时,再次对x赋值初始化为x=0,即可不断的循环点亮和熄灭LED。因为按键按下到松开有一个时间,如果在按键未松开时,程序执行完成。会进行再一次的判断,点亮其它的灯。为了使每次按键按下到松开,只点亮一颗LED灯,在LED点亮执行后,增加了一个200ms的延时,以防止点亮多颗LED。
上面完整代码可以看到,实现LED点亮有两种方案:
方案1:使用if语句进行判断,这种方案当按键按下不放开时,会不断的执行。就像按下电视遥控的音量键一样,不断的增加。在这个实验内就会是按键不断的按顺序点亮后熄灭。
方案2:使用while循环,while循环的判定条件是KEY1==0,即只要K1按键是按下的,都会不断在while循环内执行,只有当按键松开时,才会执行点亮LED。因为按键松开时,会有波形抖动,在执行点亮LED前,增加一个10ms的延时进行按键消抖。方案2相对方案1的区另在于,方案2需要松开按键才会执行点亮LED,因此按键不松开状态下,LED点亮的语句是不会执行。所以做不到按键不松开的不断按顺序点亮后熄灭。但此方法不用担心按键按下到松开的时间内,造成多颗LED点亮的问题。