📄 lcd.lst
字号:
266 4 for(temp=0;temp<16;temp++)
267 4 {
268 5 DataWrite( ~CBYTE[BASE+offset+2+temp*2+k]);
269 5 }
270 4 }
271 3 PSBANK=0x11;
272 3 uRow+=2;
273 3 i++;
274 3 }
275 2
276 2 if(uRow >= 40) // 光标后移
277 2 {
278 3 uCol += 16;
279 3 uRow = 0;
280 3 if( uCol >= 240 ) uCol = 0;
281 3 }
282 2
283 2 Locatexy(uRow,uCol);
284 2 i++;
285 2 }
286 1 CS=1;
287 1 }
288
289 //在x,y处用n位显示一个无符号数,不足n位左端补齐字符c。TYPE=0正常显示,=1反色显示
290 void putufig(unsigned char x,unsigned char y, unsigned long ulong,char n,char TYPE,char c)
291 {
292 1 char buf[12];
293 1 char len,i;
294 1 sprintf(buf,"%lu",ulong);
295 1 len=strlen(buf);
296 1 if( len<n )
297 1 {
298 2 for(i=n;i>=0;i--)
299 2 {
300 3 if(len>=0)
301 3 {
302 4 buf[i]=buf[len];
303 4 len--;
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 6
304 4 }
305 3 else
306 3 {
307 4 buf[i]=c;
308 4 }
309 3 }
310 2 }
311 1 if(TYPE==0)
312 1 dprintf(x,y,buf);
313 1 else
314 1 Udprintf(x,y,buf);
315 1 }
316
317 //以十六进制形式显示uchar 例如: 16H
318 void puthex(unsigned char x,unsigned char y, unsigned char hex)
319 {
320 1 unsigned int low,high;
321 1 char buf[5];
322 1 high=hex/16;
323 1 low=hex%16;
324 1 sprintf(buf,"%X%X%s",high,low,"H");
325 1 dprintf(x,y,buf);
326 1 }
327
328 //以二进制形式显示uchar 例如: 00010110
329 void putbin(unsigned char x,unsigned char y, unsigned char bin)
330 {
331 1 int i;
332 1 char buf[10];
333 1 for(i=7;i>=0;i--)
334 1 {
335 2 if(bin%2) buf[i]='1';
336 2 else buf[i]='0';
337 2 bin/=2;
338 2 }
339 1 buf[8]='\0';
340 1 dprintf(x,y,buf);
341 1 }
342
343 unsigned char X,Y,F; //全局变量,记录屏幕坐标
344 //显示文本,在全局变量x,y中保存光标位置,如果一页显示满则F置一
345 char * tprintf(unsigned char x,unsigned char y, char *ptr)
346 { //显示字符串,直到屏幕写满(F=1)或写完(F=0)。
347 1 unsigned char c1,c2; //返回指针指向所写最后一个字符的下一个。
348 1 unsigned int i,j,uLen;
349 1 unsigned char temp,uRow,uCol;
350 1 unsigned int k;
351 1 unsigned int offset;
352 1
353 1 CS=0;
354 1 uRow=x;
355 1 uCol=y;
356 1 uLen=0;
357 1
358 1 CmdWrite(CSRDIR_DOWN); /*光标移动方向定义,自动下移*/
359 1 Locatexy(uRow,uCol);
360 1
361 1 uLen=strlen(ptr);
362 1 i=0;
363 1 while(i<uLen)
364 1 {
365 2 c1=ptr[i];
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 7
366 2 c2=ptr[i+1];
367 2 if( c1 <= 128 ) // ASCII
368 2 {
369 3 if(uRow >= 40) //ASCII换行
370 3 {
371 4 uCol += 16;
372 4 uRow = 0;
373 4 }
374 3 if( uCol >= 208) //写满一页
375 3 {
376 4 F=1;
377 4 return ptr+i;
378 4 }
379 3 Locatexy(uRow,uCol);
380 3 if( c1==13 ) //文本文档中换行 = /r+/n (13+10)
381 3 {
382 4 uRow = 0;
383 4 i++;
384 4 }
385 3 else
386 3 {
387 4 if( c1==10 ) //文本文档中换行 = /r+/n (13+10)
388 4 {
389 5 uCol += 16;
390 5 i++;
391 5 }
392 4 else
393 4 {
394 5 CmdWrite( MWRITE ); // 写数据(命令)
395 5 for(j=0;j<16;j++) DataWrite( ASC_MSK[(c1-0x20)*16 +j]);
396 5 uRow++; //将光标调整到下一位置
397 5 i++;
398 5 }
399 4 }
400 3 }
401 2 else // 汉字
402 2 {
403 3 if(c2==0) //数据不完整,放弃显示
404 3 {
405 4 F=0;
406 4 return ptr+i;
407 4 }
408 3 if(uRow >= 39) //汉字换行,可能空一列
409 3 {
410 4 uCol += 16;
411 4 uRow = 0;
412 4 }
413 3 if( uCol >= 208) //写满一页
414 3 {
415 4 F=1;
416 4 return ptr+i;
417 4 }
418 3 offset=0;
419 3 //调整bank页,从第3页中取常数
420 3 PSBANK=0x31;
421 3 while(CBYTE[BASE+offset]!=0xFF || CBYTE[BASE+offset+1]!=0xFF)
422 3 {
423 4 if(CBYTE[BASE+offset]==c1 && CBYTE[BASE+offset+1]==c2)
424 4 break;
425 4 offset+=34;
426 4 }
427 3 for(k=0;k<2;k++) //分两列显示该汉字字模,先显示左半部分,再显示右半部分
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 8
428 3 {
429 4 Locatexy(uRow+k,uCol);
430 4 CmdWrite(CSRDIR_DOWN);
431 4 CmdWrite(MWRITE); //写数据命令
432 4 for(temp=0;temp<16;temp++)
433 4 {
434 5 DataWrite(CBYTE[BASE+offset+2+temp*2+k]);
435 5 }
436 4 }
437 3 PSBANK=0x11;
438 3 uRow+=2;
439 3 i+=2;
440 3 }
441 2
442 2 }//while(i<len)
443 1 CS=1;
444 1 X=uRow;
445 1 Y=uCol; //记录屏幕坐标
446 1 F=0; //表明正常写完字符串,未写满一页
447 1 return ptr+i; //写完返回'\0'
448 1 }
449
450 //给定两点连结一条直线(屏幕左上角为坐标原点)
451 void drawline(int x1,int y1,int x2,int y2)
452 {
453 1 double k; //斜率
454 1 int minx,maxx,miny,i,j;
455 1 int py; //记录前一个点的纵坐标
456 1
457 1 if(x1<x2)
458 1 {
459 2 minx=x1;
460 2 maxx=x2;
461 2 miny=y1;
462 2 }
463 1 else
464 1 {
465 2 minx=x2;
466 2 maxx=x1;
467 2 miny=y2;
468 2 }
469 1
470 1 if(x1==x2)
471 1 {
472 2 if(y1<=y2)
473 2 for(i=y1;i<=y2;i++)
474 2 Point(x1,i);
475 2 else
476 2 for(i=y2;i<=y1;i++)
477 2 Point(x1,i);
478 2 }
479 1 else
480 1 {
481 2 k=(double)(y2-y1)/(x2-x1);
482 2 py=miny; //py初值
483 2 for(i=minx;i<=maxx;i++)
484 2 {
485 3 unsigned char y; //当前点的纵坐标
486 3 y=(unsigned char)(k*(i-minx)+miny+0.5);
487 3 Point(i,y);
488 3 if(y<py) //插入点,使线连续
489 3 for(j=y+1;j<py;j++)
C51 COMPILER V7.01 LCD 06/30/2007 11:42:50 PAGE 9
490 3 Point(i,j);
491 3 if(y>py)
492 3 for(j=py+1;j<y;j++)
493 3 Point(i,j);
494 3 py=y;
495 3 }
496 2 }
497 1 }
498
499 //将n个点连结起来
500 void link(int *pointlist)
501 {
502 1 int n,i;
503 1 n=pointlist[0];
504 1 if(n<2)
505 1 return;
506 1 for(i=0;i<n-1;i++)
507 1 drawline(pointlist[2*i+1],pointlist[2*i+2],pointlist[2*i+3],pointlist[2*i+4]);
508 1 }
509
510 void circle(unsigned char ox,unsigned char oy,unsigned char r)
511 {
512 1 int x,y;
513 1 for(x=r;x>=0;x--)
514 1 {
515 2 y=r;
516 2 while(x*x+y*y>r*r) y--;
517 2 Point(ox-x,oy+y);
518 2 Point(ox+x,oy+y);
519 2 Point(ox+x,oy-y);
520 2 Point(ox-x,oy-y);
521 2 }
522 1
523 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3970 ----
CONSTANT SIZE = 1602 ----
XDATA SIZE = 5 135
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -