实验要求:
使用独立按键控制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点亮的问题。