📄 a6_5.asm
字号:
;///////////////////////////////////////////
;本程序源代码由单片机培训网提供.
;单片机培训网,让更多人学习单片机更容易.
;第一网址----www.mcuedu.com
;第二网址----http://51_train.nease.net
;创办人------刘永忠
;热线电话----(0755)27529998
;email-------aa815@163.com
;程序难易等级--------稍难
;使用串行中断发送数据
;///////////////////////////////////////////
org 00h ;主程序起始地址
jmp start ;跳至主程序
org obh ;timer0中断起始地址
jmp tim0 ;跳至timer0中断子程序
start: mov tmod,#00000001b ;设timer0在mode1
mov ie,#10000010b ;中断使能
setb tr0 ;启动timer0
l1: call key ;调用key,判断是否有键按下?
clr ea ;中断屏蔽
jb f0,l1 ;没按则f0=1,有按则f0=0
mov a,22h ;有按则将取码指针暂存地址的载入a
rl a ;乘2
mov dptr,#table
movc a,@a+dptr ;至table取码,取t的值
mov th0,a ;取到的高位字节存入th0
mov 21h,a ;取到的高位字节存入(21h)
mov a,22h ;再载入取码指针值
rl a ;乘2
inc a ;加1
movc a,@a+dptr ;至table1取相对的低位字节计数值
mov tl0,a ;取到的低位字节存入tl0
mov 20h,a ;取到的低位字节存入(20h)
l2: call key ;调到key判断有按否?
setb ea ;中断使能
jb f0,l1 ;有按否?
jmp l2 ;有则跳至l2
key: setb f0 ;设f0=1
mov r3,#0f7h ;扫描初值(p23=0)
mov r1,#00h ;取码指针初值
l3: mov a,r3 ;载入扫描指针
mov p2,a ;输出至p2,开始扫描(p23~p20)一行为0
mov a,p2 ;读入p2
clr c
cpl c ;令c=1
mov r5,#04h ;检测p27~p24
l4: rlc a ;左移一位(p27~p24)
jnc keyin ;检测行c=0,表示被按
inc r1 ;没按则取码指针加1
djnz r5,l4 ;4列检测完毕了?
mov a,r3 ;虹入扫描指针
clr c
cpl c ;c=1
rrc a ;扫描下一行,即下一行为0
mov r3,a ;存回r3扫描指针寄存器
jc l3 ;c=0表示行扫描完毕
ret
keyin: mov 22h,r1 ;取码指针存入22h地址
clr f0 ;令f0=0
ret
tim0: push acc ;将a的值暂存于堆栈
push psw ;将psw的值暂存于堆栈
mov tl0,20h ;重设计数值
mov th0,21h
cpl p1.0 ;将p10位反相
pop psw ;至堆栈取回psw的值
pop acc ;至堆栈取回a的值
reti ;返回主程序
table:
dw 64021,64103,64260,64400
dw 64524,64580,64684,64777
dw 64820,64898,64968,65030
dw 65058,65110,65157,65178
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -