|
麻煩大佬給看一下,這個(gè)程序中,count賦值大一點(diǎn)(目前是1),按鍵在按的時(shí)候就不正常了,單片機(jī)源碼如下:
#include "reg52.h"
/*宏定義*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) /*1ms timer calculation method in 12Tmode*/
#define const_key_time_short1 60 /*短按的按鍵去抖延時(shí)時(shí)間*/
#define const_key_time_long1 1000 /*長(zhǎng)按的按鍵去抖延時(shí)時(shí)間*/
#define const_key_time_short2 60 /*短按的按鍵去抖延時(shí)時(shí)間*/
#define const_key_time_long2 1000 /*長(zhǎng)按的按鍵去抖延時(shí)時(shí)間*/
/*變量函數(shù)定義及申明*/
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit Key_S1 = P2^4;
sbit Breathe_Led = P0^0;
sbit Led_Red = P0^1;
sbit Led_Green = P0^2;
sbit V_buss = P0^3;
sbit Op_Ion_Fan = P0^4;
unsigned char ucKeySec = 0; /*被觸發(fā)的按鍵編號(hào)*/
unsigned int uiKeyTimeCnt1 = 0; /*按鍵去抖延時(shí)計(jì)數(shù)器*/
unsigned char ucKeyLock1 = 0; /*按鍵觸發(fā)后自鎖的變量標(biāo)志*/
unsigned char ucShortTouchFlag1=0; /*短按觸發(fā)標(biāo)志*/
unsigned int uiVoiceCnt = 0; /*蜂鳴器叫的持續(xù)時(shí)間計(jì)數(shù)器*/
unsigned int number;
unsigned int num;
unsigned int min;
unsigned int count;
unsigned char flag = 0;
unsigned char on_off = 0;
unsigned char flag1 = 0;
void Init_T0(void)
{
TMOD = 0x01; /*set timer0 as mode1 (16-bit)*/
TL0 = T1MS; /*initial timer0 low byte*/
TH0 = T1MS >> 8; /*initial timer0 high byte*/
}
void Init_Peripheral(void)
{
ET0 = 1;/*允許定時(shí)中斷*/
TR0 = 1;/*啟動(dòng)定時(shí)中斷*/
EA = 1;/*開(kāi)總中斷*/
}
void Init(void)
{
Init_T0();
Op_Ion_Fan = 0;
Led_Green = 1;
Led_Red = 1;
Breathe_Led = 1;
}
void Power_off()
{
Op_Ion_Fan = 0;
Led_Red = 1;
Led_Green = 1;
Breathe_Led = 1;
}
void Work_Mode1(void)
{
Op_Ion_Fan = 1;
Led_Red = 1;
Led_Green = 0;
Breathe_Led = 0;
}
void Work_Mode2(void)
{
Op_Ion_Fan = 0;
Led_Red = 1;
Led_Green = 0;
Breathe_Led = 0;
}
void Strong_Mode()
{
Op_Ion_Fan = 1;
Led_Red = 0;
Led_Green = 1;
Breathe_Led = 0;
}
void Key_Scan(void)
{
/*掃描S1*/
if(Key_S1 == 1) /*如果按鍵沒(méi)有被按下,將一些標(biāo)志位及時(shí)清零*/
{
ucKeyLock1 = 0;/*自鎖標(biāo)志位清0*/
uiKeyTimeCnt1 = 0;/*按鍵去抖延時(shí)計(jì)數(shù)器清零*/
if(ucShortTouchFlag1 == 1)/*短按*/
{
ucShortTouchFlag1 = 0;
ucKeySec = 1; /*觸發(fā)S1短按*/
}
}
else if(ucKeyLock1 == 0) /*如果有按鍵按下,且是第一次按下*/
{
uiKeyTimeCnt1 ++;
if(uiKeyTimeCnt1 > const_key_time_short1)/*判定短按*/
{
ucShortTouchFlag1 = 1;/*激活短按有效標(biāo)志位*/
}
if(uiKeyTimeCnt1 > const_key_time_long1)/*判定長(zhǎng)按*/
{
ucShortTouchFlag1 = 0;/*清除短按有效標(biāo)志位*/
uiKeyTimeCnt1 = 0;
ucKeyLock1 = 1;/*自鎖按鍵置位,避免一直觸發(fā)*/
ucKeySec = 2; /*觸發(fā)S1長(zhǎng)按*/
}
}
}
void key_Service(void)
{
if((ucKeySec == 2) && (on_off == 0) )/*開(kāi)機(jī)并確定是否為USB供電*/
{
on_off = 1;
ucKeySec = 0;
flag = 1;
}
if((ucKeySec == 2) && (on_off == 1))
{
on_off = 0;
Power_off();
ucKeySec = 0;
}
if((on_off == 1) && (flag1 == 0)&& (flag == 1) && (count >= 1))
{
flag1 = 1;
count = 0;
Work_Mode1();
}
if((on_off == 1) && (flag1 == 1) && (flag == 1) && (count >= 1))
{
flag1 = 0;
count = 0;
Work_Mode2();
}
if((ucKeySec == 1) && (on_off == 1) && (flag == 1))
{
flag = 0;
Strong_Mode();
ucKeySec = 0;
}
if((ucKeySec == 1) && (on_off == 1) && (flag == 0))
{
flag = 1;
ucKeySec = 0;
}
}
void ISR_T0(void) interrupt 1
{
TF0 = 0; /*清除中斷標(biāo)志*/
TR0 = 0; /*關(guān)中斷*/
/*掃描按鍵*/
Key_Scan();
TL0 = T1MS; /*initial timer0 low byte*/
TH0 = T1MS >> 8; /*initial timer0 high byte*/
TR0 = 1; /*開(kāi)中斷*/
number++;
if(number >= 100)
{
num++;
number = 0;
}
if(num>=10)
{
num = 0;
count ++;
}
}
void Delay_Long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i<uiDelayLong;i++)
{
for(j=0;j<500;j++) /*內(nèi)嵌循環(huán)的空指令數(shù)量*/
{
; /*一個(gè)分號(hào)相當(dāng)于執(zhí)行一條空語(yǔ)句*/
}
}
}
/*主函數(shù)*/
void main()
{
/*單片機(jī)初始化*/
Init();
/*延時(shí),延時(shí)時(shí)間一般是0.3-2秒之間,等待外圍芯片和模塊上電穩(wěn)定*/
Delay_Long(100);
/*單片機(jī)外圍初始化*/
Init_Peripheral();
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
P2 = 0xF7;
while(1)
{
/*按鍵服務(wù)函數(shù)*/
key_Service();
}
}
|
|