程序如下:
ORG 0200H VAR DATA 20H FUNC DATA 21H
MOV A,VAR ;A<--(20H) CJNE A,#50H ,NEXT1 ;建立Cy
NEXT1: JNC DONE ;若X>=50,则DONE CJNE A,#20H,NEXT2 ;建立Cy
NEXT2: JC NEXT3 ;若X<20,则NEXT3 RL A ;若X>19,则A=5X RL A
ADD A,20H ;A<--5X SJMP DONE
NEXT3: RL A ;A<--2X
DONE: MOV FUNC ,A ;21H<--A SJMP $ END 实验程序: 1.存储块清零
Block equ 4000h
mov dptr, #Block ; 起始地址 mov r0, #0 ; 清 256 字节 clr a Loop:
movx @dptr, a
inc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一 ljmp $ end
1,二进制到ASCII码转换
将 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 2.程序跳转表
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 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
3.数据排序
Size equ 10 ; ajmp 为二字节指令, 调用号 X 2 ; 数据个数
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
4. IO口输入输出 Loop: mov a, #01h mov r2, #8 Output: mov p1,a rr a call Delay djnz r2,Output ljmp loop Delay: mov r6, #0 mov r7, #0 DelayLoop:
djnz r6, DelayLoop djnz r7, DelayLoop ret end
5. KeyLeft equ P1.0
; 前小后大, 不交换 ; 前大后小, 置交换标志 ; 交换
KeyRight equ P1.1 LedLeft equ P1.2 LedRight equ P1.3
SETB KeyLeft SETB KeyRight Loop:
MOV C,KeyLeft MOV LedLeft,C MOV C,KeyRight MOV Ledright,C LJMP Loop END
5.用74HC245输入数据 CS245 equ 8000h org 0000h Loop:
mov dptr,#CS245 movx a, @dptr ljmp Loop end
6.用74HC273输出数据 CS273 equ 8000h mov dptr, #CS273 mov a, #1 Loop:
movx @dptr, a rl a nop
ljmp Loop end
.7.八段数码管显示
OUTBIT equ 08002h ; 位控制口 OUTSEG equ 08004h ; 段控制口 IN equ 08001h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲 Num equ 70h ; 显示的数据 DelayT equ 75h ; ljmp Start
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序 mov r7, #0
DelayLoop:
djnz r7, DelayLoop djnz r6, DelayLoop ret DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管 mov r2, #00100000b ; 从左边开始显示 Loop:
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; 关所有八段管 mov a, @r0
mov dptr, #OUTSEG movx @dptr,a
mov dptr, #OUTBIT mov a, r2
movx @dptr, a ; 显示一位八段管 mov r6, #01 call Delay
mov a, r2 ; 显示下一位 rr a mov r2, a inc r0
djnz r1, Loop
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; 关所有八段管 ret Start:
mov sp, #40h mov Num, #0 MLoop:
inc Num mov a, Num mov b, a
mov r0, #LEDBuf FillBuf:
mov a, b anl a, #0fh
mov dptr, #LEDMap
movc a, @a+dptr ; 数字转换成显示码
mov @r0,a ; 显示在码填入显示缓冲 inc r0