📄 k96.plm
字号:
mp$start: do;
$nolist
$include (reg2051.dcl)
$list
DECLARE Sdata BIT AT(0B2H) REGISTER;
DECLARE Sclk BIT AT(0B3H) REGISTER;
DECLARE Ring BIT AT(0B4H) REGISTER;
DECLARE TOE BIT AT(094H) REGISTER; /* P1$4 -- 16PIN */
DECLARE TAV BIT AT(095H) REGISTER; /* P1$5 -- 17PIN */
DECLARE SUHK BIT AT(096H) REGISTER; /* P1$6 -- 18PIN */
DECLARE LATCH BIT AT(097H) REGISTER; /* P1$7 -- 19PIN */
DECLARE POWER_DOWN_FLAG BIT;
DECLARE (ERROR,COUNT,BUF,VOL) BYTE;
DECLARE DTMF(3) BYTE;
DECLARE SW(3) BYTE;
DECLARE SB(4) BYTE;
DECLARE TRUE BIT;
DECLARE (I,fLAG,N,COT) BYTE IDATA;
DECLARE A BYTE;
DECLARE Z BYTE;
delay:procedure(i);
declare (i,j) byte;
j=0;
lp: call time(200);
j=j+1;
if j<i then goto lp;
END DELAY;
ACSUHK:PROCEDURE;
IF FLAG=0 THEN BUF=0C0H;
ELSE BUF=80H;
END ACSUHK;
WRITEDATA:PROCEDURE(var);
dcl var byte;
CALL ACSUHK;
P1= (VAR AND 0FH) OR BUF;
LATCH=0; LATCH=1;
END WRITEDATA;
READDATA:PROCEDURE;
DECLARE (LOOP,PP) BYTE;
CALL WRITEDATA(00001110B);
SCLK=1;SCLK=0;
CALL WRITEDATA(00001111B);
DO PP=0 TO 2;
SW(PP)=0FFH;
DO LOOP=0 TO 7;
IF SDATA=0 THEN
SW(PP)=SW(PP) AND 0FEH;
SW(PP)=ROL(SW(PP),1);
SCLK=1;SCLK=0;
END;
/* SW(PP)=NOT(SW(PP)); */
SW(PP)=ROR(SW(PP),1);
END;
VOL=SW(2) AND 0FH; /*NOT(SW(2) AND 0FH) AND 0FH*/
SB(0)=SW(0) AND 0FH;
SB(1)=ROR(SW(0),4) AND 0FH;
SB(2)=SW(1) AND 0FH;
SB(3)=ROR(SW(1),4) AND 0FH;
DO PP=0 TO 3;
IF SB(PP)=0 THEN SB(PP)=0AH;
END;
END READDATA;
SENDTOEN:PROCEDURE(number);
dcl (number,TM,CON) byte;
SUHK=0;
TM=2;
IF NUMBER=21 THEN DO;NUMBER=2;TM=3;END;
IF NUMBER=3 THEN TM=3;
IF NUMBER=10 THEN DO;TM=4;NUMBER=4; END;
IF NUMBER=1 THEN DO;NUMBER=2;TM=4;END;
DO WHILE (number>0);
CON=0;
DO CON=0 TO 150;
CALL WRITEDATA(00001101B);
CALL TIME(TM);
CALL WRITEDATA(00001100B);
CALL TIME(TM);
END;
CALL DELAY(TM);
NUMBER=NUMBER-1;
END;
END SENDTOEN;
CLEAN:PROCEDURE;
DCL J BYTE;
DO J=0 TO 2;
DTMF(J)=0FFH;
END;
CALL SENDTOEN(4);
TRUE=1;
END CLEAN;
DDT:PROCEDURE;
DECLARE BEGIN BIT;
BEGIN=0;FLAG=1;
SUHK=0; COUNT=0;TR1=1;
LLP: TRUE=1;
N=0;
DO WHILE (TRUE);
TAV=1;TOE=1;P1$0=1;P1$1=1;
IF TAV=1 THEN DO;TOE=1;DTMF(N)=P1 AND 0FH;
N=N+1;TOE=1;COT=0;
LP: IF TAV=1 THEN GOTO LP;
END;
IF N=3 AND BEGIN=1 THEN TRUE=0;
IF N=4 AND BEGIN=0 THEN DO;
IF DTMF(0)=SB(0) AND DTMF(1)=SB(1) AND DTMF(2)=SB(2) AND DTMF(3)=SB(3)
THEN DO;BEGIN=1;CALL CLEAN;N=0; END;
ELSE DO; CALL SENDTOEN(2);ERROR=ERROR+1;TRUE=1;N=0; END;
END;
IF FLAG=0 OR ERROR=3 THEN DO;CALL SENDTOEN(10);
TRUE=0;SUHK=1;FLAG=0; END;
END;
IF BEGIN=1 THEN DO;
IF (DTMF(0)=0BH AND DTMF(1)=01H AND DTMF(2)=0CH) THEN /* *1# */
DO;CALL WRITEDATA(01H); CALL CLEAN; END;
IF (DTMF(0)=0BH AND DTMF(1)=02H AND DTMF(2)=0CH) THEN /* *2# */
DO;CALL WRITEDATA(03H); CALL CLEAN; END;
IF (DTMF(0)=0BH AND DTMF(1)=03H AND DTMF(2)=0CH) THEN /* *3# */
DO;CALL WRITEDATA(05H); CALL CLEAN; END;
IF (DTMF(0)=0BH AND DTMF(1)=04H AND DTMF(2)=0CH) THEN /* *4# */
DO;CALL WRITEDATA(07H); CALL CLEAN; END;
IF (DTMF(0)=0CH AND DTMF(1)=01H AND DTMF(2)=0CH) THEN /* #1# */
DO;CALL WRITEDATA(00H); CALL CLEAN; END;
IF (DTMF(0)=0CH AND DTMF(1)=02H AND DTMF(2)=0CH) THEN /* #2# */
DO;CALL WRITEDATA(02H); CALL CLEAN; END;
IF (DTMF(0)=0CH AND DTMF(1)=03H AND DTMF(2)=0CH) THEN /* #3# */
DO;CALL WRITEDATA(04H); CALL CLEAN; END;
IF (DTMF(0)=0CH AND DTMF(1)=04H AND DTMF(2)=0CH) THEN /* #4# */
DO;CALL WRITEDATA(06H); CALL CLEAN; END;
IF (DTMF(0)=0CH AND DTMF(1)=0AH AND DTMF(2)=0CH) THEN /* #0# */
DO;
CALL WRITEDATA(00H);CALL WRITEDATA(02H);
CALL WRITEDATA(04H);CALL WRITEDATA(06H);
CALL CLEAN;
END;
IF (DTMF(0)=0BH AND DTMF(1)=0AH AND DTMF(2)=0CH) THEN /* *0# */
DO;CALL SENDTOEN(4);CALL SENDTOEN(10);SUHK=1;TRUE=0;FLAG=0; END;
IF (TRUE=0 AND FLAG=1) THEN
DO;DTMF(0)=0FFH;DTMF(1)=0FFH;DTMF(2)=0FFH; /* BAD */
CALL SENDTOEN(1);ERROR=ERROR+1;
IF ERROR=3 THEN FLAG=0;END;
END;
IF FLAG=1 THEN GOTO LLP;
END DDT;
INTIME0:PROCEDURE;
TMOD=00010101B;COUNT=0;ET1=1;ET0=1;EA=1; SUHK=1; COT=0;
LATCH=1;SCLK=0;TOE=1;TAV=1; TAV=0;ERROR=0;
FLAG=0;TR1=0;
SCON=00H;
TL1=(65535-50000) MOD 256;
TH1=(65535-50000) /256;
TL0=(65535-5) MOD 256; /* RING */
TH0=(65535-5) /256;
TR0=1;
END;
INITIAL:PROCEDURE;
CALL WRITEDATA(0); CALL WRITEDATA(2);
CALL WRITEDATA(4); CALL WRITEDATA(6);
CALL INTIME0;
END INITIAL;
INT0:PROCEDURE INTERRUPT 0 USING 1;
END INT0;
INT1:PROCEDURE INTERRUPT 2 USING 1;
END;
TIME0:PROCEDURE INTERRUPT 1 USING 2;
disable;
DO A=1 TO 100;
CALL TIME(100);
END;
Z=Z+1;
IF Z=VOL THEN DO;
Z=0;
SUHK=0;TR1=1;COUNT=0;FLAG=1; TR0=0;
enable;
END;
return;
END TIME0;
TIME1:PROCEDURE INTERRUPT 3 USING 2;
TL1=(65535-50000) MOD 256;
TH1=(65535-50000) /256;
COT=COT+1;
COUNT=COUNT+1;
TR1=1;
IF (COUNT=255 OR COT=90) THEN DO;FLAG=0; TR1=0; END;
END TIME1;
MP0: DO;Z=0;
POWER_DOWN_FLAG=0;
IF POWER_DOWN_FLAG=0 THEN DO;
CALL READDATA;
CALL INITIAL; END;
SLEEP: P3$7=1;
CALL READDATA;
CALL INTIME0;
PCON=PCON OR 01H;
DO WHILE (FLAG=1);
P3$7=0;
CALL SENDTOEN(4);
CALL DDT;
END;
GOTO SLEEP;
END;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -