MOV R7,#05H ANL A, #0FH MOV R0,#20H ADD A,#30H MOV R1,#25H MOV @R1,A NET: MOV A,@R0 INC R0 ANL A,#0F0H INC R1 SWAP A DJNZ R7,NE ADD A,#30H SJMP $ MOV @R1,A END INC R1
3.7 片内RAM间址寄存器只能有R0和R1两个,而正数、负数和零共需3个寄存器指示地址,这时可用堆栈指针指示第三个地址,POP和PUSH在指令可自动修改地址。R0指正数存放地址和R1指负数存放地址 ,SP指源数据存放的末地址,POP指令取源数据,每取一个数地址减1。
ORG 0000H MOV R7,#10H MOV A,#0 MOV @R0,A MOV R4,A INC R0 MOV R5,A AJMP DJ MOV R6,A NE: INC R5 MOV R0,#40H MOV @R1,A MOV R1,#50H INC R1 MOV SP,#3FH AJMP DJ NEXT: POP ACC ZER0: INC R6 JZ ZER0 DJ: DJNZ R7,NEXT JB ACC.7,NE SJMP $ INC R4 END3.8 可直接用P标志判断(JB P ,ret)
ORG 0000H
MOV A,40H JB P,EN ;奇数个1转移 ORL A,#80H ;偶数个1 最高位加“1” EN: SJMP $
3.9 取补不同于求补码,求补码应区别正、负数分别处理,而取补不分正、负,因正、负数均有相对
于模的补数。用取反加1求补也可用模(00H)减该数的方法求补。 ORG 0000H MOV R7,#03H AB: INC R0 MOV R0,#DAT A MOV A,@R0 MOV A,@R0 CPL A CPL A ADDC A,#0 ADD A,#01 DJNZ R7,AB MOV @R0,A SJMP $
3.10 16个单字节累加应用ADD指令而不能用ADDC指令,和的低位存A,当和超过一个字节,和的高
字节存于B,并要加进低位相加时产生的进位,16个单字节加完后,采用右移4次进行除十六求平均值的运算,商在BUF2单元,余数在BUF2-1单元。
ORG 0000H ADDC A,#0 MOV R7,#0FH MOV B,A MOV R0,#BUF1 DJNZ R7,NEXT MOV B,#0 ;以上完成求和 MOV A,@R0 MOV R6,#04H MOV R2,A MOV BUF2,A NEXT: MOV A,R2 MOV BUF2-1,#0
INC R0 NEX: CLR C ADD A,@R0 MOV A,B MOV R2,A RRC A MOV A,B MOV B,A
MOV A,BUF2 MOV BUF2-1,A RRC A DJNZ R6,NEX MOV BUF2,A SJMP $ MOV A,BUF2-1 ;以上完成除十六运算RRC A
3.11 将20H单元的内容分解为高4位和低4位,根据是否大于9分别作加37H和30H处理。
ORG 0000H MOV 21H,A MOV A,20H SJMP $ ANL A,#0F0H ASCII: CJNE A,#0AH,NE SWAP A NE: JC A30 ACALL ASCII MOV 22H,A MOV A,20H A30: ANL A,#0FH ACALL ASCII
3.12 要注意,位的逻辑运算其中一个操作数必须在C。
ORG 0000H MOV C,20H ANL C,2FH CPL C ORL C,/2FH 3.13 ORG 0000H MOV C,ACC.3 ANL C,P1.4 ANL C,/ACC.5 MOV 20H,C MOV C,B.4 CPL C
ANL C,/P1.5 ORL C,20H MOV P1.2,C SJMP $ END
ADD A,#37H RET ADD A,30H RETCPL C
ANL C,53H MOV P1.0,C
SJMP $
END 3.14 设一字节乘数存放在R1,三字节的被乘数存放在data开始的内部RAM单元,且低字节存放
在低位地址单元,R0作为被乘数和积的地址指针,用MUL指令完成一字节乘一字节,每一次部分积的低位加上一次部分积的高位,其和的进位加在本次部分积的高位上,并暂存,三字节乘一字节共需这样三次乘、加、存操作,以R7作循环三次的计数寄存器。 ORG 0000H
MOV R7,#03H MOV R0,#data MOV R2,#0 MOV B,R1 MUL AB ADD A,R2 MOV @R0,A
MOV A,#0 ADDC A,B MOV R2,A INC R0 DJNZ R7,NEXT MOV @R0,B SJMP $ END
NEXT: MOV A,@R0
第4章、并行接口P0-P3和单片机的中断系统
4.1~4.3 参考教材4.1节
4.4 用P1.7监测按键开关,P1.0引脚输出正脉冲,正脉冲的产生只需要将P1.0置零、置1、延时、再置零即可。P1.0接一示波器可观察波形。如果再接一发光二极管,可观察到发光二极管的闪烁。电路设计可参考图4.4 汇编语言程序
ORG 0000H
ABC: CLR P1.0 SETB P1.7
JB P1.7,$ ;未按键等待
SETB P1.0 MOV R2,#0 NOP
DJNZ R2,DAY SJMP ABC
图4.4
JNB P1.7,$ ;键未弹起等待
DAY: NOP
4.5 电路见图4.5, 初始值送0FH到P1, 再和0FFH异或从P1口输出,或使用SWAP A指令,然后从P1口输出,循环运行,要注意输出后要延时。 汇编语言程序
ORG 0000H
MOV A,#0FH ABC: MOV P1,A
ACALL D05 SWAP A SJMP ABC
D05: MOV R6,250 DY: MOV R7,250 DAY:
NOP
DJNZ R7,DAY
NOP
图4.5
DJNZ R6,DY RET END
4.6 如使用共阴极数码管,阴极接地,阳极a~g分别接P0~P3的某个口的7位,将0~F的段码列
成表,表的内容顺次从该口输出。如数码管接P3口。 汇编语言程序
NEXT:
DAY:
ORG 0000H MOV DPTR,#TAB MOV A,R0
MOVC A,@A+DPTR MOV P3,A MOV R7,#0 NOP
TAB:
NOP
DJNZ R7,DAY INC R0
CJNE R0,#10H,NEXT SJMP AGAIN
DB 3FH,06H… ;段码表(略) END
AGAIN: MOV R0,#0
4.7电路设计见图4.7,编程如下:
ORG 0000H
MOV A,#08H MOV DPTR,#TAB MOV P1,A MOV R2,#08H
MOVC A,@A+DPTR
AGAIN: MOV A,#01 NEXT: MOV P3,A
ACALL DAY RL A
CJNE A,#10H,NEXT DJNZ R2,AGAIN SJMP $
图4.7
END
TAB: DB 3FH,06H···
4.8 P1口的八根线接行线,输出行扫描信号,
P3口的八根线接列线,输入回馈信号。 见图4.8。 4.9~4.12参见4.2节 4.13 电路设计见图4.13
汇编语言程序
ORG 0000H
AJMP MAIN ORG 0003H
RL A ;中断服务 MOV P1,A RETI
图4.8
MAIN: MOV A,#0FEH