📄 5045.lst
字号:
219 { uchar tmp;
220 1 Sck=0;
221 1 CS=0;
222 1 tmp=READ_INST;
223 1 if(Address>255)
224 1 tmp|=0x08;
225 1 OutByte(tmp);
226 1 tmp=(uchar)(Address&0x00ff);
227 1 OutByte(Address);
228 1 tmp=InByte();
229 1 Sck=0;
230 1 CS=1;
231 1 return (tmp);
232 1 }
233 /*******************************************************************************************
234 ;名称:RstWatchDog
235 ;描述:复位看门狗定时器
236 ;功能:这段程序用来复位看门狗定时器,不发送命令
237 *******************************************************************************************/
238 void RstWatchDog()
239 { CS=0;
240 1 nop2();
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 5
241 1 CS=1;
242 1 }
243 /*******************************************************************************************
244 ;名称:WriteString
245 ;描述:字符中写入
246 ;功能:向X5045指定单元开始写入一串数据
247 ;参数:*s 指向待写数据 Adress 指定待写eeprom地址 Len 待写入字节长度
248 ;说明:不能跨页写
249 *******************************************************************************************/
250 void WriteString(uchar *s,uint Adress,uchar Len)
251 { uchar i=0;
252 1 WP=1;
253 1 WrenCmd(); //写允许
254 1 WrsrCmd(NoPro); //打开写保护块
255 1 for(i=0;i<Len;i++)
256 1 ByteWrite(Adress+i,*(s+i));
257 1 WP=0;
258 1 }
259 /*******************************************************************************************
260 ;名称:ReadString
261 ;描述:字符中读出
262 ;功能:从X5045指定单元读出一串数据,写入s指定的开始地址
263 ;参数:*s 指向待存数据区 Adress 指定待读eeprom地址 Len 待读入字节长度
264 ;说明:不能跨页写
265 *******************************************************************************************/
266
267 void ReadString(uchar *s,uint Adress,uchar Len)
268 {
269 1 uchar i=0;
270 1 for(i=0;i<Len;i++)
271 1 *(s+i)=ByteRead(Adress+i);
272 1 }
273
274 /*延时程序
275 由Delay参数确定延迟时间
276 */
277 void mDelay(unsigned int Delay)
278 { unsigned int i;
279 1 for(;Delay>0;Delay--)
280 1 { for(i=0;i<124;i++)
281 2 {;}
282 2 }
283 1 }
284
285 //以下是中断程序,实现显示及键盘处理
286 void Timer0() interrupt 1
287 { uchar tmp;
288 1 static uchar dCount; //计数器,显示程序通过它得知现正显示哪个数码管
289 1 static uchar KCount; //用于键盘的计数器,控制去键抖延时,首次按下延时,连续按下时的延时
290 1 static bit KMark; //有键被按下
291 1 static bit KFunc1; //用于S3键
292 1 TH0=TH0Val;
293 1 TL0=TL0Val;
294 1 tmp=BitTab[dCount]; //根据当前的计数值取位值
295 1 P2=P2|0xfc; //P2与11111100B相或,将高6位置1
296 1 P2=P2&tmp; //P2与取出的位值相与,将某一位清零
297 1 tmp=DispBuf[dCount]; //根据当前的计数值取显示缓冲待显示值
298 1 tmp=DispTab[tmp]; //取字形码
299 1 P0=tmp; //送出字形码
300 1 dCount++; //计数值加1
301 1 if(dCount==6) //如果计数值等于6,则让其回0
302 1 dCount=0;
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 6
303 1
304 1 P3|=0x3c; //按按键的各位置1
305 1 tmp=P3;
306 1 tmp|=0xc3; //未接键的各位置1
307 1 tmp=~tmp; //取反各位
308 1 if(!tmp) //如果结果是0表示无键被按下
309 1 { KMark=0;
310 2 KFirst=0;
311 2 KCount=0;
312 2 KFunc1=0;
313 2 return;
314 2 }
315 1 if(!KMark) //如果键按下标志无效
316 1 { KCount=4; //去键抖
317 2 KMark=1;
318 2 return;
319 2 }
320 1 KCount--;
321 1 if(KCount!=0) //如果不等于0
322 1 return;
323 1 if((tmp&0xfb)==0) //P3.2被按下
324 1 { if(KFunc) //要求计数值操作
325 2 NumCount++;
326 2 else
327 2 AddrCount++;
328 2 }
329 1 else if((tmp&0xf7)==0) //P3.3被按下
330 1 { if(KFunc) //要求计数值操作
331 2 NumCount--;
332 2 else
333 2 AddrCount--;
334 2 }
335 1 else if((tmp&0xef)==0) //P3.4被按下
336 1 { if(!KFunc1) //该位为0才进行切换,防止长时间按着反复切换
337 2 { KFunc=!KFunc; //切换状态
338 3 KFunc1=1;
339 3 }
340 2 }
341 1 else if((tmp&0xdf)==0)
342 1 { KEnter=1;
343 2 }
344 1 else //无键按下(出错处理)
345 1 { KMark=0;
346 2 KFirst=0;
347 2 KCount=0;
348 2 KFunc1=0;
349 2 }
350 1 if(KFirst) //不是第一次被按下(连加)
351 1 { KCount=20;
352 2 }
353 1 else //第一次被按下(间隔较长)
354 1 { KCount=200;
355 2 KFirst=1;
356 2 }
357 1 }
358
359 void Init()
360 { TMOD=0x01;
361 1 TH0=TH0Val;
362 1 TL0=TL0Val;
363 1 ET0=1; //开T0中断
364 1 EA=1; //开总中断
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 7
365 1 TR0=1; //T0开始运行
366 1 }
367
368 void Calc(uchar Dat1,uchar Dat2) //第一个参数放在第1、2位,第二个参数放入第5、6位
369 { DispBuf[0]=Dat1/16;
370 1 DispBuf[1]=Dat1%16;
371 1
372 1 DispBuf[4]=Dat2/16;
373 1 DispBuf[5]=Dat2%16;
374 1 }
375
376 void main()
377 {
378 1
379 1 uchar Mtd[5]; //待写数据存入该数组
380 1 uchar Mrd[5]; //读出的数据存入该数组
381 1
382 1 Init();
383 1
384 1 WrsrCmd(NoWdt); //关闭看门狗
385 1 WrsrCmd(NoPro); //不保护
386 1
387 1 DispBuf[2]=Hidden;
388 1 DispBuf[3]=Hidden;
389 1 DispBuf[4]=Hidden;
390 1 DispBuf[5]=Hidden;
391 1
392 1 D1Led=0; //点亮"读"控制灯
393 1 CS=1;
394 1 SO=1;
395 1 Sck=0;
396 1 SI=0;
397 1 RstWatchDog(); //复位看门狗
398 1 for(;;)
399 1 {
400 2 Calc(AddrCount,NumCount);
401 2 if(KFunc)
402 2 { D2Led=0; //点亮"读"灯
403 3 D1Led=1; //关断"写"灯
404 3 }
405 2 else
406 2 { D1Led=0; //点亮"写"灯
407 3 D2Led=1; //关掉"读"灯
408 3 }
409 2 if(KEnter) //按下了回车键
410 2 { if(KFunc) //写数据
411 3 { Mtd[0]=NumCount;//当前的计数值作为待写入的值
412 4 WP=1;
413 4 D8Led=0; //点亮指示灯
414 4 WriteString(Mtd,AddrCount,1); //从Mtd开始的单元中取出1字节数据写入
415 4 WP=0;
416 4 }
417 3 else //读数据
418 3 { D8Led=0; //点亮指示灯
419 4 ReadString(Mrd,AddrCount,1);//读出1字节数据,存入Mrd开始的单元中
420 4 NumCount=Mrd[0];
421 4 }
422 3 KEnter=0; //清回车键被按下的标志
423 3 mDelay(100); //延时一段时间(为看清D8亮过)
424 3 D8Led=1;
425 3 }
426 2 }
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 8
427 1 }
428
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 743 ----
CONSTANT SIZE = 25 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 23
IDATA SIZE = ---- ----
BIT SIZE = 5 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -