以下这个程序我在实验箱上运行过,AT89C52功能:根据P2.X口的电平,若输入为1,则有X个灯在P0P1口上循环
;输入为开关按键
ORG 0000H
JMP8: MOV P2,#0FFH ;将所在口置1,即设为输入方式
MOV A,#0 ;初始化R1
MOV R1,A
JB P2.0,SHOW1 ;判断P2口,若为1则转入相应的处理程序
JB P2.1,SHOW2
JB P2.2,SHOW3
JB P2.3,SHOW4
JB P2.4,SHOW5
JB P2.5,SHOW6
JB P2.6,SHOW7
JB P2.7,SHOW8
JMP JMP8
;P2口对应的处理部分
SHOW1:MOV A,#1
MOV R0,A
ACALL PRO ;PRO为处理子程序
SHOW2:MOV A,#2
MOV R0,A
ACALL PRO
SHOW3:MOV A,#3
MOV R0,A
ACALL PRO
SHOW4:MOV A,#4
MOV R0,A
ACALL PRO
SHOW5:MOV A,#5
MOV R0,A
ACALL PRO
SHOW6:MOV A,#6
MOV R0,A
ACALL PRO
SHOW7:MOV A,#7
MOV R0,A
ACALL PRO
SHOW8:MOV A,#8
MOV R0,A
ACALL PRO
RET
PRO:ACALL OUT ;OUT为向P2口输出子程序
CLR 20H ;将位20H作为是否跳到JMP8的标志,1则跳转
ACALL PP ;PP为判断P2口是否有新的按键
JB 20H,JMP8
ACALL XG ;XG为修改R1R0的值
JMP PRO
RET
OUT:MOV A,R1
MOV P1,A
MOV A,R0
MOV P0,A
ACALL DELAY ;DELAY为延时1024us的子程序
RETDELAY:MOV A,#0FFH
MOV R3,A
TT1:NOP
NOP
NOP
NOP
DJNZ R3,TT1
RET
PP: JB P2.0,S
JB P2.1,S
JB P2.2,S
JB P2.3,S
JB P2.4,S
JB P2.5,S
JB P2.6,S
JB P2.7,S
SETB 20H
S:RET
XG: MOV A,R1 ;将R1R0十六位进行循环移位
MOV C,ACC.7
MOV A,R0
RLC A
MOV R0,A
MOV A,R1
RLC A
MOV R1,A
RET
END