file7.asm
来自「单片机学习系统附的实验源代码」· 汇编 代码 · 共 141 行
ASM
141 行
; 这是 读取键盘的子程序
; 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法
; 以及如何处理读入的键值
; 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反
; 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms
; 消除干扰,然后,等待用户释放,否则,可能重复的到某种结果,发生意外情况
;现象;我们按不同的按键,会用数码管在不同的位置显示不同的结果1/2/3来
beep bit p3.7 ; 蜂鸣器定义
segdata equ p0 ;数据 输出
sege equ p2.7 ;显示 选中
segb equ p2.6 ;位 选
segd equ p2.5 ;段 选
key1 bit p3.3 ; 按键引脚定义
key2 bit p3.4 ;
key3 bit p3.5 ;
key equ 46h ; 按键寄存单元
org 00h
jmp main
org 030h
main:mov sp,#30h ;首先定义
lcall REST ;初始化子程序
lp:lcall pro_key ;调用键盘查询子程序
lcall KEYPR ;用来显示所查询到的键值
jmp lp ;反复调用,不断查询
REST:
mov a,#00h
mov b,#00h
mov p0,#0
mov p1,0ffh
mov key,#00h
mov p2,#255
clr beep
RET
KEYPR: mov a,key ;键值在累加器KEY中
jz PROEND ;如果 A= 0,表示没有按键,返回
cjne a,#1,k1 ; A= 1 ,用户按了第一个键
mov a,#1 ;处理 A = 1的情况
mov dptr,#tab_nu ;查表
movc a,@a+dptr
clr sege ;选中显示
mov segdata,a ;显示 "1"
setb segd
nop
clr segd
mov segdata,#1 ;显示 "1"
setb segb
nop
clr segb
jmp PROEND ;处理完成,子程序返回
;以下分别处理 KEY = 2,3 的情况
k1: cjne a,#2,k2
mov a,#2
mov dptr,#tab_nu
movc a,@a+dptr
mov segdata,a ;显示 "2"
setb segd
nop
clr segd
mov segdata,#2 ;显示 "2"
setb segb
nop
clr segb
jmp PROEND
k2: cjne a,#3, PROEND
mov a,#3
mov dptr,#tab_nu
movc a,@a+dptr
mov segdata,a ;显示 "3"
setb segd
nop
clr segd
mov segdata,#4 ;显示 "3"
setb segb
nop
clr segb
PROEND:ret
pro_key: ;键盘查询子程序
setb key1 ;首先输出高电平,检测低电平的到来
setb key2 ;不同电路,可能检测方式不一样
setb key3
jb key1,ke1 ;如果用户没有按第一个键,到第下个处理部分,
mov key,#1 ;表示用户按了第一个键
lcall delay20ms ;软件延时,防止干扰
jmp pro_key ;重新查询,直到用户释放按键
ke1:jb key2,ke2 ;处理第二个按键,如果没有到下一个处理部分
mov key,#2 ;以下和第一个处理单元相似。
lcall delay20ms
jmp pro_key
ke2:jb key3,ke3
mov key,#3
lcall delay20ms
jmp pro_key
ke3:ret
;************ 定时20 ms *************
delay20ms:
push psw ; 保存原来的寄存器单元
clr psw.3 ; 设置新的寄存器
clr psw.4 ;
mov r0,#2 ; 延时参数1
mov r1,#250 ; 延时参数2
mov r2,#1 ; 延时参数3
dl1:djnz r0,dl1 ; 延时循环1
mov r0,#250 ; 重新设置循环数据
dl2:djnz r1,dl1 ; 开始第二道循环
mov r0,#240 ;
mov r1,#248 ;
dl3:djnz r2,dl1 ; 第三道循环
nop ; 修正定时精度
pop psw ; 恢复原来的寄存器组
ret ; 返回
;*********** end *******************
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
;比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码
end ;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?