📄 jawen.asm
字号:
IN EQU 40H ;pc输入缓冲区
OUT EQU 48H ;键盘输入缓冲区
TEMP EQU 50H ;显示缓冲
org 0000h
sjmp init
org 0023h
push acc
jbc ri, inter ;判接收标志,
pop acc
reti
inter: clr ea ;关中断
acall recv ;接收存数据
mov r0,#IN
acall disp ;显示接收数据
setb ea ;开中断
pop psw
reti
init: acall clear ;清空存储区
mov scon, #11010000b ;9位异步串行通信
mov pcon, #80h ;波特坡4800
setb ea
setb es
mov tmod, #20h ;晶振频率11.0592mhz
mov th1, #0f4h
mov tl1, #0f4h
setb tr1
mov sp, #60h ;设栈顶值
main: acall testkey ;判键
jz main
acall getkey ;得键值
cjne a, #0ah, main1 ;不是发送键就跳转,否则发送
acall send ;调用发送程序
mov r0,#OUT ;送显示首地址
acall disp ;调用显示程序
ljmp main
main1: cjne a, #0bh, main2 ;不是清除键则跳转,否则清空存储区
acall clear ;清除子程序
mov r0,#IN
acall disp
ljmp main
main2: mov r1, #IN ;将从键盘获得的值存缓冲区
acall store
mov r0,#IN
acall disp
ljmp main ;跳回主循环
TestKey:
MOV P1,#0FH ;读入键状态
MOV A,P1
CPL A
ANL A,#0fh ;存值
ret
GetKey:
ACALL DELAY ;去抖动
MOV P1,#0FH ;再次判键
MOV A,P1
CJNE A,#0FH, K12
LJMP main ;误操作
K12: MOV B,A ;存列值
MOV P1,#3FH ;键在第一行
MOV A,P1
CJNE A,#3FH,K13
MOV P1,#5FH ;键在第二行
MOV A,P1
CJNE A,#5FH,K13
MOV P1,#6FH ;键在第三行
MOV A,P1
CJNE A,#6FH,K13
LJMP main ;多奸同时按下
K13: ANL A,#0F0H ;得键值
ORL A,B
MOV B,A ;存键值
MOV R1,#12 ;12个键
MOV R2,#0 ;键码初值
MOV DPTR,#KEYTABLE
K14: MOV A,R2 ;从键表中取键值
MOVC A,@A+DPTR
CJNE A,B,K16 ;比较相等则执行下步骤
MOV P1,#0FH
K15: MOV A,P1
CJNE A,#0FH, K15 ;等释放
ACALL DELAY ;去抖动
MOV A, R2 ;得键值
RET
K16: INC R2
DJNZ R1, K14
LJMP main ;多键同时按下
KeyTable :
DB 6EH,6DH,6BH,67H ;3*4键盘键码值
DB 5EH,5DH,5BH,57H
DB 3EH,3DH,3BH,37H
disp: MOV R1,#TEMP ;将数据的数据查表得
MOV R2,#5 ;送显示缓冲区
MOV DPTR,#SEGTAB
DP00: MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC R0
DJNZ R2,DP00
DISP0: MOV R0,#TEMP ;动态显示部分
MOV R1,#6
MOV R2,#1
DP01: MOV A,@R0
MOV P0,A
MOV A,R2
MOV P1,A
ACALL DELAY
MOV A,R2
RL A
MOV R2,A
INC R0
DJNZ R1,DP01
SJMP DISP0
ret
SEGTAB:DB 3FH,06H,5BH,4FH,66H,6DH ;0,1,2,3,4,5
DB 7DH,07H,7FH,6FH,77H,7CH ;6,7,8,9,A,B
DB 4H,5CH ,40H ;I,O ,-,
store: mov r2, #5 ;存储区大小为5字节
inc r1 ;跳过输入输出标识
loop: mov b, @r1
mov @r1, a ;将新数据放存储区头部,
inc r1 ;旧数据向后移动,
djnz r2, loop ;包镇保证数据区的数据为最新输入
mov a, b
RET
recv: mov r1, #IN
mov a, sbuf ;接收数据并奇偶较验
jnb psw.0, recv1 ;偶则跳
jnb rb8, recv2 ;rb8为接收的奇偶较验位
subb a, #30h ;将0~9的ASC码转换成数字
jc recv2 ;小于0
mov b, a ;判断接收的值是否在0~9之间
subb a, #10
jnc recv2 ;大于9
mov a, b
acall store ;正确则存储
ret ;否则存零标志“-”
recv1: jb rb8, recv2
subb a, #30h ;将0~9的ASC码转换成数字
jc recv2
mov b, a ;判断接收的值是否在0~9之间
subb a, #10
jnc recv2
mov a, b
acall store
ret
recv2: mov a, #0eh
acall store
ret
send: MOV r1, #OUT
mov r3, #5
send1: inc R1
mov a, @r1 ;发送子程序,设奇偶较验位
add a, #30h ;将0~9的数字转换成ASC码
jnb psw.0, send2
setb tb8
mov sbuf, a
djnz r3, send1
ret
send2: clr tb8
mov sbuf, a
djnz r3, send1
ret
clear: mov r1, #40h ;清零子程序
mov r7, #14h ;既送零标志“-”
loopc: mov @r1, #0eh ;同时设置发送和键盘输入标志位
inc r1 ;"i","o"
djnz r7, loopc
mov 40h,#0ch
mov 48, #0dh
ret
DELAY: MOV R4, #02H ;延时子程序
AA1: MOV R5, #0F8H
AA: NOP
NOP
DJNZ R5, AA
DJNZ R4, AA1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -