|
|
長(zhǎng)按3秒開(kāi)機(jī),短按控制LED,請(qǐng)高手分析一下下面這個(gè)程序有沒(méi)有漏洞,假如用來(lái)批量生產(chǎn),是不是可行?//*********************************************************
#include "SYSCFG.h"
#include "FT62F21X.h"
//***********************宏定義****************************
#define KEY_PIN PA4
#define LED1_ON PA0=0
#define LED1_OFF PA0=1
#define LED2_ON PA1=0
#define LED2_OFF PA1=1
volatile unsigned int KEY_COUNT;
volatile unsigned char KEY_LOCK;
volatile unsigned char LED_MODE;
/*----------------------------------------------------
* 函數(shù)名:TIMER0_INITIAL
* 功能: 初始化設(shè)置定時(shí)器
* 設(shè)置TMR0定時(shí)時(shí)長(zhǎng)=(1/系統(tǒng)時(shí)鐘頻率)*指令周期*預(yù)分頻值*TMR0
* =(1/16000000)*4*256*255 = 16ms
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
T0ON = 0;
TMR0 = 0;
T0CON0 = 0B00000000; 01:HIRC
OPTION = 0B00000011;
T0ON = 1;
}
/*-------------------------------------------------
* 函數(shù)名:POWER_INITIAL
* 功能: 上電系統(tǒng)初始化
* 輸入: 無(wú)
* 輸出: 無(wú)
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110000;
INTCON = 0; //暫禁止所有中斷
OPTION = 0;
TRISA = 0B00010000; //1:輸入 0:輸出 PA4-輸出
PORTA = 0B11111111; //1:PAx輸出高電平 0:PAx輸出低電平
WPUA = 0B00010000; //1:使能PA口上拉 0:關(guān)閉PA口上拉
PSRCA = 0;
PSINKA = 0;
}
void KEY_FUNCTION(void)
{
if(KEY_COUNT>10&&KEY_PIN&&KEY_LOCK==0)//短按
{
LED_MODE++;
if(LED_MODE==4)
LED_MODE=0;
KEY_LOCK=1;
}
if(KEY_COUNT>2999&&KEY_LOCK==0)//長(zhǎng)按3秒
{
LED_MODE=0;
KEY_LOCK=1;
}
}
void LED_DRIVE(void)
{
switch(LED_MODE)
{
case 0: LED1_OFF;LED2_OFF;break;
case 1: LED1_ON; LED2_OFF;break;
case 2: LED1_OFF;LED2_ON; break;
case 3: LED1_ON; LED2_ON; break;
default: LED_MODE=0;break;
}
}
/*-------------------------------------------------
* 函數(shù)名:main
* 功能: 主函數(shù)
* 輸入: 無(wú)
* 輸出: 無(wú)
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); //系統(tǒng)初始化
TIMER0_INITIAL();
GIE = 1; //開(kāi)中斷
T0IE = 1; //開(kāi)定時(shí)器/計(jì)數(shù)器0中斷
LED_MODE=0;//上電初始化狀態(tài) led全關(guān)
while(1)
{
KEY_FUNCTION();
LED_DRIVE();
}
}
/*-------------------------------------------------
* 函數(shù)名: interrupt ISR
* 功能: 中斷處理
* 輸入: 無(wú)
* 輸出: 無(wú)
--------------------------------------------------*/
void interrupt ISR(void)
{
if(INTCON & 0x04)
{
INTCON &= ~(1<<2);
TMR0 =10;
if(KEY_PIN==0)
{
if(KEY_COUNT<10000)
KEY_COUNT++;
}
else
{
if(KEY_COUNT>20)
KEY_COUNT=20;
else if(KEY_COUNT>0)
KEY_COUNT--;
}
if(KEY_COUNT==0)
KEY_LOCK=0;
}
} |
|