📄 tree.lst
字号:
C51 COMPILER V8.02 TREE 03/26/2009 20:55:54 PAGE 5
242 void chkbusy(void) //检测LCD忙状态
243 {
244 1 E=1; //LCD使能
245 1 RS=0; //读写指令
246 1 RW=1; //读
247 1 P2=0xff; //读操作以前先进行一次空读操作 接下来才能读到数据
248 1 while(!Busy); //等待不忙
249 1 }
250
251
252 void wcode(uc cd) //写指令代码
253 {
254 1 chkbusy(); //等待空闲
255 1 E=1; //以下使能LCD,设置LCD写指令状态
256 1 RW=0;
257 1 RS=0;
258 1 P2=cd; //写指令代码
259 1 E=1; //一下二句E产生下降沿,使得写操作有效
260 1 E=0;
261 1 }
262
263
264 void wdata(uc dat) //写显示数据
265 {
266 1 chkbusy(); //等待空闲
267 1 E=1; // 以下使能LCD,设置LCD写数据状态
268 1 RW=0;
269 1 RS=1;
270 1 P2=dat; //写数据代码
271 1 E=1; //一下二句E产生下降沿,使得写操作有效
272 1 E=0;
273 1 }
274
275
276 void display_HZ(uc page,uc col,uc *temp) //显示汉字子程序
277 {
278 1 L=1;R=0; //从左半屏开始 若列数超过128 改右
279 1 if(col>=0x80)
280 1 {
281 2 R=1;L=0;
282 2 col-=0x40;
283 2 }
284 1 wcode(page); //按要求写入页地址
285 1 wcode(col); //按要求从相应列开始写数据
286 1 for(j=0;j<16;j++) //写入一个汉字的上半部分,共16字节
287 1 {
288 2 wdata(temp[j]);
289 2 }
290 1 wcode(page+1); //从下一页开始显示汉字的下半部分要求从相应的列开始写数据
291 1 wcode(col);
292 1 for(j=16;j<32;j++)
293 1 {
294 2 wdata(temp[j]);
295 2 }
296 1 }
297
298
299 void display_FH(uc page,uc col,uc *temp) //显示16*8字符子程序
300 {
301 1 L=1;R=0; //从左半屏开始 若列数超过128 改右
302 1 if(col>=0x80)
303 1 {
C51 COMPILER V8.02 TREE 03/26/2009 20:55:54 PAGE 6
304 2 R=1;L=0;
305 2 col-=0x40;
306 2 }
307 1 wcode(page); //按要求写入页地址
308 1 wcode(col); //按要求从相应列开始写数据
309 1 for(j=0;j<8;j++)
310 1 {
311 2 wdata(temp[j]);
312 2 }
313 1 wcode(page+1);
314 1 wcode(col);
315 1 for(j=8;j<16;j++)
316 1 {
317 2 wdata(temp[j]);
318 2 }
319 1 }
320
321 void Display_FiveNum(uc a, uc b, float num) //函数功能:从a地址代表的页,b地址代表的列开始向左显示 0000.0
-五位数据,
322 {
323 1 uc flag=0,shuzu[5]=0; //shuzu[]用来存储num的千,百,十,个,'.',十分位共六位
324 1 ui i=0,j=0,num1,quzheng;
325 1 quzheng=num; //num的整数部分
326 1 num1=num*10; //先乘10,精确到十分位
327 1 while(num1) //分离float型 num 的整数部分quzheng的各位数字
328 1 {
329 2 i=num1%10;
330 2 num1=num1/10;
331 2 shuzu[j++]=i;
332 2 }
333 1 if(j!=0)
334 1 { while(shuzu[j--]==0);}
335 1 for(i=0;i<=j+1;i++)
336 1
337 1 { if(flag==1)
338 2 display_FH(a,b-(1+i)*8,SZ[shuzu[i]]);
339 2 if(flag==0)
340 2 display_FH(a,b-i*8,SZ[shuzu[i]]);
341 2 if(i==0)
342 2 {
343 3 display_FH(a,b-(i+1)*8,FH[1]);flag=1; //显示小数点
344 3 }
345 2 }
346 1 }
347
348
349 void initshow() //0xb8~0xbf表示第0~7页(64行); 0x01_____表示行(0x40~0x3f)
350 {
351 1 display_HZ(0xb8,0x40,HZ[0]); //单
352 1 display_HZ(0xb8,0x50,HZ[1]); //价
353 1 display_FH(0xb8,0x60,FH[0]); //:
354 1 Display_FiveNum(0xb8,0xA8,dj); //从0xA8列开始向左显示
355 1 display_HZ(0xb8,0xB0,HZ[8]); //元
356 1 display_HZ(0xba,0x40,HZ[2]); //里:一个汉字占2行 行+2
357 1 display_HZ(0xba,0x50,HZ[3]); //程
358 1 display_FH(0xba,0x60,FH[0]); //:
359 1 Display_FiveNum(0xba,0xA8,lc);
360 1 //display_FH(0xba,0xB0,FH[2]); //k
361 1 display_FH(0xba,0xB4,FH[3]); //m
362 1 display_HZ(0xbc,0x40,HZ[4]); //总
363 1 display_HZ(0xbc,0x50,HZ[1]); //价
364 1 display_FH(0xbc,0x60,FH[0]); //:
C51 COMPILER V8.02 TREE 03/26/2009 20:55:54 PAGE 7
365 1 Display_FiveNum(0xbc,0xA8,zj);
366 1 display_HZ(0xbc,0xB0,HZ[8]); //元
367 1 }
368
369
370 void int1() interrupt 0 //外部中断0——实时显示处理
371 {
372 1 lc=lc+0.5;
373 1 zj=lc*dj;
374 1 if(lc<3) zj=3;
375 1 Display_FiveNum(0xb8,0xA8,dj);
376 1 Display_FiveNum(0xba,0xA8,lc);
377 1 Display_FiveNum(0xbc,0xA8,zj);
378 1 }
379
380 void main(void)
381 {
382 1
383 1 uc t,a,b,c=0,flag1=100;
384 1 SCON=0x11; //方式0设置 (彬哥不理解)
385 1 //EX0=1; //打开外部中断0
386 1 IT0=1; //下降沿触发中断INT0
387 1 EA=1; //全局中断允许
388 1 iniLCD();
389 1 for(t=0;t<4;t++)
390 1 display_HZ(0xbb,0x50+23*t,HZ[9+t]);
391 1
392 1 //
393 1 while(1) //键盘扫描程序
394 1 {
395 2 P1=0x0f;//p1接矩阵键盘
396 2 a=P1;
397 2 delay(10);
398 2 P1=0xf0;
399 2 b=P1;
400 2 delay(10);
401 2 c=a+b; //c为键盘扫描的键值
402 2 if(c==0xee)
403 2 {flag1=0;delay(10);}//按下0
404 2 if(c==0xde)
405 2 {flag1=1;delay(10);}//按下1
406 2 if(c==0xbe)
407 2 { flag1=2;delay(300);}//2
408 2 if(c==0x7e)
409 2 { flag1=3;delay(300);}//3
410 2
411 2 switch(flag1)
412 2 {
413 3
414 3 case 0:flag1=-1;EX0=0;
415 3 dj=0;zj=0;lc=0;
416 3 SelectScreen(0);
417 3 for(i = 0;i < 8;i ++)
418 3 {
419 4 SetLine(i);
420 4 SetColum(64);
421 4 for(j = 0;j < 48; j++)
422 4 wdata(0x00);
423 4 }
424 3 initshow(); break;
425 3 case 1:flag1=-1;iniLCD();initshow();EX0=1;break;
426 3 /* case 1:
C51 COMPILER V8.02 TREE 03/26/2009 20:55:54 PAGE 8
427 3 {
428 3 flag1=-1;EX0=0;
429 3 iniLCD();initshow();break; //按下1,回归显示
430 3 Display_FiveNum(0xb8,0xA8,dj);
431 3 Display_FiveNum(0xba,0xA8,lc);
432 3 Display_FiveNum(0xbc,0xA8,zj);break; // 按下0,清0; */
433 3
434 3 case 2:flag1=-1;EX0=0;dj+=0.5;zj=0;lc=0;
435 3 SelectScreen(0);
436 3 for(i = 0;i < 8;i ++)
437 3 {
438 4 SetLine(i);
439 4 SetColum(64);
440 4 for(j = 0;j < 48; j++)
441 4 wdata(0x00);
442 4 }
443 3 Display_FiveNum(0xb8,0xA8,dj);
444 3 Display_FiveNum(0xba,0xA8,lc);
445 3 Display_FiveNum(0xbc,0xA8,zj);
446 3 break;
447 3
448 3 case 3:flag1=-1;EX0=0;
449 3 if(dj>0)
450 3 {dj-=0.5;zj=0;lc=0;}
451 3 SelectScreen(0);
452 3 for(i = 0;i < 8;i ++)
453 3 {
454 4 SetLine(i);
455 4 SetColum(64);
456 4 for(j = 0;j < 48; j++)
457 4 wdata(0x00);
458 4 }
459 3 Display_FiveNum(0xb8,0xA8,dj);
460 3 Display_FiveNum(0xba,0xA8,lc);
461 3 Display_FiveNum(0xbc,0xA8,zj);
462 3 break;
463 3 //case 3:flag1=-1;EX0=0;
464 3 }
465 2 //if(c!=0xff)
466 2 // break;
467 2 //if(c==0x7e)
468 2 // {show_shuzi(3); break;}//按下3,右屏显示‘3’
469 2
470 2 }
471 1 //while(1);
472 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1599 ----
CONSTANT SIZE = 645 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 29
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 + -