⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyscan.c

📁 空调遥控器编程实例
💻 C
字号:
#pragma	NOP
#pragma	DI
#pragma EI
#pragma sfr
#pragma	asm
#pragma	INTERRUPT INTKR00	keyscan
/*#pragma	INTERRUPT INTKR00	keyscan1*/
#pragma	INTERRUPT INTWDT watchdoginterval

/*#pragma INTERRUPT INTWTI	watchinterval*/
/*#include	"typed.h"*/
#include  "statusdd.inc"
	void	keyscansub();
extern	unsigned int	fiveseconddelay;
extern	unsigned int	threeseconddelay;
extern	unsigned char	halfseconddelay;
extern	bit	codedelay,hastimeset,specialfunctionflag,codeintflag,codeend,waitcodesend,ADintervaltimer;
extern	bit	sendcodeflag,codesendfinish,firstcopy,haschanged/*temperaturejust/*,sendkeyremember*/;
extern  unsigned char	sensorcodeno;

	sreg	unsigned char	i;
	sreg	unsigned char	lastkey;
	sreg	unsigned	char	oldkeyno;
	sreg	unsigned 	char	keyscantime;
	sreg	unsigned	char	keypressedcount;
	sreg	unsigned 	char	keyinputport;
	/******************************/
/*	sreg	unsigned 	char	sP41;*/
/*	sreg	unsigned 	char	sP42;*/
/*	sreg	unsigned 	char	sP43;*/
/*	sreg	unsigned 	char	sP44;*/
	/******************************/
	sreg	bit		newkeypress;
	sreg	bit		keyaffirmed;
	sreg	bit		keyupflag;
	sreg	bit		continouskey;
	sreg	bit		doublekey;
	sreg	bit		keychanged;
	sreg	bit		pretimecount;

void	keyscan()
{
/*	RUN=1;*/
/*	KRMK00=1;*/
	KRM00=0;
	WDTMK=0;
/*	WTIMK=0;
	WTM0=1;
	/***************/
	#asm
	MOV	A,MK0
	PUSH	AX
	#endasm
	if(TMMK30)
	{
		MK0=0xff;
	}
	else
	{
		MK0=0xef;
	}
	
/*******************************/
	EI();
	i=0x08;
	lastkey=0;
	continouskey=0;
	fiveseconddelay=0;
	keypressedcount=0;
	keyscantime=0;
	
	keyscansub();
	lastkey=oldkeyno;
	RUN=1;
	#asm
		POP	ax
		mov	MK0,A
	#endasm
}

void	watchdoginterval()
{
		#asm
		MOV	A,MK0
		PUSH	AX
		#endasm
		if(TMMK30)
		{
			MK0=0xff;
		}
		else
		{
			MK0=0xef;
		}
		EI();	
		if(i==0x0c)
		{
			if((pretimecount&&codesendfinish)||sensorcodeno!=0)
			{
				TMIF30=0;
				DI();
				#asm
					POP	AX
					MOV	MK0,A
				#endasm
				TMMK30=0;
				#asm
				MOV	A,MK0
				PUSH	AX
				#endasm
				if(TMMK30)
				{
					MK0=0xff;
				}
				else
				{
					MK0=0xef;
				}
				EI();
				TMC30=0X88;
				CR30=0X17;	/*header is 1.5ms high*/
				TCE30=1;
				i=0;
				PM6=0x02;		/*port6.0 output */
				P6.0=0;			/*LOW level*/
		/*		P6.0=1;			/*HIGH level*/
				waitcodesend=1;
				pretimecount=0;
				if(sensorcodeno==2)
				{
					sendcodeflag=1;
				}
				codeend=0;
				#asm
					POP	AX
					MOV	MK0,A
				#endasm
				return;
			}
		}
		else
		{
			if(continouskey||doublekey)
			{
				if(i<0x0a)
				{
					if(firstcopy)
					{
						i++;
						#asm
						POP	ax
						MOV	MK0,A
						#endasm
						return;
					}
				}
				if(i==0x0a)
				{
					keyscantime=1;
					firstcopy=0;
				}			
			}
			else
			{
				if(sensorcodeno==1)
				{
					i++;
					#asm
					POP	ax
					MOV	MK0,A
					#endasm
					return;
				}
			}
		}
	i++;
	if(i==0x0d)
	{
		i=0;
	}
	keypressedcount=0;
	keyscansub();
	if(keypressedcount==0)
	{
		fiveseconddelay++;
		if(fiveseconddelay>610)
		{
			fiveseconddelay=610;
		}
		
	}
		while(keyscantime<=1)
		{
			if(lastkey==oldkeyno)
			{
				keyscantime++;
			}
			else
			{
				continouskey=1;
				keyscantime=0;
				i=8;
		/*		keychanged=1;*/
				/*keyscantime=1;
				i=0x0a;*/
				lastkey=oldkeyno;
			}
			goto	nextprog;
			
		}
		if(keyscantime==2)
		{
			keyscantime++;
			if(keypressedcount==1)
			{
				if(threeseconddelay==0)
				{
					if(!doublekey)
					{
						keyaffirmed=1;
						pretimecount=1;
						if((keyupflag==1)/*||(keychanged==1)*/)
						{
							keyupflag=0;
							/*keychanged=0;*/
							newkeypress=1;
						}
					}

				}
				else
				{
					threeseconddelay=1;
				}
			}
			else
			{
				if(keypressedcount==0)
				{
					lastkey=0;
					i=0x08;
					keyupflag=1;
					doublekey=0;
					continouskey=0;
					haschanged=0;
					/*temperaturejust=0;*/
					threeseconddelay=0;
					DI();
					#asm
					POP	AX
					MOV	MK0,A
					#endasm
					KRM00=1;
					KRIF00=0;
					KRMK00=0;
					PM0=0xf0;
					P0=0;
					#asm
					MOV	A,MK0
					PUSH	AX
					#endasm
					if(TMMK30)
					{
						MK0=0xff;
					}
					else
					{
						MK0=0xef;
					}				
					EI();				
				}
				else
				{
					if((keypressedcount==2)&&(oldkeyno==changeID))/*&&!temperaturejust)*/
					{
						threeseconddelay++;
						if(threeseconddelay==29)
						{
							keyaffirmed=1;
						}
						if(threeseconddelay>30)
						{
							threeseconddelay=30;
						}
						
						doublekey=1;
						
					}
					else
					{
						threeseconddelay=0;
						keyaffirmed=0;
						keyupflag=0;
						continouskey=0;
						doublekey=1;
						pretimecount=0;
					}
				}
			}
		}
	
nextprog:
	#asm
		POP	ax
		mov	MK0,A
	#endasm
}
void keyscansub()
{
	keypressedcount=0;
	oldkeyno=0;
	P0=0X0F;
	PM0=0XF7;
	P0=0x07;
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	
	keyinputport=P4;
/*	keyinputport=sP41;*/
	P0.3=1;
	if (!keyinputport.3) {oldkeyno=4;keypressedcount++;}
	if (!keyinputport.2) {oldkeyno=8;keypressedcount++;}
	if (!keyinputport.1) {oldkeyno=12;keypressedcount++;}
	if (!keyinputport.0) {oldkeyno=16;keypressedcount++;}
	PM0=0XFB;
	P0=0X0B;
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	
	keyinputport=P4;
/*keyinputport=sP42;*/
	P0.2=1;
	if (!keyinputport.3) {oldkeyno=3;keypressedcount++;}
	if (!keyinputport.2) {oldkeyno=7;keypressedcount++;}
	if (!keyinputport.1) {oldkeyno=11;keypressedcount++;}
	if (!keyinputport.0) {oldkeyno=15;keypressedcount++;}
	PM0=0XFD;
	P0=0X0D;
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	
	keyinputport=P4;
/*keyinputport=sP43;*/
	P0.1=1;
	if (!keyinputport.3) {oldkeyno=2;keypressedcount++;}
	if (!keyinputport.2) {oldkeyno=6;keypressedcount++;}
	if (!keyinputport.1) {oldkeyno=10;keypressedcount++;}
	if (!keyinputport.0) {oldkeyno=14;keypressedcount++;}
	PM0=0XFE;
	P0=0X0E;
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();	
	
	keyinputport=P4;
/*keyinputport=sP44;*/
	P0.0=1;
	if (!keyinputport.3) 
	{
		if(oldkeyno==2)
		{
			oldkeyno=17;
		}
		else
		{
			oldkeyno=1;
		}
		keypressedcount++;
	}
	if (!keyinputport.2) {oldkeyno=5;keypressedcount++;}
	if (!keyinputport.1) {oldkeyno=9;keypressedcount++;}
	if (!keyinputport.0) {oldkeyno=13;keypressedcount++;}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -