📄 keyscan.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 + -