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