📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 06/05/2007 13:38:03 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 /*
2 //*************************************************************************
3 //
4 // 9键密码锁演示源文件
5 //
6 // COPYRIGHT (c) 2006 BY 明浩
7 // -- ALL RIGHTS RESERVED --
8 //
9 // File Name: main.c
10 // Created: 2007.3.10
11 // Modified: 2007.3.10
12 // Revision: 1.0
13 //
14 //*************************************************************************
15 //*************************************************************************
16 */
17
18 #include <at89x051.h>
19 #include <INTRINS.H>
20
21 //引脚定义,可以自行定义使用
22 #define Key P1
23 #define RLed P3_5
24 #define GLed P3_4
25 #define CS P3_1
26 #define SO P3_0
27 #define SI P3_3
28 #define SCK P3_2
29 #define Switch P3_7
30
31 void RESWDI(void);
32 void WREN(void);
33 void WRSR(void);
34 void WRDI(void);
35 void WIPCHK(void);
36 unsigned char RSDR(void);
37 unsigned char INPUTByte(void);
38 void OUTByte(unsigned char Byte);
39 void WriteByte(unsigned char Byte, unsigned char ADD);
40 unsigned char ReadByte(unsigned char ADD);
41 void Delay10ms();
42 void CLSPSW();
43
44 unsigned char KSVel[3]={0xFB,0xF7,0xEF};
45 unsigned char data UPSW[6]={3,1,5,8,1,8}, KPSW[6], KN; //写入的密码
46 unsigned int SW, SW2;
47
48 void main(void)
49 {
50 1 unsigned char Temp;
51 1
52 1 CS = 0;
53 1 KN = 0;
54 1 SW = 0;
55 1 SW2 = 0;
C51 COMPILER V7.50 MAIN 06/05/2007 13:38:03 PAGE 2
56 1 CLSPSW();
57 1
58 1 WREN();
59 1 WRSR(); //看门狗复位时间1.4s
60 1 WRDI();
61 1
62 1 for (Temp=0; Temp<6; Temp++)
63 1 {
64 2 WREN();
65 2 WriteByte(UPSW[Temp],Temp+1); //这里演示读出和写入 EEPROM
66 2 UPSW[Temp] = ReadByte(Temp+1); //从EEPROM读数据到数组; 这里使用1-6地址
67 2 //可以改成可以更改密码的
68 2 WRDI();
69 2 }
70 1
71 1 EA = 1; //允许CPU中断
72 1 ET0 = 1; //定时器0中断打开
73 1 TMOD = 0x1; //设定时器0为模式1,16位模式
74 1 TH0 = 0xB1;
75 1 TL0 = 0xE1; //设定时值为20000us(20ms)调整
76 1 TR0 = 1; //开始定时
77 1
78 1 RLed = 0; //指示灯状态 红灯亮
79 1 GLed = 1;
80 1
81 1 while(1);
82 1 }
83
84 //定时中断
85 void KeyAndDis_Time0(void) interrupt 1
86 {
87 1 unsigned char data Temp, TempV, TempN;
88 1
89 1 TR0 = 0;
90 1 TH0 = 0xB2;
91 1 TL0 = 0x06; //设定时值(己调整)
92 1
93 1 RESWDI(); //喂狗
94 1
95 1 if (Switch==0) //继电器被打开时计数
96 1 SW++;
97 1
98 1 if (SW > 500)
99 1 {
100 2 SW = 0;
101 2 Switch = 1; //继电器打开时间,10秒
102 2 RLed = 0;
103 2 GLed = 1;
104 2 }
105 1
106 1 if (KN>0)
107 1 SW2++;
108 1
109 1 if (SW2 > 1000)
110 1 {
111 2 SW2 = 0;
112 2 KN = 0; //二十秒内没有输入完6个数则要重新输入
113 2 CLSPSW();
114 2 }
115 1
116 1 for (Temp=0; Temp<3; Temp++)
117 1 {
C51 COMPILER V7.50 MAIN 06/05/2007 13:38:03 PAGE 3
118 2 Key = KSVel[Temp];
119 2 TempV = Key;
120 2 if (TempV<0xE0) //有键被按下时
121 2 {
122 3 Delay10ms(); //延时
123 3 if (TempV == Key)
124 3 {
125 4 SW2 = 0;
126 4 if (P1_7==0) KPSW[KN]=Temp*3+1;
127 4 if (P1_6==0) KPSW[KN]=Temp*3+2;
128 4 if (P1_5==0) KPSW[KN]=Temp*3+3;
129 4 KN++;
130 4 GLed = 0; //当键按下时 GLED亮1S
131 4 for (TempV=0; TempV<30; TempV++)
132 4 {
133 5 Delay10ms();
134 5 }
135 4 GLed = 1;
136 4 if (KN==6)
137 4 {
138 5 TempN = 0;
139 5 for (TempV=0; TempV<6; TempV++)
140 5 {
141 6 if (KPSW[TempV] == UPSW[TempV])
142 6 TempN++;
143 6 }
144 5 if (TempN==6)
145 5 {
146 6 Switch = 0;
147 6 GLed = 0;
148 6 RLed = 1; //绿灯亮
149 6 }
150 5 CLSPSW();
151 5 KN = 0;
152 5 SW2 = 0;
153 5 }
154 4 }
155 3 }
156 2 }
157 1 TR0 = 1;
158 1 }
159
160 //---------------------------------
161 //x5045子程序
162 //---------------------------------
163 void RESWDI(void) //复位看门狗(喂狗)
164 {
165 1 CS = 0;
166 1 CS = 1;
167 1 }
168
169 void WREN(void) //写使能锁存
170 {
171 1 SCK=0;
172 1 CS=0;
173 1 OUTByte(0x06); //发送06H写使能命令字
174 1 SCK=0;
175 1 CS=1;
176 1 }
177
178 void WRDI(void) //写使能复位(禁止写)
179 {
C51 COMPILER V7.50 MAIN 06/05/2007 13:38:03 PAGE 4
180 1 SCK=0;
181 1 CS=0;
182 1 OUTByte(0x04); //发送04H写禁止命令字
183 1 SCK=0;
184 1 CS=1;
185 1 }
186
187 void WRSR(void) //写状态寄存器
188 {
189 1 SCK=0;
190 1 CS=0;
191 1 OUTByte(0x01); //发送01H写寄存器命令字
192 1 OUTByte(0x20); //发送寄存器值BL0,BL1为0没写保护,WD0=0 WD1=0看门狗复位时间为1.4s
193 1 SCK=0;
194 1 CS=1;
195 1 WIPCHK(); //判断是否写入
196 1 }
197
198 unsigned char RSDR(void) //读状态寄存器
199 {
200 1 unsigned char Temp;
201 1
202 1 SCK=0;
203 1 CS=0;
204 1 OUTByte(0x05); //发送05H读状态寄存器命令字
205 1 Temp = INPUTByte(); //读状态寄存器值
206 1 SCK=0;
207 1 CS=1;
208 1 return Temp;
209 1 }
210
211 void WIPCHK(void) //检查WIP位,判断是否写入完成
212 {
213 1 unsigned char Temp;
214 1 unsigned int TempCyc;
215 1
216 1 for(TempCyc=0;TempCyc<0xFFFF;TempCyc++)
217 1 {
218 2 Temp = RSDR(); //读状态寄存器
219 2 Temp = Temp&0x01;
220 2 if (!Temp)
221 2 TempCyc = 0xFFFE;
222 2 }
223 1 }
224
225 void OUTByte(unsigned char Byte) //输出一个定节
226 {
227 1 unsigned char TempCyc;
228 1
229 1 for(TempCyc=0;TempCyc<8;TempCyc++)
230 1 {
231 2 SCK = 0;
232 2 SI = Byte & 0x80;
233 2 Byte = Byte<<1; //右移 -+
234 2 SCK = 1;
235 2 }
236 1 SI=0; //使SI处于确定的状态
237 1 }
238
239 unsigned char INPUTByte(void) //输入一个字节
240 {
241 1 unsigned char Temp=0, TempCyc;
C51 COMPILER V7.50 MAIN 06/05/2007 13:38:03 PAGE 5
242 1
243 1 for(TempCyc=0;TempCyc<8;TempCyc++)
244 1 {
245 2 Temp = Temp<<1; //右移
246 2 SCK = 0;
247 2 SCK = 0;
248 2 SCK = 1;
249 2 SCK = 1;
250 2 if (SO)
251 2 Temp = Temp|0x01; //SO为1,则最低位为1
252 2 }
253 1 return Temp;
254 1 }
255
256 unsigned char ReadByte(unsigned char ADD) //读地址中的数据这里不做先导字处理,只能读00-FFH
257 {
258 1 unsigned char Temp;
259 1
260 1 SCK=0;
261 1 CS=0;
262 1 OUTByte(0x3); //发送读指令03H 如要支持000-FFF则要把高位地址左移3位再为03H相或
263 1 OUTByte(ADD); //发送低位地址
264 1 Temp = INPUTByte();
265 1 SCK=0;
266 1 CS=1;
267 1 return Temp;
268 1 }
269
270 void WriteByte(unsigned char Byte, unsigned char ADD) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
271 {
272 1 SCK=0;
273 1 CS=0;
274 1 OUTByte(0x2); //发送写指令02H 如要支持000-FFF则要把高位地址左移2位再为02H相或
275 1 OUTByte(ADD); //发送低位地址
276 1 OUTByte(Byte); //发送数据
277 1 SCK=0;
278 1 CS=1;
279 1 WIPCHK(); //判断是否写入
280 1 }
281
282 void Delay10ms()
283 {
284 1 unsigned int Temp;
285 1
286 1 for (Temp=0; Temp<1900; Temp++);
287 1 }
288
289 void CLSPSW()
290 {
291 1 unsigned char Temp;
292 1
293 1 for (Temp=0; Temp<6; Temp++)
294 1 KPSW[Temp] = 0;
295 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 649 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 5
C51 COMPILER V7.50 MAIN 06/05/2007 13:38:03 PAGE 6
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -