📄 diantichengxu.asm
字号:
;///////////定义一些常用的符号常量,会便于修改咱们的程序////////////////////////
porta equ 0ff7ch
portb equ 0ff7dh
portc equ 0ff7eh
f01 equ p1^0
f02 equ p1^1
f03 equ p1^2
f04 equ p1^3
bi equ p1^4
ci equ p1^5
di equ p1^6
ai equ p1^7
upmin equ 34h
downmax equ 30h
downlight equ p3^5
uplight equ p3^4
up equ p3^1
down equ p3^0
help1 equ 41h
help2 equ 42h
help3 equ 38h
help4 equ 39h
help5 equ 40h
;//////////////////设置开始位置及其中断程序//////////////////////
org 0000h
jmp start
org 0003h
jmp interrupt1 ;将
org 000bh
jmp interrupt2
;/////////////////////程序初始化,设定中断方式以及8255的模式////////////////////////////////////////
start:
;///////////////////
mov r5,#2
mov r0,#30h
mov r1,#34h
;///////////////////
setb ea ;允许中断
setb ex0 ;允许外部中断
clr ie1 ;清除中断标志位
setb it1 ; 下降沿有效
setb et0 ;允许计时器0中断
clr tf0 ;清除中断标志位
mov a,#01h
mov tmod,a
mov a,#0f0h
mov tl0,a
mov a,#0d8h
mov th0,a
mov a,#0fh
mov p1,a
mov dptr, #0ff7fh
mov a,#82h
movx @dptr,a ;初始化8255
setb up
clr down
start_1_1: jnb f01,start_1_1 ;判断到没到一层 ,不到就一直下降
setb down
;///////////////////////////以下为主函数///////////////////////////////////////////
main:
setb tr0 ;定时器0 开始运行
;////////////////////////////////////上行 子程序/////////////////////////////////
runup: mov a,upmin
cjne a,#5,runup2 ;有上行请求就跳转
runup1:
mov a,downmax
cjne a,#0,out4 ;若也没有下行请求,就转到下行子程序
setb down
clr up ;向上运行
clr tr0 ;临时让计时器不工作
jmp runup1_1
out4:jmp rundown
runup1_1:
cjne a,#1,runup1_2 ;
setb tr0 ;让计时器从新工作
jnb f01,runup
mov downmax,#0
setb up
call delay3s
jmp runup
runup1_2:
cjne a,#2,runup1_3 ;
setb tr0
jnb f02,runup
mov downmax,#0
setb up
call delay3s
jmp runup
runup1_3:
cjne a,#3,runup1_4 ;
setb tr0
jnb f03,runup
mov downmax,#0
setb up
call delay3s
jmp runup
runup1_4:
setb tr0
jnb f04,runup
mov downmax,#0
setb up
call delay3s
jmp runup
runup2:
setb down
clr up
clr tr0
runup2_1:
cjne a,#1,runup2_2 ;
setb tr0
jnb f01,runup
mov upmin,#5
setb up
call delay3s
jmp runup
runup2_2:
cjne a,#2,runup2_3 ;
setb tr0
jnb f02,runup
mov upmin,#5
setb up
call delay3s
jmp runup
runup2_3:
cjne a,#3,runup2_4 ;
setb tr0
jnb f03,out
mov upmin,#5
setb up
call delay3s
out: jmp runup
runup2_4:
setb tr0
jnb f04,out1
mov upmin,#5
setb up
call delay3s
out1: jmp runup
;///////////////////////下行子程序/////////////////////////////////////
rundown:
mov a,downmax
cjne a,#0,rundown2
rundown1:
mov a,upmin
cjne a,#5,out5
setb up
clr down
clr tr0
jmp rundown1_1
out5:jmp runup
rundown1_1:
cjne a,#1,rundown1_2
setb tr0
jnb f01,rundown
mov upmin,#5
setb down
call delay3s
jmp rundown
rundown1_2:
cjne a,#2,rundown1_3
setb tr0
jnb f02,rundown
mov upmin,#5
setb down
call delay3s
jmp rundown
rundown1_3:
cjne a,#3,rundown1_4
setb tr0
jnb f03,rundown
mov upmin,#5
setb down
call delay3s
jmp rundown
rundown1_4:
setb tr0
jnb f04,rundown
mov upmin, #5
setb down
call delay3s
jmp rundown
rundown2:
setb up
clr down
clr tr0
rundown2_1:
cjne a,#1,rundown2_2
setb tr0
jnb f01,rundown
mov downmax,#0
setb down
call delay3s
jmp rundown
rundown2_2:
cjne a,#2,rundown2_3
setb tr0
jnb f02,rundown
mov downmax,#0
setb down
call delay3s
jmp rundown
rundown2_3:
cjne a,#3,rundown2_4
setb tr0
jnb f03,out3
mov downmax,#0
setb down
call delay3s
out3: jmp rundown
rundown2_4:
setb tr0
jnb f04,out2
mov downmax, #0
setb down
call delay3s
out2: jmp rundown
interrupt1:
jb p1^0,interrupt1_1
jb p1^1,interrupt1_2
jb p1^2,interrupt1_3
jb p1^3,interrupt1_4
interrupt1_1:setb ai
clr bi
clr ci
clr di
MOV HELP5,#1
jmp interrupt1back
interrupt1_2:
MOV HELP5,#2
clr ai
setb bi
clr ci
clr di
jmp interrupt1back
interrupt1_3:
MOV HELP5,#3
setb ai
setb bi
clr ci
clr di
jmp interrupt1back
interrupt1_4:
MOV HELP5,#4
clr ai
clr bi
setb ci
clr di
jmp interrupt1back
interrupt1back: ;中断返回
reti
interrupt2:
cjne r0,#34h,testkey ;r0是下降数组
cjne r1,#38h,testkey ;r1是上升数组
jmp loop
testkey : mov dptr,#portc ;把c的第四位给单片机
MOVX A,@DPTR
mov r7,a
mov dptr,#porta ;把a的数据给指针
movx a,@dptr
mov r6,a
CJNE R7,#0,TESTKEY1
CJNE R6,#0,TESTKEY2
jmp loop
testkey1:
cjne r7, #8,j01 ;若不是一楼呼叫——跳转
mov @r0,#1
jmp loop
j01:cjne r7,#4,j02 ;若不是在二楼跳转
mov a,help5
subb a,#2
jc j01_1
mov @r0,#2 ;若在二楼上面,则把2放到下降数组里
jmp loop
j01_1:
mov @r1,#2 ;若在二楼下面,则把它放到上升数组里
jmp loop
j02:cjne r7,#2,j03
mov a,help5
subb a,#3
jc j02_1
mov @r0,#3
jmp loop
j02_1:
mov @r1,#3
jmp loop
j03:
mov @r1, #4
jmp loop
testkey2:
cjne r6,#01h,j1
mov @r1,#1
jmp loop
j1:cjne r6,#02h,j2
mov @r1,#2
jmp loop
j2:cjne r6,#04h,j3
mov @r0,#2
jmp loop
j3:cjne r6,#08h,j4
mov @r1,#3
jmp loop
j4: cjne r6,#10h,j5
mov @r0,#3
jmp loop
j5:
mov @r0,#4
jmp loop
loop: mov r0,#30h
mov r1,#34h
loop1:
mov a,@r1
inc r1
clr c
mov help1,a
subb a,@r1
jc loop1_1 ;若是a 比@r1小的话,就跳转
mov help2,@r1
mov @r1,help2
dec r1
mov @r1,help2
inc r1
djnz help3,loop1
jmp loop1back
loop1_1:
djnz help3,loop1
loop1back:
mov help3,#3
mov r1,#34h
djnz help4,loop1
mov help4,#3
bijiao0: ;去掉重复
mov a,34h
cjne a,35h,bijiao01
mov 34h,#5
bijiao01:
mov a,35h
cjne a,36h,bijiao02
mov 35h,#5
bijiao02:
mov a,36h
cjne a,37h,bijiao03
mov 36h,#5
bijiao03:
djnz r5,loop1
mov r5,#2
dingwei0: ;定位上行数组的位置
mov a,37h
cjne a,#5,dingwei01
mov r1,#37h
dingwei01:
mov a,36h
cjne a,#5,dingwei02
mov r1,#36h
dingwei02:
mov a,35h
cjne a,#5,dingwei03
mov r1,#35h
dingwei03: mov a,34h
cjne a,#5,loop2
mov r1,#34h
loop2:
mov a,@r0
inc r0
clr c
mov help1,a
subb a,@r0
jnc loop2_1 ;若不是a 比@r1小的话,就跳转
mov help2,@r0
mov @r0,help2
dec r0
mov @r0,help2
inc r0
djnz help3,loop2
jmp loop2back
loop2_1:
djnz help3,loop2
loop2back:
mov help3,#3
mov r0,#30h
djnz help4,loop2
mov help4,#3
bijiao1: ;去掉重复
mov a,30h
cjne a,31h,bijiao11
mov 30h,#0
bijiao11:
mov a,31h
cjne a,32h,bijiao12
mov 31h,#0
bijiao12:
mov a,32h
cjne a,33h,bijiao13
mov 32h,#0
bijiao13:
djnz r5,loop2
mov r5,#2
dingwei1: ;定位下降数组的位置
mov a,33h
cjne a,#0,dingwei10
mov r0,#33h
dingwei10:
mov a,32h
cjne a,#0,dingwei11
mov r0,#32h
dingwei11:
mov a,31h
cjne a,#0,dingwei12
mov r0,#31h
dingwei12:mov a,30h
cjne a,#0,dingwei13
mov r0,#30h
dingwei13:jmp interrupt2back
interrupt2back:
mov a,#0f0h ;再次为定时器赋初值
mov tl0,a
mov a,#0d8h
mov th0,a
clr tf0 ;清除中断溢出标志
reti
delay3s:mov r5,#30
dd:mov r4,#200
dd1:mov r3,#250
djnz r3, $
djnz r4,dd1
djnz r5,dd
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -