/**********************************************************************
独立键盘使用
S2开启数码管计时
S3暂停数码管计时
S4打开所有的LED
S5关闭所有的LED
而且要控制数码管以1S的间隔闪烁
**1.要知道按键按下时存在抖动,就像数码管会有重影一样,要知道消抖
**2.要知道定时器怎么装入初值,根据什么计算初值
**3.要检测是否松开按键
**4.要理解打开所有LED可以直接P1 = 0;但关闭所有LED不能P1= 1
*********************************************************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit we = P2^7;
sbit du = P2^6;
sbit key_2 = P3^0;
sbit key_3 = P3^1;
sbit key_4 = P3^2;
sbit key_5 = P3^3;
uchar code arry[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint i);
void delay(uint i)//软件延时函数
{
uchar a,b;
for(a = i;a > 0;a--){
for(b = 114;b > 0;b--);
}
}
void main()
{
uchar a,b;
TMOD = 0x01;//使定时器工作模式为定时器的方式1
TH0 = 0x4b; //装入初值,使定时50ms(根据晶振的不同,初值不同)
TL0 = 0xfc;
we = 1;
P0 = 0xfe;
we = 0;
while(1){
if(TF0 == 1){//判断定时器是否装满溢出
TH0 =0x4b;
TL0 = 0xfc;
TF0 = 0;
a++; //统计溢出次数
}
if(a == 20){ //溢出次数为20次时,就达到了1s
a = 0; //重置溢出检测值,以进行下1s检测
b++; //秒数计时
}
if(b == 10){ //检测是否已经到了10s
b = 0;
}
du = 1;
P0 = arry[b];
du = 0;
delay(5);
if(key_2 == 0){ //检测是否S2按下
delay(5); //软件消抖(因为按键按下时和松开时,会有抖动,
// 所以软件延时避开抖动时间)
if(key_2 == 0){ //再次检测是否按下
TR0 = 1;//如果按下的话,就打开定时器,开始计时
}
while(!key_2);//松手检测(如果松开的话,会有上拉电阻置1,不松开一直为0)
}
if(key_3 == 0){
delay(5);
if(key_3 == 0){
TR0 = 0; //关闭定时器,暂停计时
}
while(!key_3);
}
if(key_4 == 0){
delay(5);
if(key_4 == 0){
P1 = 0; //因为LED的IO口都在P1,所以将P1直接置1就能打开所有的LED
}
while(!key_4);
}
if(key_5 == 0){
delay(5);
if(key_5 == 0)
P1 = 0xff ;//关闭LED
while(!key_5);
}
}
}