📄 jsq.plm
字号:
START: do;
$INCLUDE(REG51.DCL)
declare ok bit;
declare (ms10,ms100) byte;
declare delay byte;
DECLARE (MODK,SDFLAG,DATA,LONG,K,DAT,ADDRL,addrh,n,I,j,FEND,FDISP) byte;
DECLARE l(8) byte;
declare (dl1,dl2) byte;
DECLARE ACO(11) BYTE CONSTANT (03h,9fh,25h,0dh,99h,49h,
41h,1fh,01h,09h,00h);
declare sda literally 'p13',sclk literally 'p14'; /*24C02囗线定义*/
time0:procedure interrupt 1 using 1;
tr0=0;
tl0=77h;
th0=0ech;
tr0=1;
ms10=ms10+1;
if ms10>=10 then do;
ms10=0;
ms100=ms100+1;
end;
end time0;
DISPLAY:PROCEDURE(L0,L10); /*显示子程序*/
DECLARE (L0,L10) BYTE; /*定义显示二位*/
N=L10; /*最大L10*/
IF MODK=2 THEN
DO; /*十位闪动子程序*/
IF SDFLAG=1 THEN
do;
sbuf=0ffh;
do while ti=0;
end;
sdflag=0; /*闪动标志置0*/
end;
else
do;
n=aco(n); /*十位数BCD码译成段码*/
sbuf=n;
do while ti=0;
end;
sdflag=1; /*闪动标志置1*/
end;
end;
if modk<>2 then
do;
n=aco(n);
sbuf=n;
do while ti=0;
end;
end;
n=L0; /*个位闪动子程序*/
if modk=1 then
do;
if sdflag=1 then
do;
sbuf=0ffh;
do while ti=0;
end;
sdflag=0;
end;
else
do;
n=aco(n);
sbuf=n;
do while ti=0;
end;
sdflag=1;
end;
end;
if modk<>1 then
do;
n=aco(n); /*个位BCD码译码*/
sbuf=n;
do while ti=0;
end;
end;
end display;
sta24: procedure; /*起动24C02*/
call time(2);
sda=1;
call time(2);
sclk=1;
call time(2);
sda=0;
call time(2);
sclk=0;
call time(2);
end sta24;
ask: procedure; /*等待回答*/
call time(2); /*延时*/
sclk=1;
call time(2);
sda=1;
call time(2);
/* do while sda=1;
end; */
call time(2);
sclk=0;
call time(2);
end ask;
stop: procedure; /*停止24C02*/
call time(2);
sda=0;
call time(2);
sclk=1;
call time(2);
sda=1;
call time(2);
sclk=0;
call time(2);
end stop;
shift: procedure(da); /*移位子程序(写入)单字节*/
declare (i,da) byte;
do i=0 to 7;
da=scl(da,1);
sda=cy;
call time(2);
sclk=1;
call time(2);
sclk=0;
call time(2);
end;
end shift;
read: procedure; /*读24C02*/
declare i byte;
do i=0 to 7;
call time(2);
sda=1;
call time(2);
sclk=1;
call time(2);
cy=sda;
call time(2);
dat=scl(dat,1);
call time(2);
sclk=0;
call time(2);
end;
end read;
rd24: procedure;
declare i byte;
call sta24;
addrh=0;
addrh=addrh or 0a0h;
call shift(addrh);
call ask;
call shift(addrl);
call ask;
/* do i=1 to 2; */
call sta24;
call shift(0a1h);
call ask;
call read;
n=dat;
call time(50);
/* end; */
call stop;
end rd24;
wr24: procedure; /*write 24C02 8byte写入子程序 */
declare i byte; /**/
call sta24; /*起动24C02*/
call shift(0A0h); /*写入写指令*/
call ask; /*等待应答*/
call time(4);
call shift(addrl); /*写入首地址*/
call ask; /*等 待*/
do i=1 to 2; /*写入2个字节*/
call shift(L(i));
call ask;
end;
call stop; /*停止24C02*/
call time(200);
end wr24; /*结束写指令*/
key1: procedure; /*数字增加键子程序*/
if p12=0 then
do;
do while p12=0;
end;
if modk=1 then /*如果个位数字闪动*/
DO;
L(1)=L(1)+1; /*个位数加1*/
IF L(1)>9 THEN L(1)=0; /*如果个位数大>9,循环是0*/
END;
if modk=2 then
DO;
L(2)=L(2)+1;
IF L(2)>9 THEN L(2)=0;
END;
call display(L(1),L(2));
call time(200);
call time(200);
DATA=L(1)+L(2)*10;
if ok=0 then addrl=00h;
else addrl=02h;
call wr24;
end;
end key1;
KEY2: PROCEDURE; /*mod */
CALL TIME(250);
IF P33=0 THEN
do;
do while p33=0;
end;
MODK=MODK+1;
IF MODK=3 THEN
do;
modk=0;
DATA=L(1)+L(2)*10;
if ok=0 then addrl=00h;
else addrl=02h;
call wr24;
END;
CALL TIME(200);
CALL DISPLAY(L(1),L(2));
END;
END KEY2;
KEY3: PROCEDURE;
CALL TIME(250);
IF P35=0 THEN
do;
DO WHILE P35=0; /* 无此二句时按下P35键数字连续加上*/
END;
if data>0 then do;
DATA=DATA-1;
L(1)=DATA MOD 10;
L(2)=DATA/10;
IF DATA=00 THEN
DO;
call display(l(1),l(2));
P37=0; /* P37口线低电平,继电器吸合*/
ms10=0;ms100=0;
do while ms100<delay; end;
P37=1; /*P37囗输出为高, 继电器放开 */
/* ================================================================*/
call time(200);
call time(200);
call time(200);
call time(200);
call time(200);
call time(200);
/* ================================================================*/
ADDRL=00H;
CALL RD24;
l(1)=n;
addrl=01h;
call rd24;
l(2)=n;
DATA=L(1)+L(2)*10;
call display(l(1),l(2));
END;
end;
END;
END KEY3;
gal:procedure;
ok=1;
do while p12=0; end;
l(1)=dl1;l(2)=dl2;
call display(dl1,dl2);
LOOP1:
IF P12=0 THEN CALL KEY1;
IF P33=0 THEN CALL KEY2;
CALL DISPLAY(L(1),L(2));
CALL TIME(254);
GOTO LOOP1;
end gal;
MAIN$PROGRAM:
ea=0;
SCON=00h;
PCON=00h;
tmod=11h;
tr0=0;
tl0=77h;
th0=0ech;
tr0=1;
et0=1;
enable;
P1=0FFH;
P35=1;
SCLK=0;SDA=0;
ADDRL=02h;
CALL RD24;
dl1=n;
addrl=03h;
call rd24;
dl2=n;
ok=0;
if p12=0 then call gal;
ADDRL=00h;
CALL RD24;
l(1)=n;
addrl=01h;
call rd24;
l(2)=n;
DATA=L(1)+L(2)*10;
ADDRL=02h;
CALL RD24;
dl1=n;
addrl=03h;
call rd24;
dl2=n;
delay=dl1+dl2*10;
MODK=0;
LOOP:
IF P12=0 THEN CALL KEY1;
IF P33=0 THEN CALL KEY2;
IF P35=0 THEN CALL KEY3;
CALL DISPLAY(L(1),L(2));
CALL TIME(254);
GOTO LOOP;
END START;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -