www.pudn.com > carp.rar > carq.c


	   /********************************************************* 
		*				PULSE SOURCE BY 12F675					* 
		*********************************************************/ 
 
#include  
 
#define		UCHAR		unsigned char 
#define		UINT		unsigned int 
#define		ULONG		unsigned long 
 
#define		PUL5		GPIO5							//脉冲输出 
#define		PUL4		GPIO4							//脉冲输出 
#define		MCLR		GPIO3							//复位 
#define		LED			GPIO2							//备用2 
#define		KR1			GPIO1							//并用 
#define		KR			GPIO0							//键 
#define		INIT_GPIO	0b00001011 
#define		PULSE		TRIS5							//脉冲输出 
#define		INIT_TRIS	0b00111011 
#define		INIT_WPU	0b00110111 
#define 	NOP			asm("nop") 
#define		CLRWDT		asm("clrwdt") 
 
__CONFIG(PWRTEN & INTIO & PROTECT & CPD); 
 
/*************************************************************************/ 
static	UCHAR	MFlage		@	0x5f; 
static	bit		INVALID		@	(unsigned)&MFlage*8+7;		// 
static	bit		PDIS		@	(unsigned)&MFlage*8+6;		// 
static	bit		LEDEN		@	(unsigned)&MFlage*8+5;		// 
static	bit		SCALER 		@	(unsigned)&MFlage*8+3;		// 
static	UCHAR	Key			@	0x5e; 
static	bit		KEYVFY 		@	(unsigned)&Key*8+3;			// 
static	bit		KEYTMP 		@	(unsigned)&Key*8+2;			// 
static	bit		KINIT		@	(unsigned)&Key*8+1;			// 
static	bit		KEY 		@	(unsigned)&Key*8+0;			// 
 
/*************************************************************************/ 
void delay(UCHAR us) 
{ 
	us-=2; 
	do{NOP;} 
	while(--us); 
} 
 
/*************************************************************************/ 
void main(void) 
{ 
	UINT  Valid; 
	UCHAR i; 
 
	CLRWDT; 
	#asm 
		bsf		status,5 
		call	0x3ff 
		movwf	0x10 
		bcf		status,5 
	#endasm 
	GPIO=INIT_GPIO; 
	TRISIO=INIT_TRIS; 
	WPU=INIT_WPU; 
	ANSEL=0b00010000; 
	CMCON=0b00000111; 
	OPTION=0b00000001; 
	T0IE=1; 
	MFlage=0; 
	Key=0; 
	GIE=1; 
	i=200; 
	do{ 
		CLRWDT; 
		delay(250); 
	}while(--i); 
	Valid=EEPROM_READ(1); 
	Valid<<=8; 
	Valid+=EEPROM_READ(0); 
	if(Valid==0xffff) 
		Valid=0; 
	else if(Valid) 
	{ 
		if(Valid==1) 
			INVALID=PDIS=1; 
		else 
			Valid--; 
	} 
	if(KEY) 
	{ 
		KEY=0; 
		Valid=2000; 
		INVALID=PDIS=1; 
	} 
	KINIT=0; 
	EEPROM_WRITE(0,(UCHAR)Valid); 
	EEPROM_WRITE(1,(UCHAR)(Valid>>8)); 
	LEDEN=1; 
	while(1) 
	{ 
		CLRWDT; 
		if(KEY) 
		{ 
			KEY=0; 
			PDIS=!PDIS || INVALID; 
		} 
		else if(KINIT) 
		{ 
			KINIT=0; 
			PDIS=INVALID=0; 
			Valid=0; 
			EEPROM_WRITE(0,0); 
			EEPROM_WRITE(1,0); 
		} 
	} 
} 
/******************************************************************************/ 
void interrupt isr(void) 
{ 
	static UCHAR PulseCnt,AlarmCnt,scaler; 
	static UCHAR KeyCnt,KeyCnt1; 
 
	if(T0IF) 
	{ 
		T0IF=0;TMR0+=6; 
		KEYTMP=!KR; 
		if(KEYTMP && KEYVFY) 
			KeyCnt++; 
		else 
		{ 
			KEYVFY=KEYTMP; 
			KeyCnt=KeyCnt1=0; 
		} 
		if(KeyCnt==60) 
			KEY=1; 
		else if(KeyCnt>=250) 
		{ 
			KeyCnt-=100; 
			if(++KeyCnt1==100) 
				KINIT=1; 
			else if(KeyCnt1==250) 
				KeyCnt1--; 
		} 
		if(++PulseCnt==250) 
			PulseCnt=0; 
		PULSE = PulseCnt<25 && !PDIS; 
		if(++scaler>=12) 
		{ 
			scaler=0; 
			if(PDIS) 
				AlarmCnt++; 
			else 
				AlarmCnt=0; 
		} 
		if(LEDEN) 
			LED = !PDIS || AlarmCnt>=160; 
	} 
}