资源描述
;软件实验〇:发光二极管右移显示
org 0
ajmp main
main:
mov sp,#5fh
mov a,#7fh
loop:
mov p0,a
lcall delay
rr a
ajmp loop
delay:
mov r7,#0
del0: mov r6,#0
del1:
nop
nop
djnz r6,del1
djnz r7,del0
ret
end
;软件实验一:存储器块清零
;将内部RAM从30H开始至5h单元内容清零
ORG 0000H
LJMP START
ORG 0100H
START: mov r0,#30h
mov a,#00h
loop: mov @r0,a
inc r0
cjne r0,#60h,loop
sjmp $
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;将外部RAM从90H开始至0CH单元内容清零
ORG 0000H
LJMP START
ORG 0100H
START: mov r0,#90h
mov a,#00h
loop: movx @r0,a
inc r0
cjne r0,#0c0h,loop
sjmp $
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;将外部RAM从2000H开始的100个单元内容清零
ORG 0000H
LJMP START
ORG 0100H
START: mov dptr,#2000h
mov b,#100
mov a,#00h
loop: movx @dptr,a
inc dptr
djnz b,loop
sjmp $
END
;*******************
Block equ 3000h
mov dptr, #Block ; 起始地址
mov r0, #0ffh ; 清 256 字节
clr a
Loop:
movx @dptr, a
inc dptr ; 指向下一个地址
djnz r0, Loop ; 记数减一
ljmp $
end
;软件实验二:二进制到BCD转换
程序功能:单字节二进制数转换成为压缩BCD码程序
条件: 待转换的单字节二进制数放在累加器A中
结果: 转换后的BCD码十位和个位仍放在累加器A中,百位放在R3中
ORG 0000H
LJMP START
ORG 0100H
START: mov B,#100 ;分离出百位放在R3中
DIV AB
MOV R3,A
mov a,#10 ;余数继续分离
XCH A,B
DIV AB
SWAP A
ORL A,B ;将十位和个位组合成压缩BCD码
sjmp $
END
****************************************
; 将 A 拆为三个 BCD 码, 并存入 Result 开始的叁个单元
Result equ 20h
org 0
ljmp Start
BinToBCD:
mov b, #100
div ab
mov Result, a ; 除以 100, 得百位数
mov a, b
mov b, #10
div ab
mov Result+1, a ; 余数除以 10, 得十位数
mov Result+2, b ; 余数为个位数
ret
Start:
mov sp, #40h
mov a, #123
call BinToBCD
ljmp $
end
;软件实验三:十进制到ASCII码转换
程序功能:给出一个压缩BCD码用逻辑运算方法将其转换成ASCII码程序
条件: 待转换的压缩BCD码放在30h中
结果: 转换后的ASCII码放在30h(高位)和31h(低位)单元中
ORG 0000H
LJMP START
ORG 0100H
START: mov A,30H
MOV B,A
ORL A,#30H
MOV 31H,A
mov a,B
SWAP A
ORL A,#30H
MOV 30H,A
sjmp $
END
;*************************
; 将 A 拆为二个 ASCII 码, 并存入 Result 开始的二个单元
Result equ 20h
org 0
ljmp Start
ASCIITab:
db '0123456789ABCDEF' ; 定义数字对应的ASCII表
BinToHex:
mov dptr, #ASCIITab
mov b, a ; 暂存 A
swap a
anl a, #0fh ; 取高四位
movc a, @a+dptr ; 查ASCII表
mov Result, a
mov a, b ; 恢复 A
anl a, #0fh ; 取低四位
movc a, @a+dptr ; 查ASCII表
mov Result+1, a
ret
Start:
mov sp, #40h
mov a, #1ah
call BinToHex
ljmp $
end
;软件实验四:存储块移动
程序功能:将片外数据存储器2000h单元开始的16个单元的内容移到3000h开始的16个单元中
ORG 0000H
LJMP START
ORG 0100H
START: mov dptr,#2000h
MOV b,#16
mov r0,#30h
loop1: movx a,@dptr
mov @r0,a
inc dptr
inc r0
djnz b,loop1
mov b,#16
mov r0,#30h
mov dptr,#3000h
loop2: mov a,@r0
movx @dptr,a
inc r0
inc dptr
djnz b,loop2
sjmp $
END
;*********************************
; 移动 3000H --> 4000H, 256 字节
mov r0, #30h
mov r1, #00h
mov r2, #40h
mov r3, #00h
mov r7, #0
Loop:
mov dph, r0
mov dpl, r1
movx a, @dptr
mov dph, r2
mov dpl, r3
movx @dptr, a
cjne r1, #0ffh, Goon1
inc r0
Goon1:
inc r1
cjne r3, #0ffh, Goon2
inc r2
Goon2:
inc r3
djnz r7, Loop
ljmp $
end
;软件实验五:
org 0
ljmp Start
Func0: mov a, #0
ret
Func1: mov a, #1
ret
Func2: mov a, #2
ret
Func3: mov a, #3
ret
FuncEnter:
add a, acc ; ajmp 为二字节指令, 调用号 X 2
mov dptr, #FuncTab
jmp @a+dptr
FuncTab:
ajmp Func0
ajmp Func1
ajmp Func2
ajmp Func3
Start:
mov a, #0
call FuncEnter
mov a, #1
call FuncEnter
mov a, #2
call FuncEnter
mov a, #3
call FuncEnter
ljmp $
end
;软件实验六:
数据排序
Size equ 10 ; 数据个数
Array equ 50h ; 数据起始地址
Change equ 0 ; 交换标志
Sort:
mov r0, #Array
mov r7, #Size-1
clr Change
Goon:
mov a, @r0
mov r2, a
inc r0
mov B, @r0
cjne a, B, NotEqual
sjmp Next
NotEqual:
jc Next ; 前小后大, 不交换
setb Change ; 前大后小, 置交换标志
xch a, @r0 ; 交换
dec r0
xch a, @r0
inc r0
Next:
djnz r7, Goon
jb Change, Sort
ljmp $
end
;硬件实验一:跑马灯
count equ 30H
org 0
ajmp main
main:
mov sp,#5fh
mov a,#7fh
loop:
mov p0,a
mov count,#10
lcall deln10ms
rr a
ajmp loop
;*******************************************
; (1) (2) (3) (4) (5) (6) (7)
; t= 1T+( 1T+(1T+ 1T+ 2T )*25 + 2T)*100 + 2T =10303T=10303US=10.03MS
;
;*******************************************
delay10ms:
mov r7,#100 ;1T (1)
del0: mov r6,#25 ;1T (2)
del1:
nop ;1T (3)
nop ;1T (4)
djnz r6,del1 ;2T (5)
djnz r7,del0 ;2T (6)
ret ;2T (7)
;入口参数:COUNT,t=count*10ms
deln10ms:
deln: lcall delay10ms
djnz count,deln
ret
end
跑马灯(左右)
count equ 30H
sel0 equ p3.5
org 0
ajmp main
main:
mov sp,#5fh
setb sel0
clr sel0
mov a,#0feh
right:
rr a
mov p0,a
mov count,#10
lcall deln10ms
jb acc.0,right
left:
rl a
mov p0,a
mov count,#10
lcall deln10ms
jb acc.7,left
ajmp right
;*******************************************
; (1) (2) (3) (4) (5) (6) (7)
; t= 1T+( 1T+(1T+ 1T+ 2T )*25 + 2T)*100 + 2T =10303T=10303US=10.03MS
;
;*******************************************
delay10ms:
mov r7,#100 ;1T (1)
del0: mov r6,#25 ;1T (2)
del1:
nop ;1T (3)
nop ;1T (4)
djnz r6,del1 ;2T (5)
djnz r7,del0 ;2T (6)
ret ;2T (7)
;入口参数:COUNT,t=count*10ms
deln10ms:
deln: lcall delay10ms
djnz count,deln
ret
end
;硬件实验二:4位LED数码管动态显示
SEL0 EQU P3.5
SEL1 EQU P3.7
DISP1 EQU 30H
DISP2 EQU 31H
DISP3 EQU 32H
DISP4 EQU 33H
COUNT EQU 34H
SCAN EQU 20H
SCAN1 EQU 20H.0
SCAN2 EQU 20H.1
SCAN3 EQU 20H.2
SCAN4 EQU 20H.3
ORG 0000H
LJMP MAIN
ORG 001BH
AJMP DISPLAY
MAIN:MOV TMOD,#00010000B
MOV TH1,#0ECH
MOV TL1,#78H
SETB ET1
SETB PT1
SETB EA
SETB TR1
MOV COUNT,#0
CLR SEL0
CLR SEL1
MOV DISP1,#2
MOV DISP2,#0
MOV DISP3,#0
MOV DISP4,#6
WAIT: AJMP WAIT
DISOUT1: MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
SETB SEL1
NOP
CLR SEL1
RET
DISOUT0:MOV A,SCAN
MOV P0,A
SETB SEL0
NOP
CLR SEL0
RET
DISPLAY:MOV TH1,#0ECH
MOV TL1,#78H
PUSH ACC
PUSH PSW
INC COUNT
MOV A,COUNT
CJNE A,#1,NO_DIS1
CLR SCAN1
SETB SCAN2
SETB SCAN3
SETB SCAN4
LCALL DISOUT0
MOV A,DISP1
LCALL DISOUT1
AJMP T1_END
NO_DIS1:CJNE A,#2,NO_DIS2
SETB SCAN1
CLR SCAN2
SETB SCAN3
SETB SCAN4
LCALL DISOUT0
MOV A,DISP2
LCALL DISOUT1
AJMP T1_END
NO_DIS2:CJNE A,#3,NO_DIS3
SETB SCAN2
CLR SCAN3
SETB SCAN2
SETB SCAN4
LCALL DISOUT0
MOV A,DISP3
LCALL DISOUT1
AJMP T1_END
NO_DIS3:MOV COUNT,#0
SETB SCAN1
SETB SCAN2
SETB SCAN3
CLR SCAN4
LCALL DISOUT0
MOV A,DISP4
LCALL DISOUT1
T1_END: POP PSW
POP ACC
RETI
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
;硬件实验三:静态按键、显示实验
SEL0 EQU P3.5
SEL1 EQU P3.7
DISP1 EQU 30H
DISP2 EQU 31H
DISP3 EQU 32H
DISP4 EQU 33H
COUNT EQU 34H
SCAN EQU 20H
SCAN1 EQU 20H.0
SCAN2 EQU 20H.1
SCAN3 EQU 20H.2
SCAN4 EQU 20H.3
SCAN5 EQU 20H.4
SCAN6 EQU 20H.5
SCAN7 EQU 20H.6
ORG 0000H
LJMP MAIN
ORG 001BH
AJMP DISPLAY
MAIN:MOV TMOD,#00010000B
MOV TH1,#0ECH
MOV TL1,#78H
SETB ET1
SETB PT1
SETB EA
SETB TR1
MOV COUNT,#0
CLR SEL0
CLR SEL1
MOV DISP1,#2
MOV DISP2,#0
MOV DISP3,#0
MOV DISP4,#6
WAIT:
LCALL KEY_SCAN
JZ PRO_END
CJNE A,#1,NO_1
MOV DISP1,#1
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_1:
CJNE A,#2,NO_2
MOV DISP1,#2
MOV DISP2,#2
MOV DISP3,#2
MOV DISP4,#2
AJMP PRO_END
NO_2:
CJNE A,#3,NO_3
MOV DISP1,#3
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_3:
CJNE A,#4,NO_4
MOV DISP1,#4
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_4:
PRO_END:
AJMP WAIT
DISOUT1: MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
SETB SEL1
NOP
CLR SEL1
RET
DISOUT0:MOV A,SCAN
MOV P0,A
SETB SEL0
NOP
CLR SEL0
RET
KEY_SCAN:CLR SCAN5
SETB SCAN6
SETB SCAN7
; CLR SCAN6
; CLR SCAN7
LCALL DISOUT0
MOV A,P2
ANL A,#00001111B
CJNE A,#0FH,MAY_KEY
AJMP NO_KEY
MAY_KEY:LCALL DELAY10ms
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,YES_KEY
AJMP NO_KEY
YES_KEY:CJNE A,#0EH,NO_KEY1
MOV A,#1
AJMP KEY_END
NO_KEY1:CJNE A,#0DH,NO_KEY2
MOV A,#2
AJMP KEY_END
NO_KEY2:CJNE A,#0BH,NO_KEY3
MOV A,#3
AJMP KEY_END
NO_KEY3:MOV A,#4
AJMP KEY_END
NO_KEY:MOV A,#0
AJMP KEY_END
KEY_END:RET
DELAY10ms:MOV R6,#250
DEL:MOV R7,#10
DJNZ R7,$
DJNZ R6,DEL
RET
DISPLAY:MOV TH1,#0ECH
MOV TL1,#78H
PUSH ACC
PUSH PSW
INC COUNT
MOV A,COUNT
CJNE A,#1,NO_DIS1
CLR SCAN1
SETB SCAN2
SETB SCAN3
SETB SCAN4
LCALL DISOUT0
MOV A,DISP1
LCALL DISOUT1
AJMP T1_END
NO_DIS1:CJNE A,#2,NO_DIS2
SETB SCAN1
CLR SCAN2
SETB SCAN3
SETB SCAN4
LCALL DISOUT0
MOV A,DISP2
LCALL DISOUT1
AJMP T1_END
NO_DIS2:CJNE A,#3,NO_DIS3
SETB SCAN2
CLR SCAN3
SETB SCAN2
SETB SCAN4
LCALL DISOUT0
MOV A,DISP3
LCALL DISOUT1
AJMP T1_END
NO_DIS3:MOV COUNT,#0
SETB SCAN1
SETB SCAN2
SETB SCAN3
CLR SCAN4
LCALL DISOUT0
MOV A,DISP4
LCALL DISOUT1
T1_END: POP PSW
POP ACC
RETI
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
;扫描更多的按键
SEL0 EQU P3.5
SEL1 EQU P3.7
DISP1 EQU 30H
DISP2 EQU 31H
DISP3 EQU 32H
DISP4 EQU 33H
COUNT EQU 34H
SCAN EQU 20H
SCAN1 EQU 20H.0
SCAN2 EQU 20H.1
SCAN3 EQU 20H.2
SCAN4 EQU 20H.3
SCAN5 EQU 20H.4
SCAN6 EQU 20H.5
SCAN7 EQU 20H.6
ORG 0000H
LJMP MAIN
ORG 001BH
AJMP DISPLAY
MAIN:MOV TMOD,#00010000B
MOV TH1,#0ECH
MOV TL1,#78H
SETB ET1
SETB PT1
SETB EA
SETB TR1
MOV COUNT,#0
CLR SEL0
CLR SEL1
MOV DISP1,#2
MOV DISP2,#0
MOV DISP3,#0
MOV DISP4,#6
WAIT:
LCALL KEY_SCAN
JZ WAIT
CJNE A,#1,NO_1
MOV DISP1,#1
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_1:
CJNE A,#2,NO_2
MOV DISP1,#2
MOV DISP2,#2
MOV DISP3,#2
MOV DISP4,#2
AJMP PRO_END
NO_2:
CJNE A,#3,NO_3
MOV DISP1,#3
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_3:
CJNE A,#4,NO_4
MOV DISP1,#4
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_4:
CJNE A,#5,NO_5
MOV DISP1,#5
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_5:
CJNE A,#6,NO_6
MOV DISP1,#6
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#3
AJMP PRO_END
NO_6:
CJNE A,#7,NO_7
MOV DISP1,#7
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_7:
CJNE A,#8,NO_8
MOV DISP1,#8
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_8:
CJNE A,#9,NO_9
MOV DISP1,#9
MOV DISP2,#1
MOV DISP3,#1
MOV DISP4,#1
AJMP PRO_END
NO_9:
CJNE A,#10,NO_10
MOV DISP1,#10
MOV DISP2,#2
MOV DISP3,#2
MOV DISP4,#2
AJMP PRO_END
NO_10:
CJNE A,#11,NO_11
展开阅读全文