📄 pwlock.lst
字号:
163 1 /* 50ms 定时设置 */
164 1 TH1 = -50000/256;
165 1 TL1 = -50000%256;
166 1
167 1 /* 启动计数器0,关闭计数器1 */
168 1 TR0 = 1;
169 1 ET0 = 1;
170 1 TR1 = 0;
171 1 ET1 = 1;
172 1 EA = 1;
173 1
174 1 count = 0; // 初始没有输入密码,计数器设为0
175 1 enterflag = 0; // 没有按下确认键
176 1 pwflag = 0; // 密码标志先置为0
177 1 green = 1; // 绿灯不亮
178 1 red = 1; // 红灯不亮
179 1
C51 COMPILER V7.02b PWLOCK 09/15/2005 20:01:05 PAGE 4
180 1 /* 假设内定密码为937602 */
181 1 pw[0] = 9;
182 1 pw[1] = 3;
183 1 pw[2] = 7;
184 1 pw[3] = 6;
185 1 pw[4] = 0;
186 1 pw[5] = 2;
187 1
188 1 digbit = 0x01; // 从第一位数码管开始动态扫描
189 1
190 1 /* 刚加电时,显示888888 */
191 1 for (j=0;j<6;j++)
192 1 wordbuf[j] = 8;
193 1
194 1 showflag = 1; // 打开数码管显示
195 1
196 1 while(1)
197 1 {
198 2 key = keyscan(); // 调用键盘扫描函数
199 2 switch(key)
200 2 {
201 3 case 0x11: // 1行1列,数字0
202 3 if (count<6)
203 3 {
204 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F”
205 4 pwbuf[count] = 0;
206 4 count++;
207 4 }
208 3 break;
209 3 case 0x21: // 1行2列,数字1
210 3 if (count<6)
211 3 {
212 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
213 4 pwbuf[count] = 1;
214 4 count++;
215 4 }
216 3 break;
217 3 case 0x41: // 1行3列,数字2
218 3 if (count<6)
219 3 {
220 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
221 4 pwbuf[count] = 2;
222 4 count++;
223 4 }
224 3 break;
225 3 case 0x81: // 1行4列,数字3
226 3 if (count<6)
227 3 {
228 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
229 4 pwbuf[count] = 3;
230 4 count++;
231 4 }
232 3 break;
233 3 case 0x12: // 2行1列,数字4
234 3 if (count<6)
235 3 {
236 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
237 4 pwbuf[count] = 4;
238 4 count++;
239 4 }
240 3 break;
241 3 case 0x22: // 2行2列,数字5
C51 COMPILER V7.02b PWLOCK 09/15/2005 20:01:05 PAGE 5
242 3 if (count<6)
243 3 {
244 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
245 4 pwbuf[count] = 5;
246 4 count++;
247 4 }
248 3 break;
249 3 case 0x42: // 2行3列,数字6
250 3 if (count<6)
251 3 {
252 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
253 4 pwbuf[count] = 6;
254 4 count++;
255 4 }
256 3 break;
257 3 case 0x82: // 2行4列,数字7
258 3 if (count<6)
259 3 {
260 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
261 4 pwbuf[count] = 7;
262 4 count++;
263 4 }
264 3 break;
265 3 case 0x14: // 3行1列,数字8
266 3 if (count<6)
267 3 {
268 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
269 4 pwbuf[count] = 8;
270 4 count++;
271 4 }
272 3 break;
273 3 case 0x24: // 3行2列,数字9
274 3 if (count<6)
275 3 {
276 4 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
277 4 pwbuf[count] = 9;
278 4 count++;
279 4 }
280 3 break;
281 3 case 0x44: // 3行3列,确认键
282 3 enterflag = 1; // 确认键按下
283 3 if (count==6) // 只有输入6个密码后按确认键才作密码比较
284 3 pwflag = pwcmp();
285 3 else
286 3 pwflag = 0; // 否则直接pmflag赋0
287 3 break;
288 3 case 0x84: // 3行4列,取消键
289 3 count = 0; // 密码计数清零
290 3 for (j=0;j<6;j++)
291 3 {
292 4 wordbuf[j] = 8; // 数码管显示888888
293 4 pwbuf[j] = 0x0f; // 用FFFFFF清除已经输入的密码
294 4 }
295 3 break;
296 3 default:break;
297 3 }
298 2
299 2 if (enterflag==1) // 如果按下确认键
300 2 {
301 3 enterflag = 0; // 标志位置回0
302 3 count = 0; // 密码位计数器清零
303 3 for (j=0;j<6;j++)
C51 COMPILER V7.02b PWLOCK 09/15/2005 20:01:05 PAGE 6
304 3 pwbuf[j] = 0x0f; // 用FFFFFF清除已经输入的密码
305 3 showflag = 0; // 关闭数码管显示
306 3 TR1 = 1; // 计数器1开始计数
307 3 t1count = 0; // 定时器1由50ms累积到1s所用的计数器
308 3 if (pwflag==1)
309 3 green = 0; // 绿灯亮
310 3 else
311 3 red = 0; // 红灯亮
312 3 }
313 2 }
314 1 }
315
316
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 916 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -