來源:網(wǎng)上轉(zhuǎn)載 作者:不詳 /************** YTREM.PLM ********************/ /* 遙控器按鍵代碼表(熊貓 M50462/CL54L2) */ /* 1---00h;2---10h;3---08h;4---18h;5---04h;6---14h;7---0ch;8---1ch; */ /* 9---80h;0---90h;1+---88h;2+---98h;pd+---50h;pd_---48h;ld+---0cch; */ /* ld_---0dch;yl+---44h;yl_---54h;sd+---0c4h;sd_---0d4h;BZ---0D0h; */ /* TV/AV---5CH;PX---D8H;-->.<-- ---0D0H;CLK---0E8H;*/ /* TIME---0F8H;ON.T---0E4H;SEL---0F4H;INC---0ECH; */ start:do; $include(reg51.dcl) declare (data1,data2,key,DAT) byte at (30h); declare (ah,al,NUMBER,jihao,bjihao) byte; declare Ale literally 'p17',da literally 'p15',clk literally 'p16'; DECLARE ACO(11) BYTE CONSTANT (0EDH,28H,0DCH,7CH,39H,75H,0F5H,2CH, 0FDH,7DH,02H); DISPLAY: PROCEDURE(NUM); DECLARE (K,NUM,N) BYTE; N=NUM; N=N MOD 10; N=ACO(N); DO K=0 TO 7; N=SCR(N,1); DA=CY; CLK=0; call time(1); CLK=1; END; N=NUM; N=N/10; N=ACO(N); DO K=0 TO 7; N=SCR(N,1); DA=CY; CLK=0; call time(1); CLK=1; END; ALE=0; call time(2); ALE=1; END DISPLAY; YTNUMBER: procedure(kk); declare (kk,relay) byte; if kk=02 then DO; NUMBER=NUMBER+1; IF NUMBER>4 THEN NUMBER=1; END; if kk=01 then DO; NUMBER=NUMBER-1; IF NUMBER=0 THEN NUMBER=4; END; CALL DISPLAY(NUMBER); KEY=0; data2=0; END YTNUMBER; recieve: procedure interrupt 4 using 1; declare (k,ask) byte; disable; if data2=0e2h and dat<>0 then do; ri=0; jihao=sbuf; if jihao=bjihao then do; data2=0; p32=1; do k=1 to 2; if k=1 then sbuf=dat; if k=2 then sbuf=number; do while ti=0; end; ti=0; call time(1); end; p32=0; do while ri=0; end; ri=0; ask=sbuf; if ask=0ffh then do; ; end; /* data1=0ffh;dat=0; */ end; end; enable; end recieve; rem:procedure interrupt 2; declare k byte; disable; /* if data2=0e2h then goto int0end; */ k=16; loop1: call time(2); do while p33=0; end; th0=0; tl0=0; tr0=1; call time(2); do while p33=1; end; tr0=0; ah=th0; al=tl0; if ah>=4 then cy=1; /* 11.0592Mhz */ else cy=0; data1=scl(data1,1); k=k-1; if k=8 then data2=data1; if k<>0 then goto loop1; if data2=0e2h then do; IF DATA1=54H THEN do;KEY=01;dat=0;end; /* YTNUMBER DEC KEY */ IF DATA1=44H THEN do;KEY=02;dat=0;end; /* YTNUMBER ADD KEY */ IF DATA1=00H THEN DAT=1; IF DATA1=10H THEN DAT=2; IF DATA1=08H THEN DAT=3; IF DATA1=18H THEN DAT=4; IF DATA1=04H THEN DAT=5; IF DATA1=14H THEN DAT=6; IF DATA1=0CH THEN DAT=7; IF DATA1=1CH THEN DAT=8; IF DATA1=80H THEN DAT=9; IF DATA1=90H THEN DAT=10; IF DATA1=88H THEN DAT=11; IF DATA1=98H THEN DAT=12; IF DATA1=50H THEN DAT=13; IF DATA1=48H THEN DAT=14; IF DATA1=40H THEN DAT=15; IF DATA1=4CH THEN DAT=16; IF DATA1=5CH THEN DAT=17; IF DATA1=0D8H THEN DAT=18; IF DATA1=0D0H THEN DAT=19; IF DATA1=0E8H THEN DAT=20; IF DATA1=0F8H THEN DAT=21; IF DATA1=0E4H THEN DAT=22; IF DATA1=0F4H THEN DAT=23; IF DATA1=0ECH THEN DAT=24; /* P34=0;CALL TIME(250);P34=1; */ end; int0end: ip=0; DO K=0 TO 3; /* important value */ CALL TIME(250); END; enable; end rem; main$program: data1=0;data2=0;dat=0; p32=0; /* set recieve mode */ clk=1;Ale=1; p33=1;NUMBER=1;KEY=0; scon=50h; pcon=00h; tmod=21h; tl1=0fdh; /* 9600 baud rate for 11.0592Mhz */ th1=0fdh; th0=0; tl0=0; tr1=1; es=1; ex1=1; bjihao=1; enable; call DISPLAY(NUMBER); DO WHILE 1=1; IF KEY=01 OR KEY=02 THEN DO; CALL YTNUMBER(KEY); END; end start; |