📄 pwlock.lst
字号:
C51 COMPILER V7.02b PWLOCK 09/15/2005 20:01:05 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE PWLOCK
OBJECT MODULE PLACED IN PWLock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PWLock.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程学院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "PWLock.h"
8
9 /* 键消抖延时函数 */
10 void delay(void)
11 {
12 1 uchar i;
13 1 for (i=300;i>0;i--);
14 1 }
15
16 /* 键扫描函数 */
17 uchar keyscan(void)
18 {
19 1 uchar scancode,tmpcode;
20 1 P1 = 0xf0; // 发全0行扫描码
21 1 if ((P1&0xf0)!=0xf0) // 若有键按下
22 1 {
23 2 delay(); // 延时去抖动
24 2 if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
25 2 {
26 3 scancode = 0xfe;
27 3 while((scancode&0x10)!=0) // 逐行扫描
28 3 {
29 4 P1 = scancode; // 输出行扫描码
30 4 if ((P1&0xf0)!=0xf0) // 本行有键按下
31 4 {
32 5 tmpcode = (P1&0xf0)|0x0f;
33 5
34 5 /* 返回特征字节码,为1的位即对应于行和列 */
35 5 return((~scancode)+(~tmpcode));
36 5 }
37 4 else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
38 4 }
39 3 }
40 2 }
41 1 return(0); // 无键按下,返回值为0
42 1 }
43
44 /* 定时器0中断服务子程序,2ms定时动态扫描显示 */
45 void time0_int(void) interrupt 1
46 {
47 1 /* 重置2ms定时 */
48 1 TH0 = -2000/256;
49 1 TL0 = -2000%256;
50 1
51 1 if (showflag==1)
52 1 display(); // 调用显示函数
53 1 }
54
55 /* 定时器1中断服务子程序,50ms*/
C51 COMPILER V7.02b PWLOCK 09/15/2005 20:01:05 PAGE 2
56 void time1_int(void) interrupt 3
57 {
58 1 uchar k;
59 1 /* 重置50ms定时 */
60 1 TH1 = -50000/256;
61 1 TL1 = -50000%256;
62 1
63 1 if (t1count<20)
64 1 {
65 2 t1count++;
66 2 }
67 1 else // 计时到1s
68 1 {
69 2 TR1 = 0; // 关闭计数器1
70 2 t1count = 0;
71 2 green = 1; // 绿灯不亮
72 2 red = 1; // 红灯不亮
73 2 showflag = 1; // 打开数码管显示
74 2 digbit = 0x01; // 从数码管第1位开始动态显示
75 2 for (k=0;k<6;k++) // 显示888888
76 2 wordbuf[k] = 8;
77 2 }
78 1 }
79
80 /* 根据共阴极字型编码表获取0~9,A~B字型代码 */
81 uchar getcode(uchar i)
82 {
83 1 uchar p;
84 1 switch (i)
85 1 {
86 2 case 0: p=0x3f; break; /* 0 */
87 2 case 1: p=0x06; break; /* 1 */
88 2 case 2: p=0x5B; break; /* 2 */
89 2 case 3: p=0x4F; break; /* 3 */
90 2 case 4: p=0x66; break; /* 4 */
91 2 case 5: p=0x6D; break; /* 5 */
92 2 case 6: p=0x7D; break; /* 6 */
93 2 case 7: p=0x07; break; /* 7 */
94 2 case 8: p=0x7F; break; /* 8 */
95 2 case 9: p=0x67; break; /* 9 */
96 2 case 10: p=0x77; break; /* A */
97 2 case 11: p=0x7C; break; /* B */
98 2 case 12: p=0x39; break; /* C */
99 2 case 13: p=0x5E; break; /* D */
100 2 case 14: p=0x79; break; /* E */
101 2 case 15: p=0x71; break; /* F */
102 2 default: break;
103 2 }
104 1 return(p);
105 1 }
106
107 /* 显示函数 */
108 void display(void)
109 {
110 1 uchar i;
111 1 switch (digbit)
112 1 {
113 2 case 1: i=0; break;
114 2 case 2: i=1; break;
115 2 case 4: i=2; break;
116 2 case 8: i=3; break;
117 2 case 16: i=4; break;
C51 COMPILER V7.02b PWLOCK 09/15/2005 20:01:05 PAGE 3
118 2 case 32: i=5; break;
119 2 default: break;
120 2 }
121 1
122 1 P2 = 0x0; // 关闭显示
123 1 P0 = getcode(wordbuf[i]); // 送字型码
124 1 P2 = digbit; // 送字位码
125 1
126 1 if (digbit<0x20) // 共6位
127 1 digbit = digbit*2; // 左移一位
128 1 else
129 1 digbit = 0x01;
130 1 }
131
132 /* 密码比较函数 */
133 bit pwcmp(void)
134 {
135 1 bit flag;
136 1 uchar i;
137 1 for (i=0;i<6;i++)
138 1 {
139 2 if (pw[i]==pwbuf[i])
140 2 flag = 1;
141 2 else
142 2 {
143 3 flag = 0;
144 3 i = 6;
145 3 }
146 2 }
147 1 return(flag);
148 1 }
149
150 /* 主程序 */
151 void main()
152 {
153 1 uchar j,key;
154 1
155 1 P2 = 0x0; // 关闭数码管显示
156 1
157 1 TMOD = 0x11; // T0,T1工作方式1
158 1
159 1 /* 2ms 定时设置 */
160 1 TH0 = -2000/256;
161 1 TL0 = 2000%256;
162 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -