📄 jian pan 1.asm
字号:
;###----1.2.3.4 #----------软底-------------
;###----5.6.7.8 #
;###----9.0.A.B #
;###----C.D.E.F #
ORG 0000H
AJMP 0050H
ORG 0050H
MAIN: LCALL KEY
LCALL DISP
AJMP MAIN
;#####################################################################
;执行完一遍此程序后若无按键按下R0值不改变 若有按键按下R0的返回值为按下的键的数值0-F(0-15)
;执行此程序的期间 用到R0 R1 R2 和 C 和延时时的R6 R7 被中断打断时应入栈保护
;######################################################################3
KEY: MOV P1,#0F0H ;列线置低电平 , 行线输入状态
MOV A,P1 ;读行线数据
CPL A
ANL A,#0F0H ;屏蔽列线
MOV R1,A ;存行线数据
JZ GRET ;全0,无健按下,返回
KEY1: MOV P1,#0FH ;列线置输入状态,行线置低电平
MOV A,P1 ;读列线数据
CPL A
ANL A,#0FH ;屏蔽行线
MOV R2,A ;存列线数据
JZ GRET ;全0,无键按下 ,返回
LCALL DELAY ;调延时程序,消除斗动
WAIT: MOV A,P1 ;等待按键释放
CPL A
ANL A,#0FH
JNZ WAIT
MOV A,R1 ;取行线数据 数据在高四位中 低四位为零
MOV R1,#0 ;置行线编号初值
MOV R3,#4 ;置循环次数
CLR C
KEY2: RLC A ;依次左移入C中
JC KEY3 ;C=1,该行有键按下,(行号存在R1中)
INC R1 ;C=0,无键按下,修正行编号
DJNZ R3,KEY2 ;判断循环结束否?未结束继续寻找有键按下的行
MOV A,#0FFH
RET ;出错 无效 退出
KEY3: MOV A,R2 ;取列线数据
MOV R2,#1 ;取列线编号处置
MOV R3,#4 ;置循环次数
CLR C
KEY4: RRC A ;依次右移入C中
JC KEY5 ;C=1,该 行有键按下,(列号存在R2中)
INC R2 ;C=0,无键按下,修正列编号
DJNZ R3,KEY4 ;判断循环结束否?未结束继续寻找有键按下的行
MOV A,#0FFH
RET ;出错 无效 退出
KEY5: MOV A,R1 ;取行线编号
RL A ;行号乘4
RL A
ADD A,R2 ;行号 X 4 + 列号 = 按键编号
CJNE A,#10,GRET1
MOV A,#0
AJMP GRET2
GRET1: JC GRET2 ;键盘上的数字顺序和我们习惯上的不一样(0在中间) 需作相应整
DEC A
GRET2: MOV R0,A
GRET: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;P0口输出段码数据,P2.0-P2.3口作扫描控制
;R0中存放查表初始值(指针)
DISP:MOV DPTR,#7FFFH ;74LS377 地址 7FFFH
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR ;查表
MOVX @DPTR,A ;产生/WR信号
CLR P2.0
LCALL DELAY2MS ;2ms延时
SETB P2.0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时10ms程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时子程序2ms ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY2MS:MOV R6,#4
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序1S ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELY1S: MOV R5,#100
Dd2: MOV R6,#20
Dd1: MOV R7,#248
DJNZ R7,$
DJNZ R6,Dd1
DJNZ R5,Dd2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 共阳极数码管编码表0~F ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
DB 90H,88H,83H,0C6H,0A1H,86H,8EH
;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9""
; "A""B""C" "D""E""F"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -