
MOV 20H,R0 ;R0、R1要作为指针,所以内容直接转存到20H、21H
MOV 21H,R1
MOV A,PSW ;RS1,RS0的值代表了当前寄存器组中R0的绝对地址
ANL A,#18H ;取当前寄存器组的绝对地址
ADD A,#2H ;指针指向R2,R0、R1已经处理过了
MOV R0,A ;把当前寄存器组R2的地址送R0,设置指向寄存器的指针
MOV R1,#22H ;设置目标地址指针指向22H
M1: MOV A,@R0 ;22H以后依据题意使用循环,寄存器的内容送A
MOV @R1,A ;A的内容送目标地址
INC R0
INC R1
CJNE R1,#28H,M1 ;R1等于28,所有数据传送完
SJMP $
由于RS1、RS0设计在PSW4和PSW3,因此屏蔽了别的标志位以后,剩下的值就是选中的工作寄存器组的R0的绝对地址。有了绝对地址,就可以使用间接寻址编出循环程序传送数据。
你最好上机模拟运行一下这段程序,仔细调试,就能看懂了。
第一次按下,LED亮,抬起后再次按下,LED灭,依次循环?
;约定低有效
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB ET0
SETB EA
MOV 20H,#0
LOOP:
MOV A,P2
JB ACC0,LP1
JB 00H,LP01
CLR P10
SETB 00H
SJMP LOOP
LP01:
SETB P10
CLR 00H
SJMP LOOP
LP1:
JB ACC1,LP2
JB 01H,LP11
CLR P11
SETB 01H
SJMP LOOP
LP11:
SETB P11
CLR 01H
SJMP LOOP
LP2:
JB ACC2,LP3
JB 02H,LP21
CLR P12
SETB 02H
SJMP LOOP
LP21:
SETB P12
CLR 02H
SJMP LOOP
LP3:
JB ACC3,LP3
JB 03H,LP31
CLR P13
SETB 03H
SJMP LOOP
LP31:
SETB P13
CLR 03H
SJMP LOOP
LP4:
JB ACC4,LP3
JB 04H,LP41
CLR P14
SETB 04H
SJMP LOOP
LP41:
SETB P14
CLR 04H
SJMP LOOP
LP5:
JB ACC5,LP3
JB 05H,LP51
CLR P15
SETB 05H
SJMP LOOP
LP51:
SETB P15
CLR 05H
SJMP LOOP
LP6:
JB ACC6,LP3
JB 06H,LP61
MOV R2,#0
SETB TR0
SETB 06H
SJMP LOOP
LP61:
SETB P16
CLR 06H
CLR TR0
SJMP LOOP
LP7:
JB ACC7,LOOP
JB 07H,LP71
MOV R2,#0
SETB TR0
SETB 07H
LJMP LOOP
LP71:
SETB P17
CLR TR0
CLR 07H
LJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
INC R2
MOV A,R2
CJNE A,#20,T01
T01:
JC T0E
MOV R2,#0
JNB 06H,T02
CPL P16
SJMP T0E
T02: JNB 07H,T0E
CPL P17
T0E:
RETI
END
uchar
code
display_P0[]={
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//P0口由低位向高位依次亮灯(前一位的灯灭)
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//P0口灯全灭
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,,//P0口灯全灭
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//P0口由高位向低位依次亮灯(前一位的灯灭),最后全灭
0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,//P0口由低位向高位依次亮灯(前一位的灯b不灭)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//P0口灯全亮
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//P0口灯全亮
0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,
//P0口灯由高位向低位依次灭(前一位不亮),最后仅剩最低位亮灯。
0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x7F,//P0口以两个亮灯为单位,由低位向高位逐位移动,最后移至最高位,仅剩最高位亮灯。
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
//P0口全灭
0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,//P0口中间两位亮灯,然后两个亮灯分别向两端移动,当分别移至最高位和最低位时,再按原方法返回,返回至起始状态后全灭。
0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,//P0口中间两位亮灯,然后两个亮灯分别向两端扩散,当分别扩散至次高位和次低位时,再按原方法恢复,返回至起始状态后全灭。
0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,//差位两灭,先是最高位亮,然后最高位灭;再变成中间两位灭,其余的全亮;全灭→低四位亮→高四位亮→全灭。
0xFF,0x00,0x00,0xFF,0xFF
};//全灭→全亮→全亮→全灭→全灭
uchar
code
display_P2[]={
//P2口可参照P0口流水灯情况。基本相同。
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,
//
0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
//
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0xFF,
//
0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,
0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,
0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,
0xFF,0x00,0x00,0xFF,0xFF
};
以上就是关于89C51单片机汇编程序题全部的内容,包括:89C51单片机汇编程序题、急求程序,89C51汇编语言写8个按键控制8个LED、高分:89C51单片机流水灯程序求步骤详解,看懂了就给分等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)