{ if(KC0==0){ fsm_key=FSM_VERFY1; //下一个时间段为确认时间段 kbd_col=0; //记录列号 } else if(KC1==0){ fsm_key=FSM_VERFY1; kbd_col=1; } else if(KC2==0){ fsm_key=FSM_VERFY1; kbd_col=2; } else{ fsm_key=FSM_INIT; } } else{ fsm_key=FSM_INIT; } } break; case FSM_VERFY1: switch(KBD_PORT) { case 0xf8: key_val1=kbd_row*3+kbd_col; break; case 0xf4: key_val1=kbd_row*3+kbd_col; break; case 0xec: key_val1=kbd_row*3+kbd_col; break; default:key_val1=7; break; } KBD_PORT=0xe3; fsm_key=FSM_VERFY2; break;
//如果无按键被按下则返回初始化状态//如果无按键被按下则返回初始化状态 //还原到初始的检测状态 -57-
case FSM_VERFY2: switch(KBD_PORT) { case 0xe2: key_val2=kbd_row*3+kbd_col; break; case 0xe1: key_val2=kbd_row*3+kbd_col; break; default:key_val2=7; break; } fsm_key=FSM_WAIT_RELESE; break; case FSM_WAIT_RELESE: if(!keypress) { //若键盘未释放,则继续保持在键盘释放状态 fsm_key=FSM_INIT; } setDally(4); break; default: fsm_key=FSM_INIT; break; }
if(key_val1!=key_val2) { key_val=7; } else { key_val=key_val1; key_val1=7; key_val2=7; } }
-58-
ORG LJMP ORG LJMP ORG AJMP
F_COMM EQU F_FR EQU F_DF EQU F_W EQU F_COMP EQU F_OK EQU F_CHANGE EQU PRISEH EQU PRISEL EQU
START: MOV MOV MOV MOV MOV MOV SETB SETB SETB SETB CLR CLR CLR CLR CLR CLR MOV MOV CLR
MOV
附录四 前端金属探测部分源程序
0000H
START 000BH ;定时器T0中断程序入口
TT0 0013H INTT1 23H ;标志是否要进行通讯
20H ;标志基准[频率是否顺利获得 21H ;标志是否以获得新探测到的频率 22H ;标志警报的类型(逆磁性还是顺磁性) 24H
;标志探测的频率是否在正常的频率范围25H 26H 49H 50H
SP,#60H P3,#0FFH P1,#0FFH TMOD,#51H SCON,#80H PCON,#80H ET0 EX1 IT1 EA
F_COMM F_FR F_DF F_COMP F_OK
F_CHANGE PRISEH,#2 PRISEL,#1 P1.6
R4,#40 ;r4用来装延时的时间(5ms的整数倍 )
-59-
S1: S2: S3: SS10:
SS7: SS1: SS4: SS2: SS8: SS6: SS5:
WADD:
W1:
LCALL DALLY
LCALL FR_DETECT
JNB F_FR,S1 CLR F_DF
LCALL START_DETECT JNB F_DF,S3 CLR F_DF JNB F_COMM,SS9 JNB F_OK,SS10 ;如果通讯标志为一则发送接通信号MOV R5,#01H MOV R6,#01H LCALL DATACOMM CLR F_OK ACALL P_SET JNB F_CHANGE,SS9 CLR F_CHANGE MOV R5,#01H MOV R6,#01H LCALL DATACOMM
┇ MOV A,40H
CJNE A,42H,SS1 AJMP SS8 JC SS2 ;如果比基准频率大则清零F_W SETB F_W AJMP SS5 CLR F_W AJMP SS5 MOV A,41H
CJNE A,43H,SS6 JC SS2 AJMP SS4
ACALL WORNING AJMP S2 MOV A,R1 ADD A,R2 MOV R1,A JNC W1 INC R0
RET
-60-

