/***********************************************************************
這是可以用于實戰的獨立按鍵程序,有詳細注釋,你看懂就進入中級階段了。
加電LED1~LED4全亮,key1~key4分別控制LED1~LED4熄滅1~4秒,各通路獨立控
制互不影響,延時期間重復按鍵無效。摒棄嚴重影響運行效率的Delay軟件延時。
按鍵和LED端口定義可根據實際電路自行更改
************************************************************************/
#include <reg51.h>
#define uint unsigned int //宏定義無符號整型數據
#define uchar unsigned char //宏定義無符號字符型數據
sbit key1=P3^4; //按鍵端口定義
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit LED1=P1^0; //LED端口定義
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
void key_scan(); //按鍵掃描程序聲明
void Timer0Init(); //初始化定時器程序聲明
bit key1_sign=0,key2_sign=0,key3_sign=0,key4_sign=0;//按鍵自鎖標志
uint sec5ms1=0,sec5ms2=0,sec5ms3=0,sec5ms4=0;//5ms中斷變量
/*******************
主程序
********************/
void main()
{
LED1=0; //初始化LED
LED2=0;
LED3=0;
LED4=0;
Timer0Init(); //初始化定時器程序
while(1)
{
key_scan(); //按鍵掃描程序
}
}
/**************************************************
按鍵掃描程序
**************************************************/
void key_scan() //鍵掃描程序
{
static uchar count1=0,count2=0,count3=0,count4=0;//消抖計數變量
if(key1==0) //按鍵1按下
{
count1++; //消抖計數1自+1
if(count1>=100) //100次檢測按鍵如果為0
{
count1=100; //防止溢出
if(key1_sign==0) //按鍵1自鎖標志為0
{
key1_sign=1; //按鍵1自鎖標志置1
LED1=1; //LED1熄滅
}
}
}
else count1=0; //按鍵1抬起計數1清0
if(key2==0) //按鍵2按下
{
count2++; //消抖計數2自+1
if(count2>=100) //100次檢測按鍵如果為0
{
count2=100; //防止溢出
if(key2_sign==0) //按鍵2自鎖標志為0
{
key2_sign=1; //按鍵2自鎖標志置1
LED2=1; //LED2熄滅
}
}
}
else count2=0; //按鍵2抬起計數2清0
if(key3==0) //按鍵3按下
{
count3++; //消抖計數3自+1
if(count3>=100) //100次檢測按鍵如果為0
{
count3=100; //防止溢出
if(key3_sign==0) //按鍵3自鎖標志為0
{
key3_sign=1; //按鍵3自鎖標志置1
LED3=1; //LED3熄滅
}
}
}
else count3=0; //按鍵3抬起計數3清0
if(key4==0) //按鍵4按下
{
count4++; //消抖計數4自+1
if(count4>=100) //100次檢測按鍵如果為0
{
count4=100; //防止溢出
if(key4_sign==0) //按鍵4自鎖標志為0
{
key4_sign=1; //按鍵4自鎖標志置1
LED4=1; //LED4熄滅
}
}
}
else count4=0; //按鍵4抬起計數4清0
}
/**************************************************
初始化定時器程序 12T 5毫秒@12.000MHz
**************************************************/
void Timer0Init(void) //5毫秒@12.000MHz
{
TMOD = 0x01; //設置定時器模式
TL0 = 0x78; //設置定時初值
TH0 = 0xEC; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
EA=1; //開總中斷
ET0=1; //開定時器0中斷
}
/**************************************************
定時器0中斷服務程序
**************************************************/
void timer0() interrupt 1 //定時器0中斷服務程序
{
TL0 = 0x78; //設置定時重載值
TH0 = 0xEC; //設置定時重載值
if(key1_sign==1) //允許1秒延時計時
{
sec5ms1++; //sec5ms1自+1
if(sec5ms1>=200) //1秒
{
sec5ms1=0; //sec5ms1清0
key1_sign=0; //按鍵1自鎖標志清0
LED1=0; //LED1亮
}
}
if(key2_sign==1) //允許2秒延時計時
{
sec5ms2++; //sec5ms2自+1
if(sec5ms2>=400) //2秒
{
sec5ms2=0; //sec5ms2清0
key2_sign=0; //按鍵2自鎖標志清0
LED2=0; //LED2亮
}
}
if(key3_sign==1) //允許3秒延時計時
{
sec5ms3++; //sec5ms3自+1
if(sec5ms3>=600) //3秒
{
sec5ms3=0; //sec5ms3清0
key3_sign=0; //按鍵3自鎖標志清0
LED3=0; //LED3亮
}
}
if(key4_sign==1) //允許4秒延時計時
{
sec5ms4++; //sec5ms4自+1
if(sec5ms4>=800) //4秒
{
sec5ms4=0; //sec5ms4清0
key4_sign=0; //按鍵4自鎖標志清0
LED4=0; //LED4亮
}
}
}
|