📄 89c51.asm
字号:
;$mod51
org 0000h
nop
ajmp main
org 0030h
main: clr ea
clr a
mov psw,a
mov ie,a
djnz 0e0h,$
djnz 0e0h,$
mov r0,#7fh
init1: mov @r0,a
dec r0
cjne r0,#00h,init1
init8279: mov dptr,#7001h
movx @dptr,a
mov a,#32h
movx @dptr,a
acall offled
mov dptr,#7001h
mov a,#80h
movx @dptr,a
mov dptr,#7000h
mov a,#0c8h
movx @dptr,a
mov 30h,#80h
mov 31h,#40h
wait: acall scankey
jnc wait
mov a,r1
jb 0e4h,commkey
keynum: mov a,30h ;have key
mov dptr,#7001h
movx @dptr,a
mov a,r1
mov r0,31h
mov @r0,a
inc 31h
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#7000h
movx @dptr,a
inc 30h
mov a,30h
cjne a,#88h,wait
mov 30h,#80h
mov 31h,#40h
sjmp wait
commkey: mov dptr,#progcomm ;命令键处理
mov a,r1
anl a,#03h
rl a
jmp @a+dptr
progcomm: ajmp lastp ;last key
ajmp nextp ;next key
ajmp execp ;exec key
lastp: setb 7fh ;last key
ajmp last1
lasta: mov a,dpl ;dptr-1==>dptr
lastb: subb a,#01h
jc lastd
lastc: mov dpl,a
ajmp last3
lastd: dec dph
ajmp lastc
nextp: clr 7fh ;NEXT KEY
last1: acall offled
acALL pickdata
mov a,48h
cjne a,#55h,last2
jb 7fh,lasta
inc dptr
last3: acall savedata
acall dispall
ajmp last4
last2: mov 48h,#55h
ajmp last3
last4: mov 30h,#84h
mov 31h,#44h
waitwr: acall scankey ;l00d0
jnc waitwr
mov a,r1
jnb 0e4h,waitwra
ajmp commkey
waitwra: mov a,30h ;have key
mov dptr,#7001h
movx @dptr,a
mov a,r1
mov r0,31h
mov @r0,a
inc 31h
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#7000h
movx @dptr,a
inc 30h
mov a,30h
cjne a,#86h,waitwrb
acall pickdata
ajmp last4
waitwrb: acall pickdata
ajmp waitwr
execp: acall offled
acall pickdata
push dpl
push dph
ret
delay: mov r6,#0ffh
delay1: mov r7,#0ffh
djnz r7,$
djnz r6,delay1
ret
keycode: db 0c1h,0c8h,0c9h,0d0h,0d8h,0e0h,0c2h,0cah
db 0d1h,0d9h,0dah,0c3h,0cbh,0d2h,0d3h,0dbh
comcode: db 0e3h,0e2h,0e1h,00h ;last next exec
dispcode: db 0ch,9fh,4ah,0bh,99h,29h,28h,8fh
db 08h,09h,88h,38h,6ch,1ah,68h,0e8h
db 0c8h,3ah,0ech,0ffh
offled: mov a,#0dfh
mov dptr,#7001h
movx @dptr,a
offled1: movx a,@dptr
jb 0e7h,offled1
ret
scankey: mov dptr,#7001h ;等待按键
movx a,@dptr
anl a,#07h
cjne a,#00h,havekey
clr c
ret ;无键则循环
havekey: mov dptr,#7000h ;有键
movx a,@dptr ;读键值
mov b,a
mov r1,#00h
mov dptr,#keycode ;查键值表
keyloop: clr a
movc a,@a+dptr
cjne a,b,nokey ;
ajmp foundkey ;数字键处理
nokey: inc dptr
inc r1
ajmp keyloop
foundkey: mov a,r1
setb c
ret
pickdata: mov r0,#41h
acall pickone
mov dph,a
mov r0,#43h
acall pickone
mov dpl,a
mov a,48h
cjne a,#55h,pickret
mov r0,#45h
acall pickone
movx @dptr,a
pickret: ret
pickone: mov a,@r0
anl a,#0fh
mov r1,a
dec r0
mov a,@r0
swap a
anl a,#0f0h
orl a,r1
ret
savedata: movx a,@dptr
savedata1: mov r0,#45h
acall saveone
mov a,dpl
acall saveone
mov a,dph
saveone: mov r1,a
acall savehalf
mov a,r1
swap a
savehalf: anl a,#0fh
mov @r0,a
dec r0
ret
dispall: mov 30h,#80h
mov 31h,#40h
mov r7,#08h
disp1: mov dptr,#7001h
mov a,30h
movx @dptr,a
mov r0,31h
mov a,@r0
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#7000h
movx @dptr,a
inc 31h
inc 30h
djnz r7,disp1
ret
ORG 0200H
disp8: mov sp,#60h ;'8'字循环
mov dptr,#7001h
clr a
movx @dptr,a
mov a,#22h
movx @dptr,a
mov a,#0dfh
movx @dptr,a ;初始化8279
disp9: movx a,@dptr
jb 0e7h,disp9 ;关8279
dispa: mov r2,#80h
dispb: mov a,r2
mov dptr,#7001h
movx @dptr,a ;在哪一位
mov a,#08h
mov dptr,#7000h
movx @dptr,a ;显示'8'
lcall delay ;延时
mov a,#0ffh
mov dptr,#7000h
movx @dptr,a ;消隐
inc r2
cjne r2,#88h,dispb ;不到则循环
ajmp dispa ;再从第一位开始
org 0280h
testp1: mov a,#80h ;P1口输出方波
testp1a: mov p1,a
rr a
sjmp testp1a
org 0300h ;检查8155 RAM
test8155: mov 40h,#08h
mov 41h,#01h
mov 42h,#05h
mov 43h,#05h
mov r7,#0ffh
mov dptr,#2000h
test8155a: mov a,#55h
movx @dptr,a ;
cpl a
movx a,@dptr
cjne a,#55h,test8155err
inc dptr
djnz r7,test8155a
test8155b: mov 44h,#09h ;
mov 45h,#11h
mov 46h,#11h
mov 47h,#0dh
test8155c: acall dispall ;显示'8155 GOOD'
ajmp test8155c
test8155err: mov 44h,#13h ;显示'ERR'
mov 45h,#0eh
mov 46h,#12h
mov 47h,#12h
ajmp test8155c
org 0380h
testport: mov dptr,#2100h ;在8155的PA,PB,PC口
mov a,#0fh ;分别循环输出方波
movx @dptr,a
mov a,#01h
testporta: mov dptr,#2101h ;PA口
movx @dptr,a
inc dptr
movx @dptr,a ;PB口
inc dptr
movx @dptr,a ;PC口
rl a
ajmp testporta
org 0400h
test62256: mov 40h,#02h ;检查62256好坏
mov 41h,#05h
mov 42h,#06h
mov 43h,#13h
mov 44h,#13h
mov dptr,#8000h
test62256a: mov a,#55h
movx @dptr,a
cpl a
movx a,@dptr
cjne a,#55h,test62256err
inc dptr
mov a,dph
jnz test62256a
acall delay
ajmp test8155b ;6264 good
test62256err: mov 45h,#0eh ;6264 err
mov 46h,#12h
mov 47h,#12h
ajmp test8155c ;6264 err
ORG 0480H
testad574: mov 40h,#0ah ;在LED上显示'AD574',
mov 41h,#0dh ;通道号及电压值
mov 42h,#05h ;
mov 43h,#07h
mov 44h,#04h
mov 45h,#13h
mov 46h,#13h
mov 47h,#13h
acall dispall
ad574a: acall scankey ;
jnc ad574a
mov a,r1
anl a,#07h
orl a,#0f8h
mov p1,a
ad574b: acall sample
acall adtobuff
acall dispall
acall delay
sjmp ad574b
adtobuff: mov a,r0 ;high 8 bit
anl a,#0fh
mov 46h,a
mov a,r0
swap a
anl a,#0fh
mov 45h,a
mov a,r1
mov 47h,a
ret
sample: mov dptr,#4000h ;
setb p3.2
clr a
movx @dptr,a
jb p3.2,$
inc dptr
inc dptr
movx a,@dptr
mov r0,a ;high 8 bit
inc dptr
movx a,@dptr
swap a
anl a,#0fh
mov r1,a
ret
org 0500h
testda: mov 40h,#0dh ;从0832上输出到
mov 41h,#01h ;ad574的0通道
mov 42h,#0ah ;并在LED上显示
nop ;0832,输出值,ad574的
mov a,#0f8h
mov p1,a
testdaa: mov dptr,#6000h ;采样值
clr a
mov 43h,a
mov 44h,a
movx @dptr,a
djnz 0e0h,$
acall sample ;采样ad574
acall adtobuff
acall dispall ;显示
acall delay ;延时
mov dptr,#6000h
mov a,#80h
mov 43h,#08h
mov 44h,#00h
movx @dptr,a
clr a
djnz 0e0h,$
acall sample ;采样ad574
acall adtobuff
acall dispall ;显示
acall delay ;延时
mov dptr,#6000h
mov a,#0ffh
mov 43h,#0fh
mov 44h,#0fh
movx @dptr,a
clr a
djnz 0e0h,$
acall sample ;采样ad574
acall adtobuff
acall dispall ;显示
acall delay ;延时
ajmp testdaa
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时间
org 0580h
clock: clr a ;clock subprog
mov 40h,a
mov 41h,a
mov 43h,a
mov 44h,a
mov 46h,a
mov 47h,a
mov a,#13h
mov 42h,a
mov 45h,a
acall dispall
mov 30h,#80h
mov 31h,#40h
inclock: acall scankey
jnc inclock
mov a,r1
cjne a,#12h,inclock1
sjmp timeexec ;exec key
inclock1: cjne a,#0ah,inclock2
inclock2: jnc inclock
mov a,30h ;have key
mov dptr,#7001h
movx @dptr,a
mov a,r1
mov r0,31h
mov @r0,a
inc 31h
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#7000h
movx @dptr,a
inc 30h
mov a,30h
cjne a,#82h,inclock3
inc 30h
inc 31h
sjmp inclock4
inclock3: cjne a,#85h,inclock4
inc 30h
inc 31h
inclock4: mov a,30h
cjne a,#88h,inclock
mov 30h,#80h
mov 31h,#40h
sjmp inclock
timeexec: mov r0,#40h
mov r1,#52h
acall picktime ;52h=hour 51h=minutes
acall settime ;50h=second
rdclockwait: mov dptr,#500ah
movx a,@dptr
jb 0e7h,rdclockwait
acall rdtime
acall savebuff
acall dispall
ajmp rdclockwait
nop
org 0600h
common: mov sp,#60h
mov tmod,#20h
mov th1,#0fdh
mov tl1,#0fdh
mov scon,#50h
mov pcon,#00h
clr ea
setb tr1
send: mov dptr,#buffer
mov r2,#0fh
send1: clr a
movc a,@a+dptr
mov sbuf,a
jnb ti,$
clr ti
inc dptr
djnz r2,send1
jnb ri,send
clr ri
mov a,sbuf
cjne a,#55h,send
sjmp $
buffer: db 'Designed by hgh'
picktime: mov r2,#03h
picktime1: mov a,@r0
swap a
inc r0
orl a,@r0
mov @r1,a
inc r0
inc r0
dec r1
djnz r2,picktime1
ret
settime: mov r0,#50h
mov dptr,#500ah
movx a,@dptr
mov a,#20h
movx @dptr,a
inc dptr
mov a,#80h
movx @dptr,a
mov dptr,#5000h
mov a,@r0
inc r0
movx @dptr,a
inc dptr
inc dptr
mov a,@r0
inc r0
movx @dptr,a
inc dptr
inc dptr
mov a,@r0
movx @dptr,a
mov dptr,#500bh
mov a,#02h
movx @dptr,a
ret
rdtime: mov dptr,#5000h
movx a,@dptr
mov 50h,a ;rd second
inc dptr
inc dptr
movx a,@dptr ;rd minutes
mov 51h,a
inc dptr
inc dptr
movx a,@dptr ;rd hour
mov 52h,a
ret
savebuff: mov r0,#52h
mov r1,#40h
mov r2,#03h
savebuff1: mov a,@r0
swap a
anl a,#0fh
mov @r1,a
inc r1
mov a,@r0
anl a,#0fh
mov @r1,a
inc r1
inc r1
dec r0
djnz r2,savebuff1
ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -