中断服务子程序:
X0S: MOV DPTR,#2000H
MOVX @DPTR,A
SETB TR0
MOV 3AH,#20H
MOV 3BH,#00H
MOV R7,#00H
MOV R6,#04H
CLR 70H
X0S0: CLR01H
X0S1: JNB 01H,X0S1
CJNE R6,#00H,X0S0
CJNE R7,#00H,X0S0
CLR TR0
CLR EX0
SETB 00H
RETI
键盘程序:
KEYI:ACALL KS1 ;调用判有无键闭合子程序
JNZ LK1 ;有键闭合,跳LK!
NI: ACALL DIR ;无键闭合,调用显示子程序,延时
AJMP KEYI
LK1: ACALL DIR ;可能有键闭合,延时12MS软件区
ACALL DIR
ACALL KS1 ;调用判有无子程序
JNZ LK2 ;经去消抖,判断确实有键按下跳
ACALL DIR ;调用显示子程序延时6MS
AJMP KEYI ;抖动引起跳KEYI去处理
LK2: MOV R2,#0FEH ;列选码—〉R2
MOV R4,#00H ;R4 为列号计数器
LK4: MOV DPTR,#7F01H ;列选码—〉8155H
MOV A,R2
MOVX @DPTR,A
INC DPTR ;数据指针增2,指向PC口
INC DPTR
MOVX A,@DPTR ;读8155H的PC口
JB Acc.0,LONE ;第0行线为高,无键闭合,跳LONE
;转判第1行
MOV A,#00H ;第0行有键闭合,首键号—〉A
AJMP LKP ;跳LKP,计算键号
LONE: JB Acc.1,LTOW ;1行线为高,无键闭合,跳LTW0
;转判断第2行
MOV A,#08H ;1行有键闭合,首键号8—〉A
AJMP LKP ;跳LKP ,计算键号
LTW0: JB Acc.2,LTHR ;2行线为高,无键闭合跳LTHR
;转判;第3行
MOV A,#10H ;2行有键闭合,首键号10H—〉A
AJMP LKP ;跳LKP,计算键号
LTHR: JB Acc.3,NEXT ;3行线为高,无键闭合跳NEXT,
;准备下一列的扫描
MOV A,#18H ;3行有键按下,首键号18H—>A
LKP: ADD A,R4 ;计算键号
PUSH A ;键号进栈保护
LK3: ACALL DIR ;调用显示子程序,延时6MS
ACALL DIR ;调用判有无键闭合子程序,延时6MS
JNZ LK3 ;判键释放否,未释放,则循环
POP A ;键已释放,键号出栈->A
RET
NEXT: INC R4 ;列计数器加1,为下一列扫描做准备
MOV A,R2 ;判是否已扫到最后一列(最右一列)
NB Acc.7,KND ;键扫描已到最后一列,跳KND重新
;进行整个
;键盘的扫描
RL A ;键扫描未扫到最后一列,位选码左
;移一位
MOV R2,A ;位选码->R2
AJMP LK4
KND: AJMP KEYI
KS1: MOV DPTR ,#7F01H ;判有无键闭合子程序,全0->扫描(PA口)
MOV A,#00H ;列线全为低电平
MOVX @DPTR,A ;
INC DPTR ;DPTR增2,指向PC 口
INC DPTR
MOVX A,@DPTR ;从PC口读行线的状态
CPL A 行线的状态取反,如无键按下,则A
;中内容为0
ANL A,#0FH ;屏蔽无用的高4位
RET
PID: MOV R5,3 1H ;取W
MOV R4,32H
MOV R3,#00H :取Yi
MOV R2,2AH
ACALL CPL1 ;取Yi的补码
ACALL DSUM ;计算ei=W-Yi
MOV 39H,R7 ;存ei
MOV 3AH,R6
MOV R5,35H ;取I
MOV R4,36H
MOV R0,#4 AH ;R0放乘积高位字节地址指针
ACALL MULT1 ;计算Pi=I*ei
MOV R5,39H :取ei
<< 上一页 [11] [12] [13] [14] [15] [16] 下一页