📄 mms.lst
字号:
A51 MACRO ASSEMBLER MMS 06/23/2007 22:08:45 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN mms.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE mms.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;===================================================
2 ;名 称:电子密码锁
3 ;作 者:小发
4 ;日 期:2007年06月13日
5 ;修改日期:2007年06月18日
6 ;说 明:首先显示器提示输入密码,密码在12.5S内输入有效,
7 ; 输入次三次错误报警10S,输入正确开门,7秒后返回初态
8 ; 以上参数均可在主程序里设定,修改系统密码在程序的结尾
9 ;===================================================
10
00A7 11 RS BIT P2.7
00A6 12 RW BIT P2.6
00A5 13 E BIT P2.5
0010 14 ENTER BIT 22H.0
00B6 15 OPEN BIT P3.6
00B7 16 SPEAK BIT P3.7
0040 17 PASSBUF EQU 40H
0041 18 KEYNUMBER EQU 41H ;存放识别后的按键号
0000 19 ORG 0000H
0000 0130 20 AJMP MAIN
0003 21 ORG 0003H
0003 01E3 22 JMP KEY_INT
000B 23 ORG 000BH
000B 21F3 24 AJMP INTT0
001B 25 ORG 001BH
001B 4110 26 AJMP INTT1
0030 27 ORG 0030H
28 ;========== 主程序开始 ==============
0030 753007 29 MAIN: MOV 30H,#07H ;输入密码为7位 最高只可设15位
0033 7542C8 30 MOV 42H,#200 ;设定报警的时间,42H单元里的数*50MS
0036 7543FA 31 MOV 43H,#250 ;设定开门时间 14的倍数(实际上液晶显示器执行指令占用了时间
,开门时间会比14*250MS大)
32 ;44H号单元存放输入错误的次数
33 ;45H为定时器0中断次数
34 ;46H为定时器1中断次数
0039 7547FA 35 MOV 47H,#250 ;输入密码时间设定,50MS倍数
003C 758160 36 MOV SP,#60H
003F C2B6 37 CLR OPEN
0041 C2B7 38 CLR SPEAK ;初始化输出设备
0043 C210 39 CLR ENTER ;标志位初始化
40
0045 758911 41 MOV TMOD,#11H ;定时器工作方式2
0048 758C3C 42 MOV TH0,#3CH ;初值50MS
004B 758A0B 43 MOV TL0,#0BH
004E 758D3C 44 MOV TH1,#3CH
0051 758B0B 45 MOV TL1,#0BH
0054 D2AF 46 SETB EA
0056 D2A9 47 SETB ET0
0058 D2AB 48 SETB ET1
49
005A 758800 50 MOV TCON,#00000000B ;电平触发
005D A830 51 START: MOV R0,30H
005F 7931 52 MOV R1,#31H
0061 7700 53 SS1: MOV @R1,#00H
0063 09 54 INC R1
0064 D8FB 55 DJNZ R0,SS1 ;将输入密码缓冲单元清零
0066 75900F 56 MOV P1,#0FH ;初始化按键口
0069 7931 57 MOV R1,#31H ;从31号单元开始存放按建输入的密码
A51 MACRO ASSEMBLER MMS 06/23/2007 22:08:45 PAGE 2
006B C220 58 CLR 20H ;报警标志清零
006D C221 59 CLR 21H ;密码超时标志
006F 754600 60 MOV 46H,#00H ;超时后对定时器中断次数清零,便于下一轮重新计时
0072 318B 61 INIT: ACALL SELLCD ;设定液晶工作方式
0074 31B9 62 ACALL LINE1 ;在第一行显示
0076 90024B 63 MOV DPTR,#MES_P ;显示请输入密码
0079 31C3 64 ACALL DISPLAY
007B D2A8 65 setb EX0 ;开中断,允许键盘输入
007D 20213C 66 KEYIN: JB 21H,ERR ;超时转到错误程序
0080 3010FA 67 JNB ENTER,KEYIN ;等待ENTER按下
0083 C210 68 CLR ENTER
0085 C2A8 69 clr EX0 ;密码输入完后锁定键盘
70 ;当使用边沿触发时用上面的指令为什么禁止不了中断???
71 ;========== 密码判断程序 ============
0087 72 COMP:
0087 900244 73 MOV DPTR,#PASS
008A AC30 74 MOV R4,30H ;密码的长度
008C 7400 75 MOV A,#0
008E 7931 76 MOV R1,#31H
0090 FD 77 LOOP: MOV R5,A
0091 93 78 MOVC A,@A+DPTR
0092 F540 79 MOV PASSBUF,A ;取出系统设定的密码
0094 E7 80 MOV A,@R1 ;从31号单元开始取出输入的密码
0095 B54024 81 CJNE A,PASSBUF,ERR ;比较
0098 ED 82 MOV A,R5
0099 04 83 INC A
009A 09 84 INC R1 ;取下一位
009B DCF3 85 DJNZ R4,LOOP
86
87 ;正确
009D 7401 88 MATCH: MOV A,#01H
009F 319C 89 ACALL ENABLE ;清屏,光标复位
00A1 31B9 90 ACALL LINE1 ;从第一行开始显示
00A3 900255 91 MOV DPTR,#MES_C
00A6 31C3 92 ACALL DISPLAY ;显示"请进"
00A8 31BE 93 ACALL LINE2
00AA 900268 94 MOV DPTR,#TAB_1
00AD 31C3 95 ACALL DISPLAY
00AF D2B6 96 SETB OPEN ;开门
00B1 754400 97 MOV 44H,#00H ;输入错误次数清零
00B4 AE43 98 MOV R6,43H
00B6 5127 99 ACALL DELAY
00B8 C2B6 100 CLR OPEN ;复位
00BA 80A1 101 JMP START
102 ;错误
00BC 31E9 103 ERR: ACALL BACK
00BE 7E03 104 MOV R6,#03H
00C0 5127 105 ACALL DELAY
00C2 31E9 106 ACALL BACK ;输错提示音,鸣两下
00C4 7401 107 MOV A,#01H
00C6 319C 108 ACALL ENABLE
00C8 31B9 109 ACALL LINE1
00CA 900261 110 MOV DPTR,#MES_E
00CD 31C3 111 ACALL DISPLAY ;显示错误
00CF 7E40 112 MOV R6,#40H
00D1 5127 113 ACALL DELAY
00D3 0544 114 INC 44H
00D5 E544 115 MOV A,44H
00D7 B40300 116 CJNE A,#03H,EE0
00DA 4005 117 EE0: JC ERROUT ;输错不到三次返回
00DC 754400 118 MOV 44H,#00H ;清零
00DF 31DD 119 ACALL WRANING ;报警
00E1 015D 120 ERROUT: JMP START
121
122 ;=========== 按键中断服务程序 ==========
00E3 C0E0 123 KEY_INT:push acc
A51 MACRO ASSEMBLER MMS 06/23/2007 22:08:45 PAGE 3
00E5 C0D0 124 push psw
00E7 C2A8 125 clr ex0
00E9 513B 126 acall delay10ms ;延时消抖
00EB D28E 127 SETB TR1 ;启动定时器
00ED 310D 128 ACALL SMKEY ;按键识别
00EF E541 129 MOV A,KEYNUMBER ;返回按键号
00F1 31E9 130 ACALL BACK ;按键发声
00F3 FB 131 MOV R3,A
00F4 BB0B09 132 CJNE R3,#0BH,K1 ;ENTER是否按下
00F7 D210 133 SETB ENTER
00F9 C28E 134 clr tr1 ;按下确认后关毕定时器
00FB 754600 135 mov 46h,#00h ;对中断次数清零
00FE 2106 136 AJMP KEY_RTN
0100 2430 137 K1: ADD A,#30H ;将按键号转换为ASCⅡ码
0102 F7 138 MOV @R1,A ;将输入的密码存入缓冲单元
0103 09 139 INC R1 ;修改地址
140
0104 31D0 141 ACALL WRDATA ;输入一位显示一个"*"
142
0106 D0D0 143 KEY_RTN:pop psw
0108 D0E0 144 pop acc
010A D2A8 145 setb ex0
010C 32 146 RETI
147
148
149 ;=========== 按键识别程序 ==========
010D 150 SMKEY:
010D E590 151 MOV A,P1
010F 540F 152 ANL A,#0FH
0111 F5F0 153 WKEY: MOV B,A ;反转法查询
0113 7590F0 154 MOV P1,#0F0H
0116 00 155 NOP
0117 E590 156 MOV A,P1
0119 54F0 157 ANL A,#0F0H
011B 45F0 158 ORL A,B
011D 75900F 159 MOV P1,#0FH ;还原P1口初态
0120 B4EE05 160 CJNE A,#0EEH,WKEY1
0123 754100 161 MOV KEYNUMBER,#00H
0126 217E 162 AJMP RETURN
0128 B4ED05 163 WKEY1: CJNE A,#0EDH,WKEY2
012B 754101 164 MOV KEYNUMBER,#01H
012E 217E 165 AJMP RETURN
0130 B4EB05 166 WKEY2: CJNE A,#0EBH,WKEY3
0133 754102 167 MOV KEYNUMBER,#02H
0136 217E 168 AJMP RETURN
0138 B4E705 169 WKEY3: CJNE A,#0E7H,WKEY4
013B 754103 170 MOV KEYNUMBER,#03H
013E 217E 171 AJMP RETURN
0140 B4DE05 172 WKEY4: CJNE A,#0DEH,WKEY5
0143 754104 173 MOV KEYNUMBER,#04H
0146 217E 174 AJMP RETURN
0148 B4DD05 175 WKEY5: CJNE A,#0DDH,WKEY6
014B 754105 176 MOV KEYNUMBER,#05H
014E 217E 177 AJMP RETURN
0150 B4DB05 178 WKEY6: CJNE A,#0DBH,WKEY7
0153 754106 179 MOV KEYNUMBER,#06H
0156 217E 180 AJMP RETURN
0158 B4D705 181 WKEY7: CJNE A,#0D7H,WKEY8
015B 754107 182 MOV KEYNUMBER,#07H
015E 217E 183 AJMP RETURN
0160 B4BE05 184 WKEY8: CJNE A,#0BEH,WKEY9
0163 754108 185 MOV KEYNUMBER,#08H
0166 217E 186 AJMP RETURN
0168 B4BD05 187 WKEY9: CJNE A,#0BdH,WKEY10
016B 754109 188 MOV KEYNUMBER,#09H
016E 217E 189 AJMP RETURN
A51 MACRO ASSEMBLER MMS 06/23/2007 22:08:45 PAGE 4
0170 B4BB05 190 WKEY10: CJNE A,#0BbH,WKEY11
0173 75410A 191 MOV KEYNUMBER,#0AH
0176 217E 192 AJMP RETURN
0178 B4B703 193 WKEY11: CJNE A,#0B7H,RETURN
017B 75410B 194 MOV KEYNUMBER,#0BH ;判断哪个键按下,返回相应按键号码
017E 75900F 195 RETURN: MOV P1,#0FH
0181 00 196 NOP
0182 00 197 NOP
0183 E590 198 MOV A,P1
0185 F4 199 CPL A
0186 540F 200 ANL A,#0FH
0188 70F4 201 JNZ RETURN ;等待按键松开
018A 22 202 RET
203
204
205
206 ;========== 液晶工作方式设置 ============
018B 7401 207 SELLCD: MOV A,#01H ;清屏,光标复位
018D 319C 208 ACALL ENABLE
018F 7438 209 MOV A,#38H ;设置显示模式,8位两行,5*7点阵
0191 319C 210 ACALL ENABLE
0193 740D 211 MOV A,#0DH ;显示器开,允许内烁
0195 319C 212 ACALL ENABLE
0197 7406 213 MOV A,#06H ;文字不动,光标右移
0199 319C 214 ACALL ENABLE
019B 22 215 RET
216
217 ;========== 液晶执行指令 ============
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -