/**
* 读IO, 用1个按钮控制2个LED灯. 并添加防键盘抖动逻辑.
*/
#include <stdio.h>
#include <reg52.h>
// 10个LED
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
// 定义开关. 低电平有效.
sbit K1 = P3^2;
sbit K2 = P3^5;
void main( void )
{
unsigned char i = 0; // 通过i的值为1还是2来判断按钮的2种控制.
while( 1 )
{
if( !K1 )
{
i++; // 这里需要做防抖动措施. 极度不安全!
}
if(i == 1) // 第1次点
{
P10 = 0; P11 = 1;
}
else if (i == 2)// 第2次点
{
i = 0; // 清零
P10 = 1; P11 = 0;
}
else // 发生了异常咯
{
P12 = 0;
}
}
}
从逻辑上看, 这是可行的, 但很显然没有处理按键抖动, 造成了结果不是预期的. 处理按键抖动的思路 :
在按下的时候产生一个延迟, 在弹起的时候产生一个延迟. 这个延迟就是等待状态稳定, 在延迟的这一小段时间里, 无论无核抖动都不理会
while( 1 )
{
unsigned int n;
if( !K1 )
{
/*
* 这里延迟一小会,在这段时间内, 无论如何抖动都不理会.
* 实际就是在等待按键”按下”稳定下来.
*/
for(n=1000; n>0; n--);
/*
* 这个循环一直在进行, 也就是代码不会往下走了, 除非手松开.
* 实际就是等待按键弹起来. 死等...
*
* 这 个 思 路 超 cool 的 !
*/
while( !K1 );
/*
* 这里延迟一小会,在这段时间内, 无论如何抖动都不理会.
* 实际就是在等待按键”弹起”稳定下来
*/
for(n=1000; n>0; n--);
}
}
那么程序就改进为
/**
* 读IO, 用1个按钮控制2个LED灯. 并添加防键盘抖动逻辑.
*/
#include <stdio.h>
#include <reg52.h>
// 10个LED
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
// 定义开关. 低电平有效.
sbit K1 = P3^2;
sbit K2 = P3^5;
void main(void)
{
bit light = 0; // 初始值设为点亮!
unsigned int n; // 延时使用
while( 1 )
{
if( !K1 )
{
/*
* 这里延迟一小会,在这段时间内, 无论如何抖动都不理会.
* 实际就是在等待按键”按下”稳定下来.
*/
for(n=1000; n>0; n--);
light = ~light; // watch me J !
/*
* 这个循环一直在进行, 也就是代码不会往下走了, 除非手松开.
* 实际就是等待按键弹起来. 死等...
*/
while( !K1 );
/*
* 这里延迟一小会,在这段时间内, 无论如何抖动都不理会.
* 实际就是在等待按键”弹起”稳定下来
*/
for(n=1000; n>0; n--);
}
P10 = light;
}
}
作业
改为4个按键,分别控制4个LED的亮和灭。相当应用到多个房间的单键开关灯共用一个cpu处理
/**
* 读IO, 用1个按钮控制2个LED灯. 并添加防键盘抖动逻辑.
*/
#include <stdio.h>
#include <reg52.h>
// 10个LED
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
// 定义开关. 低电平有效.
sbit K1 = P3^2;
sbit K2 = P3^3;
sbit K3 = P3^4;
sbit K4 = P3^5;
void main(void)
{
bit light1, light2, light3, light4; // 初始值设为点亮!
unsigned int n; // 延时使用
while( 1 )
{
if( !K1 )
{
for(n=1000; n>0; n--);
light1 = ~light1;
while( !K1 );
for(n=1000; n>0; n--);
}
if( ! K2 )
{
for(n=1000; n>0; n--);
light2 = ~light2;
while( ! K2 );
for(n=1000; n>0; n--);
}
if( !K3 )
{
for(n=1000; n>0; n--);
light3 = ~light3;
while( !K3 );
for(n=1000; n>0; n--);
}
if( !K4 )
{
for(n=1000; n>0; n--);
light4 = ~light4;
while( !K4 );
for(n=1000; n>0; n--);
}
P10 = light1;
P11 = light2;
P12 = light3;
P13 = light4;
}
}
MS有点体力劳动, 也许应该抽象一个通过key控制led的函数.