📄 51bc.asm
字号:
;the file is demo for SuperICES 51-B board
;本文件使用于爱思51-B型高级用户板功能测试及演示
DAT_8279 EQU 0C000H
COM_8279 EQU 0C001H
PA_8255 EQU 8000H
PB_8255 EQU 8001H
PC_8255 EQU 8002H
COM_8255 EQU 8003H
STR_574 EQU 0A000H
HI_574 EQU 0A002H
LO_574 EQU 0A003H
CS0832 EQU 0B000H
CS_LCD EQU 0D000H
cs_0832 equ 0b000h
org 0000h
nop
ajmp main
org 0030h
main: clr EA
MOV SP,#60H
clr A
mov PSW,a
mov IE,a
mov R0,#7fh ;清CPU RAM
INIT1: mov @R0,a
DJNZ R0,INIT1
init8279: mov dptr,#COM_8279 ;初始化8279
movx @dptr,a
mov a,#32h
movx @dptr,a
acall offled
mov dptr,#COM_8279
mov a,#80h
movx @dptr,a
mov dptr,#DAT_8279
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,#COM_8279
movx @dptr,a
mov a,r1
mov r0,31h
mov @r0,a
inc 31h
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#DAT_8279
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,#COM_8279
movx @dptr,a
mov a,r1
mov r0,31h
mov @r0,a
inc 31h
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#DAT_8279
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,#COM_8279
movx @dptr,a
offled1: movx a,@dptr
jb 0e7h,offled1
ret
scankey: mov dptr,#COM_8279 ;等待按键
movx a,@dptr
anl a,#07h
cjne a,#00h,havekey
clr c
ret ;无键则循环
havekey: mov dptr,#DAT_8279 ;有键
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,#COM_8279
mov a,30h
movx @dptr,a
mov r0,31h
mov a,@r0
mov dptr,#dispcode
movc a,@a+dptr
mov dptr,#DAT_8279
movx @dptr,a
inc 31h
inc 30h
djnz r7,disp1
ret
;-------------------0200H------------------------------
ORG 0200H
disp8: mov sp,#60h ;'8'字循环
mov dptr,#COM_8279
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,#COM_8279
movx @dptr,a ;在哪一位
mov a,#08h
mov dptr,#DAT_8279
movx @dptr,a ;显示'8'
lcall delay ;延时
mov a,#0ffh
mov dptr,#DAT_8279
movx @dptr,a ;消隐
inc r2
cjne r2,#88h,dispb ;不到则循环
ajmp dispa ;再从第一位开始
;-------------------0a00H--------------------------------
org 0a00h ;演示爱思通用串行键盘显示接口
CS BIT P1.0 ;请将爱思通用串行键盘显示器插入
CLK BIT P1.1
DIO BIT P1.2
KEY BIT P1.3
BIT_N EQU 3aH
DEL EQU 3bH
SND_BUF EQU 3cH
REC_BUF EQU 3dH
DECI EQU 3eH
keybord:;clr rs0
;setb rs1
MOV P1,#0FFH
LCALL DEL_key
MOV SND_BUF,#10100100B ;7289清除指令
LCALL SEND_key
SETB CS
MOV SND_BUF,#10111111B ;测试LED
LCALL SEND_key
SETB CS
LCALL DEL_key
MOV SND_BUF,#10100100B ;7289清除指令
LCALL SEND_key
SETB CS
MOV R0,#00H
MOV R1,#08h ;8-1位显示'7-0'
MOV SND_BUF,#11001000B
DIS7_0:MOV R7,SND_BUF
LCALL SEND_key
INC R7
MOV SND_BUF,R0
LCALL SEND_key
INC R0
MOV SND_BUF,R7
DJNZ R1,DIS7_0
SETB CS
LCALL DEL_key
MOV R0,#08H
MOV R1,#08h ;8-1位显示'F-8'
MOV SND_BUF,#11001000B
DISF_8:MOV R7,SND_BUF
LCALL SEND_key
INC R7
MOV SND_BUF,R0
LCALL SEND_key
INC R0
MOV SND_BUF,R7
DJNZ R1,DISF_8
SETB CS
LCALL DEL_key
MOV SND_BUF,#10100100B ;清屏指令
LCALL SEND_key
SETB CS
MOV SND_BUF,#10010111B ;D8显示‘P’
LCALL SEND_key
MOV SND_BUF,#01100111B ;'P'
LCALL SEND_key
SETB CS
MOV SND_BUF,#10001000B ;‘P’闪烁
LCALL SEND_key
MOV SND_BUF,#01111111B
LCALL SEND_key
SETB CS
K_DEMO:JB KEY,$ ;键盘演示,读键
MOV SND_BUF,#00010101B ;读键值
LCALL SEND_key
LCALL RECIV
SETB CS
MOV SND_BUF,#10010000B ;D1显示‘H.’
LCALL SEND_key
MOV SND_BUF,#10110111B ;'H.'
LCALL SEND_key
SETB CS
MOV SND_BUF,#11001001B ;D2显示键值低半位
LCALL SEND_key
MOV SND_BUF,REC_BUF
LCALL SEND_key
SETB CS
MOV SND_BUF,#11001010B ;D3显示键值高半位
LCALL SEND_key
MOV A,REC_BUF
ANL A,#0F0H
SWAP A
MOV SND_BUF,A
LCALL SEND_key
SETB CS
JNB KEY,$
AJMP K_DEMO
SEND_key: MOV BIT_N,#8
CLR CS
LCALL DEL50
S_LP: MOV A,SND_BUF
RLC A
MOV SND_BUF,A
MOV DIO,C
NOP
NOP
SETB CLK
LCALL DEL10
CLR CLK
LCALL DEL10
DJNZ BIT_N,S_LP
CLR DIO
RET
RECIV:MOV BIT_N,#8
SETB DIO
R_LP: SETB CLK
LCALL DEL10
MOV C,DIO
MOV A,REC_BUF
RLC A
MOV REC_BUF,A
CLR CLK
LCALL DEL10
DJNZ BIT_N,R_LP
CLR DIO
RET
DEL50:MOV DEL,#50
DJNZ DEL,$
RET
DEL10:MOV DEL,#10
DJNZ DEL,$
RET
DEL_key:MOV 7AH,#10
DEL1S:MOV 7BH,#0FFH
D1S1:MOV 7CH,#0FFH
DJNZ 7CH,$
DJNZ 7BH,D1S1
DJNZ 7AH,DEL1S
RET
;---------------c00h-----------------------------
org 0c00h
test8255: acall ho1o ;调用一级库打印
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -