/* 单片机: PIC12C508/ MDT10P52
功能: 按KEY0 冲汽105S,长按2S结束(第一次按无效)。按下KEY0冲汽,放开不冲汽
按下KEY2放汽,放开不放汽
*/
// C语言版
#include<pic.h>
#define uchar unsigned char
#define key0 GP0 //105S充气开关
#define key1 GP1 //一按一充开关
#define key2 GP2 //一按一放气开关
#define LED0 GP4 //模拟放气LED灯
#define LED1 GP5 //模拟充气LED灯
#define LONG_TIME 1050 //充气时间
#define LONG_AN 20 //长按充气开关时间
bit key0_flag; //按键次数奇偶性
uchar count; //长按充气时间变量
int r;
__CONFIG(0XFF6);
/******************************/
//初始化函数
void Init(void)
{
TRIS = 0xcf; //11001111
LED0 = 0;
LED1 = 0;
key0_flag = 0;
count = 0;
OPTION = 0X4F;
}
/******************************/
/******************************/
//延时100MS时间函数
void delay(void)
{
uchar i,j;
for(i=0;i<50;i++)
for(j=0;j<177;j++) //100m
;
}
void main()
{
Init(); //初始化
while(1)
{
asm("CLRWDT");
if(!key0) //充气按键按下
{
delay();
if(!key0)
{
LED1 = 1; //开始充气
for(r=0;r<LONG_TIME;r++) //延时105S
{
delay();
if(r%20 == 0)
asm("CLRWDT");
if(!key0 && key0_flag) //判断是否为长按
{
count++;
if(count >= LONG_AN)
{
LED1 = 0; //是长按就不充气了
break;
}
}
else
count = 0;
}
LED1 = 0;
LED0 = 0;
while(!key0);
key0_flag = 1;
}
}
if(!key1)
{
delay();
if(!key1)
{
LED1 = 1;
LED0 = 0;
while(!key1);
LED1 = 0;
}
}
if(!key2)
{
delay();
if(!key2)
{
LED0 = 1;
LED1 = 0;
while(!key2);
LED0 = 0;
}
}
}
}
;汇编版
GPIO EQU 06H
TMR0 EQU 01H
STATUS EQU 03H
DEL1 EQU 11H ;时间延时变量
DEL2 EQU 12H
DEL3 EQU 13H
COUNT EQU 14H ;按键KEY0长按时间变量
KEY_NUMBER EQU 15H ;按键KEY0按键次数变量
KEY0 EQU 0 ;按键0,冲汽105S
KEY1 EQU 1 ;按键1,按下冲汽,放开不冲
KEY2 EQU 2 ;按键2,按下放汽,放开不放汽
LED0 EQU 4
LED1 EQU 5
__CONFIG(0XFF6);
ORG 00H
NOP
MOVLW 0CFH ;11001111
TRIS GPIO
MOVLW 47H ;设置定时器
OPTION
MOVLW 0FFH ;初始化变量
MOVWF KEY_NUMBER
START: BCF GPIO,LED0 ;初始化输出口
BCF GPIO,LED1
MOVLW 28H
MOVWF COUNT
CHECK_KEY0: ;判断按键0
BTFSC GPIO,KEY0
GOTO CHECK_KEY1
CALL DELAY
BTFSC GPIO,KEY0
GOTO CHECK_KEY1
INCF KEY_NUMBER ;按键次数加1
BSF GPIO,LED1 ;冲汽
CALL TIME_105S ;延时105S
CHECK_KEY1: ;判断按键1
BTFSC GPIO,KEY1
GOTO CHECK_KEY2
CALL DELAY
BTFSC GPIO,KEY1
GOTO CHECK_KEY2
BSF GPIO,LED1 ;冲汽
KEY1_UP:
BTFSS GPIO,KEY1
GOTO KEY1_UP ;放开按键
BSF GPIO,LED1 ;不冲汽
CHECK_KEY2: ;判断按键2
BTFSC GPIO,KEY2
GOTO START
CALL DELAY
BTFSC GPIO,KEY2
GOTO START
BSF GPIO,LED0 ;按下,放汽
KEY2_UP:
BTFSS GPIO,KEY2
GOTO KEY2_UP
BSF GPIO,LED0 ;放开,不放汽
GOTO START
DELAY: ;按键去斗延时
MOVLW 10H
MOVWF DEL1
DE1: MOVLW 64H
MOVWF DEL2
DE2: DECFSZ DEL2
GOTO DE2
DECFSZ DEL1
GOTO DE1
RETURN
TIME_105S: ;延时105S
CLRF TMR0
MOVLW 02H
MOVWF DEL1
LOOP1: MOVLW 10H
MOVWF DEL2
LOOP2: MOVLW 40H
MOVWF DEL3
LOOP3: CLRF TMR0
;-----------------------------------
MOVLW 00H ;判断KEY0是否为第一次按
SUBWF KEY_NUMBER,0
SKPZ REST
;----------------------------------
BTFSC GPIO,KEY0 ;判断KEY0是否长按2S
GOTO LOOP
DECFSZ COUNT
GOTO LOOP
BCF GPIO,LED1
;--------------------------------
KEY_UP: BTFSS GPIO,KEY0
GOTO KEY_UP
GOTO STOP
REST: MOVLW 28H
MOVWF COUNT
;----------------------------------
LOOP:
MOVLW 0C3H ;定时器延时 195*256=5000MS
SUBWF TMR0,0
SKPZ OK
GOTO LOOP
OK:
DECFSZ DEL3
GOTO LOOP3
DECFSZ DEL2
GOTO LOOP2
DECFSZ DEL1
GOTO LOOP1
STOP: RETURN
END