|
这是你的程序,我大至看了一下,发现有几个问题,我已经用“{}”做标记:
SAOMIAO: ;扫描子程序
MOV R7,#0F7H ;输出扫描码(列:1111)(行:0111),扫描第一行
MOV R6,#00H ;用于检测哪个按键被按下
HANGSAO:
MOV A,R7
MOV P1,A ;开始扫描行
SETB C
MOV A,P1 ;{忘了加这条指令啦,下面你的程序将读不到按键值的}
MOV R5,#04H ;扫描同一行的4个按键
LIESAO:
RLC A ;{上面缺了一个回读P1口值的指令}
JNC PANDUAN ;检测当前按键是否被下,如果有马上跳到判断子程序
INC R6 ;如果当前没有按键被按下则检测下一个
DJNZ R5,LIESAO ;检测完本行的4个按键,则跳出
MOV A,R7
SETB C
RRC A
MOV R7,A ;扫描码右移一位,开始扫描下一行
JC HANGSAO ;没有扫描完4行则跳到HANGSAO继续扫描,已扫描完4行就返回
RET
PANDUAN: ;判断是那个开关被按下
LCALL DEL ;调用消抖延时子程序
MOV A,R6
XRL A,#00H
JZ KAIGUAN1 ; 开关被按下跳转按键1功能子程序
MOV A,R6
XRL A,#01H
JZ KAIGUAN2 ; 开关被按下跳转按键2功能子程序
MOV A,R6
XRL A,#02H
JZ KAIGUAN3 ; 开关被按下跳转按键3功能子程序
MOV A,R6
XRL A,#03H
JZ KAIGUAN4 ; 开关被按下跳转按键4功能子程序
MOV A,R6
XRL A,#04H
JZ KAIGUAN5 ; 开关被按下跳转按键5功能子程序
MOV A,R6
XRL A,#05H
JZ KAIGUAN6 ; 开关被按下跳转按键6功能子程序
MOV A,R6
XRL A,#06H
JZ KAIGUAN7 ; 开关被按下跳转按键7功能子程序
MOV A,R6
XRL A,#07H
JZ KAIGUAN8 ; 开关被按下跳转按键8功能子程序
MOV A,R6
XRL A,#08H
JZ KAIGUAN9 ; 开关被按下跳转按键9功能子程序
MOV A,R6
XRL A,#09H
JZ KAIGUAN10 ; 开关被按下跳转按键10功能子程序
MOV A,R6
XRL A,#0AH
JZ KG11 ; 开关被按下跳转按键11功能子程序
MOV A,R6
XRL A,#0BH
JZ KG12 ; 开关被按下跳转按键12功能子程序
MOV A,R6
XRL A,#0CH
JZ KG13 ; 开关被按下跳转按键13功能子程序
MOV A,R6
XRL A,#0DH
JZ KG14 ; 开关被按下跳转按键14功能子程序
MOV A,R6
XRL A,#0EH
JZ KG15 ; 开关被按下跳转按键15功能子程序
MOV A,R6
XRL A,#0FH
JZ KG16 ; 开关被按下跳转按键16功能子程序
LJMP SAOMIAO
;*************************************************************
;{你上面的判断程序使用了跳转指令JZ XXXXXX,而在子程序里却用RET
;做返回,这样程序会发生溢出的,程序飞到哪都不知道了。
;应该用AJMP XXXX做返回,这个程序可以用AJMP SAOMIAO做返回}
;*************************************************************
KG11: ;{你后面的KG11没用到,应该把它的检测跳过去,
;或才在KG11子程序里放一返回的指令把它略过}
LJMP KAIGUAN11
KG12:
LJMP KAIGUAN12
KG13:
LJMP KAIGUAN13
KG14:
LJMP KAIGUAN14
KG15:
LJMP KAIGUAN15
KG16:
LJMP KAIGUAN16
DEL: ;消抖延时子程序
MOV 3FH,#5
D1:
MOV 3EH,#200
DJNZ 3EH,$
DJNZ 3FH,D1
RET
KAIGUAN1: ;按键1功能子程序
MOV 30H,#01H
RET ;按键2功能子程序
KAIGUAN2:
MOV 30H,#02H
RET
KAIGUAN3: ;按键3功能子程序
MOV 30H,#03H
RET
KAIGUAN4: ;按键4功能子程序
MOV 30H,#04H
RET
KAIGUAN5: ;按键5功能子程序
MOV 30H,#05H
RET
KAIGUAN6: ;按键6功能子程序
MOV 30H,#06H
RET
KAIGUAN7: ;按键7功能子程序
MOV 30H,#07H
RET
KAIGUAN8: ;按键8功能子程序
MOV 30H,#08H
RET
KAIGUAN9: ;按键9功能子程序
MOV 30H,#09H
RET
KAIGUAN10: ;按键10功能子程序
MOV 30H,#00H
RET
KAIGUAN11:;不用这个开关
AJMP SAOMIAO ;{我给你用了条转回主程序的指令来略过它}
KAIGUAN12: ;开锁子程序 (按键12功能子程序)
MOV A,30H
XRL A,40H ;检查输入密码是否正确
JNZ BAOJING ;不正确调用报警子程序报警2S
MOV A,31H
XRL A,41H
JNZ BAOJING
MOV A,32H
XRL A,42H
JNZ BAOJING
MOV A,33H
XRL A,43H
JNZ BAOJING
MOV A,34H
XRL A,44H
JNZ BAOJING
MOV A,35H
XRL A,45H
JNZ BAOJING
SETB P0.0 ;输入密码正确绿灯点亮
RET
KAIGUAN13: ;修改密码确认子程序 (按键13功能子程序)
JNB P0.0,BUGAI ;判断绿是否点亮
MOV 40H,30H ;把当前数据设为密码
MOV 41H,31H
MOV 42H,32H
MOV 43H,33H
MOV 44H,34H
MOV 45H,35H
CLR P0.0 ;密码修改成功,关闭绿灯
BUGAI:
RET
KAIGUAN14: ;关闭子程序 (按键14功能子程序)
MOV P0,#00H ;关闭报警
RET
BAOJING: ;报警子程序
SETB P0.1 ;启动报警
SETB P0.2
RET
KAIGUAN15: ;清除当前显示的最高位子程序(按键15功能子程序)
MOV A,35H
XRL A,#0FFH
JNZ G1 ;判断35H是否有显示,有则跳转
MOV A,34H
XRL A,#0FFH
JNZ G2 ;判断34H是否有显示,有则跳转
MOV A,33H
XRL A,#0FFH
JNZ G3 ;判断33H是否有显示,有则跳转
MOV A,32H
XRL A,#0FFH
JNZ G4 ;判断32H是否有显示,有则跳转
MOV A,31H
XRL A,#0FFH
JNZ G5 ;判断31H是否有显示,有则跳转
MOV A,30H
XRL A,#0FFH
JNZ G6 ;判断30H是否有显示,有则跳转
GG:
MOV @R1,#0FFH ;把0FFH赋给当前显示的最高位
RET
G1:
MOV R1,#35H
LJMP GG
G2:
MOV R1,#34H
LJMP GG
G3:
MOV R1,#33H
LJMP GG
G4:
MOV R1,#32H
LJMP GG
G5:
MOV R1,#31H
LJMP GG
G6:
MOV R1,#30H
LJMP GG
KAIGUAN16: ;清除当前显示的最低位子程序(按键16功能子程序)
MOV A,31H
CLR C
SUBB A,#10H
MOV 30H,A ;把31H的数据给30H
MOV A,32H
CLR C
SUBB A,#10H
MOV 31H,A ;把32H的数据给31H
MOV A,33H
CLR C
SUBB A,#10H
MOV 32H,A ;把33H的数据给32H
MOV A,34H
CLR C
SUBB A,#10H
MOV 33H,A ;把34H的数据给33H
MOV A,35H
CLR C
SUBB A,#10H
MOV 34H,A ;把35H的数据给34H
MOV 35H,#0FFH ;#0FFH赋给35H,35H显示时变为黑屏
RET
DEL2S: ;延时2S子程序
MOV 4FH,#20
D2S:
MOV 4EH,#200
D2S1:
MOV 4DH,#250
DJNZ 4DH,$
DJNZ 4EH,D2S1
DJNZ 4FH,D2S
RET
[ 本帖最后由 huchuan987 于 2009-5-15 00:36 编辑 ] |
|