📄 pwlock.lst
字号:
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 V8.08 PWLOCK 12/20/2008 04:18:22 PAGE 4
180 1 /* 假设内定密码为937602 */
181 1 pw[0] = 5;
182 1 pw[1] = 1;
183 1 pw[2] = 2;
184 1 pw[3] = 0;
185 1 pw[4] = 2;
186 1 pw[5] = 8;
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 { P1 = 0xf0;
198 2 if ((P1&0xf0)!=0xf0) // 有健按下
199 2 {
200 3 key = keyscan(); // 调用键盘扫描函数
201 3 switch(key)
202 3 {
203 4 case 0x11: // 1行1列,数字0
204 4 if (count<6)
205 4 {
206 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F”
207 5 pwbuf[count] = 0;
208 5 count++;
209 5 }
210 4 break;
211 4 case 0x21: // 1行2列,数字1
212 4 if (count<6)
213 4 {
214 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
215 5 pwbuf[count] = 1;
216 5 count++;
217 5 }
218 4 break;
219 4 case 0x41: // 1行3列,数字2
220 4 if (count<6)
221 4 {
222 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
223 5 pwbuf[count] = 2;
224 5 count++;
225 5 }
226 4 break;
227 4 case 0x81: // 1行4列,数字3
228 4 if (count<6)
229 4 {
230 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
231 5 pwbuf[count] = 3;
232 5 count++;
233 5 }
234 4 break;
235 4 case 0x12: // 2行1列,数字4
236 4 if (count<6)
237 4 {
238 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
239 5 pwbuf[count] = 4;
240 5 count++;
241 5 }
C51 COMPILER V8.08 PWLOCK 12/20/2008 04:18:22 PAGE 5
242 4 break;
243 4 case 0x22: // 2行2列,数字5
244 4 if (count<6)
245 4 {
246 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
247 5 pwbuf[count] = 5;
248 5 count++;
249 5 }
250 4 break;
251 4 case 0x42: // 2行3列,数字6
252 4 if (count<6)
253 4 {
254 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
255 5 pwbuf[count] = 6;
256 5 count++;
257 5 }
258 4 break;
259 4 case 0x82: // 2行4列,数字7
260 4 if (count<6)
261 4 {
262 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
263 5 pwbuf[count] = 7;
264 5 count++;
265 5 }
266 4 break;
267 4 case 0x14: // 3行1列,数字8
268 4 if (count<6)
269 4 {
270 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
271 5 pwbuf[count] = 8;
272 5 count++;
273 5 }
274 4 break;
275 4 case 0x24: // 3行2列,数字9
276 4 if (count<6)
277 4 {
278 5 wordbuf[count] = 0x0f; // 对应密码位上显示“F"
279 5 pwbuf[count] = 9;
280 5 count++;
281 5 }
282 4 break;
283 4 case 0x44: // 3行3列,确认键
284 4 enterflag = 1; // 确认键按下
285 4 if (count==6) // 只有输入6个密码后按确认键才作密码比较
286 4 pwflag = pwcmp();
287 4 else
288 4 pwflag = 0; // 否则直接pmflag赋0
289 4 break;
290 4 case 0x84: // 3行4列,取消键
291 4 count = 0; // 密码计数清零
292 4 for (j=0;j<6;j++)
293 4 {
294 5 wordbuf[j] = 8; // 数码管显示888888
295 5 pwbuf[j] = 0x0f; // 用FFFFFF清除已经输入的密码
296 5 }
297 4 break;
298 4 default:break;
299 4 }
300 3 while((P1&0xf0)!=0xf0); //松手检测
301 3
302 3 }
303 2
C51 COMPILER V8.08 PWLOCK 12/20/2008 04:18:22 PAGE 6
304 2
305 2 if (enterflag==1) // 如果按下确认键
306 2 {
307 3 enterflag = 0; // 标志位置回0
308 3 count = 0; // 密码位计数器清零
309 3 for (j=0;j<6;j++)
310 3 pwbuf[j] = 0x0f; // 用FFFFFF清除已经输入的密码
311 3 showflag = 0; // 关闭数码管显示
312 3 TR1 = 1; // 计数器1开始计数
313 3 t1count = 0; // 定时器1由50ms累积到1s所用的计数器
314 3 if (pwflag==1)
315 3 green = 0; // 绿灯亮
316 3 else
317 3 red = 0; // 红灯亮
318 3 }
319 2
320 2
321 2 }
322 1 }
323
324
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 938 ----
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 + -