小白说:本文说的是一个很简单的例子,请老司机和高手绕道。昨天我们发出去被好多老司机说是小儿科了。本文说的题目是发烧友论坛里“每日一问”精选出来的,会的人看着简单,不会的人还是不会,所以我们写出来给现在还不会的人看。
回到正题,现在我们开始写程序部分。首先说明两点。1、我们本文所写的程序是基于STC15W系列的51单片机的;2、我们所用的程序开发环境是keil 。以下为完整的程序,可以直接复制来用。
- // 按键控制LED闪烁和灭
- //单片机:STC15W408AS
- //调试时间: 2017.2.22
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char i=0;
- void delay_ms(unsigned int x); //ms延时函数
- sbit LED=P1^0; //小灯
- sbit key1=P1^1; //按键
- //************************
- //主函数
- //**************************
- main()
- {
- while(1){ //大循环
- if(key1==0){
- delay_ms(10); //消除抖动
- if(key1==0){
- while(!key1); //等待按键释放
- i++; //记录按键次数
- if(i>1){i=0;}
- }
- }
- if(i==1){ //识别按键次数
- LED=1;
- delay_ms(100);
- LED=0;
- delay_ms(100);
- }
- else {LED=0;}
- }
- }
- //************************
- //ms延时函数,报时用
- //参数:x,x为ms
- //?***********************
- void delay_ms(unsigned int x){
- unsigned int a,b;
- for(a=0;a<x;a++){
- for(b=0;b<110;b++);
- }
- }
在以上程序中,变量i就是我们之前分析里提到的记录按键次数的变量。这里只记录按键按下2次。默认i=0,程序执行while(1)中的第二个if语句后的else语句LED=0,小灯不亮;当按键按下1次后,i=1,在程序中while(1)中的第二个if语句执行LED亮灭亮灭,达到闪烁的效果;当按键第二次按下后,i=2,紧跟着后面有个if(i>1){i=0;} ,这样一来,i=2肯定是大于1,所以i被清零返回默认值0,程序又会执行while(1)中的第二个if语句后的else语句LED=0,小灯不亮;这样一来就题目要求的按键按一下,LED闪烁,按第二次熄灭,这样这样重复操作下去。
在以上的程序中还有一句:while(!key1); 本句是检测按键释放没有的,我们在做按键的自加,或记录一个按键多功能的时候,必须加上按键释放的检测,不然你按一次按键,程序可能识别出好多次。因为我们认为按下一次按键的时间差不多在20ms左右,而程序在这个时间段里执行了好多此了。所以按键次数记录时必须要等按键释放后才加1,识别为一次有效按下。