📄 1602.lst
字号:
C51 COMPILER V6.12 1602 10/12/2012 11:14:18 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG51.h>
2 #include<intrins.h>
3 #define LCM_Data P0
4 #define uchar unsigned char
5 #define uint unsigned int
6 #define w 6 //定义密码位数
7 sbit lcd1602_rs=P2^5;
8 sbit lcd1602_rw=P2^6;
9 sbit lcd1602_en=P2^7;
10
11 sbit Scl=P3^4; //24C02串行时钟
12 sbit Sda=P3^5; //24C02串行数据
13
14 sbit ALAM = P2^1; //报警
15 sbit KEY = P2^0; //开锁
16
17 sbit open_led=P2^2; //开锁指示灯
18
19 bit operation=0; //操作标志位
20 bit pass=0; //密码正确标志
21 bit ReInputEn=0; //重置输入充许标志
22 bit s3_keydown=0; //3秒按键标志位
23 bit key_disable=0; //锁定键盘标志
24
25 unsigned char countt0,second; //t0中断计数器,秒计数器
26
27 void Delay5Ms(void);
28
29 unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盘扫描控制表
30
31 unsigned char code start_line[] = {"password: "};
32 unsigned char code name[] = {"Coded Management"}; //显示名称
33 unsigned char code Correct[] = {" correct "}; //输入正确
34 unsigned char code Error[] = {" error "}; //输入错误
35 unsigned char code codepass[] = {" pass "};
36 unsigned char code LockOpen[] = {" true "}; //OPEN
37 unsigned char code SetNew[] = {"SetNewWordEnable"};
38 unsigned char code Input[] = {"input: "}; //INPUT
39 unsigned char code ResetOK[] = {"ResetPasswordOK "};
40 unsigned char code initword[] = {"Init password..."};
41 unsigned char code Er_try[] = {"error,try again!"};
42 unsigned char code again[] = {"input again "};
43
44 unsigned char InputData[6]; //输入密码暂存区
45 unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //当前密码值
46 unsigned char TempPassword[6];
47 unsigned char N=0; //密码输入位数记数
48 unsigned char ErrorCont; //错误次数计数
49 unsigned char CorrectCont; //正确输入计数
50 unsigned char ReInputCont; //重新输入计数
51 unsigned char code initpassword[6]={1,2,3,4,5,6};
52
53
54 //=====================5ms延时==============================
55 void Delay5Ms(void)
C51 COMPILER V6.12 1602 10/12/2012 11:14:18 PAGE 2
56 {
57 1 unsigned int TempCyc = 5552;
58 1 while(TempCyc--);
59 1 }
60
61 //===================400ms延时==============================
62 void Delay400Ms(void)
63 {
64 1 unsigned char TempCycA = 5;
65 1 unsigned int TempCycB;
66 1 while(TempCycA--)
67 1 {
68 2 TempCycB=7269;
69 2 while(TempCycB--);
70 2 }
71 1 }
72
73 //=============================================================================================
74 //================================24C02========================================================
75 //=============================================================================================
76
77 void mDelay(uint t) //延时
78 {
79 1 uchar i;
80 1 while(t--)
81 1 {
82 2 for(i=0;i<125;i++)
83 2 {;}
84 2 }
85 1 }
86
87
88 void Nop(void) //空操作
89 {
90 1 _nop_();
91 1 _nop_();
92 1 _nop_();
93 1 _nop_();
94 1 }
95
96
97 /*起始条件*/
98
99 void Start(void)
100 {
101 1 Sda=1;
102 1 Scl=1;
103 1 Nop();
104 1 Sda=0;
105 1 Nop();
106 1 }
107
108
109 /*停止条件*/
110 void Stop(void)
111 {
112 1 Sda=0;
113 1 Scl=1;
114 1 Nop();
115 1 Sda=1;
116 1 Nop();
117 1 }
C51 COMPILER V6.12 1602 10/12/2012 11:14:18 PAGE 3
118
119 /*应答位*/
120 void Ack(void)
121 {
122 1 Sda=0;
123 1 Nop();
124 1 Scl=1;
125 1 Nop();
126 1 Scl=0;
127 1 }
128
129 /*反向应答位*/
130 void NoAck(void)
131 {
132 1 Sda=1;
133 1 Nop();
134 1 Scl=1;
135 1 Nop();
136 1 Scl=0;
137 1 }
138
139 /*发送数据子程序,Data为要求发送的数据*/
140 void Send(uchar Data)
141 {
142 1 uchar BitCounter=8;
143 1 uchar temp;
144 1 do
145 1 {
146 2 temp=Data;
147 2 Scl=0;
148 2 Nop();
149 2 if((temp&0x80)==0x80)
150 2 Sda=1;
151 2 else
152 2 Sda=0;
153 2 Scl=1;
154 2 temp=Data<<1;
155 2 Data=temp;
156 2 BitCounter--;
157 2 }
158 1 while(BitCounter);
159 1 Scl=0;
160 1 }
161
162 /*读一字节的数据,并返回该字节值*/
163 uchar Read(void)
164 {
165 1 uchar temp=0;
166 1 uchar temp1=0;
167 1 uchar BitCounter=8;
168 1 Sda=1;
169 1 do{
170 2 Scl=0;
171 2 Nop();
172 2 Scl=1;
173 2 Nop();
174 2 if(Sda)
175 2 temp=temp|0x01;
176 2 else
177 2 temp=temp&0xfe;
178 2 if(BitCounter-1)
179 2 {
C51 COMPILER V6.12 1602 10/12/2012 11:14:18 PAGE 4
180 3 temp1=temp<<1;
181 3 temp=temp1;
182 3 }
183 2 BitCounter--;
184 2 }
185 1 while(BitCounter);
186 1 return(temp);
187 1 }
188
189 void WrToROM(uchar Data[],uchar Address,uchar Num)
190 {
191 1 uchar i;
192 1 uchar *PData;
193 1 PData=Data;
194 1 for(i=0;i<Num;i++)
195 1 {
196 2 Start();
197 2 Send(0xa0);
198 2 Ack();
199 2 Send(Address+i);
200 2 Ack();
201 2 Send(*(PData+i));
202 2 Ack();
203 2 Stop();
204 2 mDelay(20);
205 2 }
206 1 }
207
208 void RdFromROM(uchar Data[],uchar Address,uchar Num)
209 {
210 1 uchar i;
211 1 uchar *PData;
212 1 PData=Data;
213 1 for(i=0;i<Num;i++)
214 1 {
215 2 Start();
216 2 Send(0xa0);
217 2 Ack();
218 2 Send(Address+i);
219 2 Ack();
220 2 Start();
221 2 Send(0xa1);
222 2 Ack();
223 2 *(PData+i)=Read();
224 2 Scl=0;
225 2 NoAck();
226 2 Stop();
227 2 }
228 1 }
229
230
231 //==================================================================================================
232 //=======================================LCD1602====================================================
233 //==================================================================================================
234
235 #define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
236 #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
237
238
239 //----------------延时函数,后面经常调用----------------------
240 void delay(uint xms)//延时函数,有参函数
241 {
C51 COMPILER V6.12 1602 10/12/2012 11:14:18 PAGE 5
242 1 uint x,y;
243 1 for(x=xms;x>0;x--)
244 1 for(y=110;y>0;y--);
245 1 }
246
247 //--------------------------写指令---------------------------
248 write_1602com(uchar com)//****液晶写入指令函数****
249 {
250 1 lcd1602_rs=0;//数据/指令选择置为指令
251 1 lcd1602_rw=0; //读写选择置为写
252 1 P0=com;//送入数据
253 1 delay(1);
254 1 lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
255 1 delay(1);
256 1 lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
257 1 }
258
259 //-------------------------写数据-----------------------------
260 write_1602dat(uchar dat)//***液晶写入数据函数****
261 {
262 1 lcd1602_rs=1;//数据/指令选择置为数据
263 1 lcd1602_rw=0; //读写选择置为写
264 1 P0=dat;//送入数据
265 1 delay(1);
266 1 lcd1602_en=1; //en置高电平,为制造下降沿做准备
267 1 delay(1);
268 1 lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
269 1 }
270
271 //-------------------------初始化-------------------------
272 void lcd_init(void)
273 {
274 1 write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
275 1 write_1602com(0x0c);//开显示不显示光标
276 1 write_1602com(0x06);//整屏不移动,光标自动右移
277 1 write_1602com(0x01);//清显示
278 1 }
279 //========================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -