📄 11-5.5.lst
字号:
356 {
357 1 send_mi(address&0x7F); //&0x7F,考虑到防止越限
358 1 send_si(address&0x7F);
359 1 }
360
361 ////////////////////////////////////////////////////////////////////////////////
362 //调用方式:void putchar_l(uchar c)
363 //函数说明:在右页(从窗口)当前地址画一个字节(8点)
364 ////////////////////////////////////////////////////////////////////////////////
365 void putchar_l(uchar c)
C51 COMPILER V7.09 11_5_5 06/18/2004 09:33:22 PAGE 7
366 {
367 1 send_md(c);
368 1 }
369
370 ////////////////////////////////////////////////////////////////////////////////
371 //调用方式:void putchar_r(uchar c)
372 //函数说明:在左页(主窗口)当前地址画一个字节(8点)
373 ////////////////////////////////////////////////////////////////////////////////
374 void putchar_r(uchar c)
375 {
376 1 send_sd(c);
377 1 }
378
379 ////////////////////////////////////////////////////////////////////////////////
380 //调用方式:void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
381 //函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16
382 // bmp是图形指针
383 // 使用zimo21软件,采用纵向取模下高位得到bmp数据。
384 // col 图型的起始位置0~121
385 // layer 图形的位置(Y坐标)0-下半部分 非0-上半部分
386 // width 图形宽度8,16可选
387 // bmp 图形数据指针
388 ////////////////////////////////////////////////////////////////////////////////
389 void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
390 {
391 1 uchar x;
392 1 uchar address; //address表示显存的物理地址
393 1 uchar p=0;
394 1 uchar page=0;
395 1 uchar window=0; //page表示上下两页,window表示左右窗口(0左,1右)
396 1 if (layer) page=2; //左-主窗口,右-从窗口
397 1
398 1 for (x=col; x<col+width; x++)
399 1 {
400 2 if (x>121)return; //防止显示乱码
401 2 if (x>60) //左右窗口定位
402 2 {
403 3 window=1; //右-从窗口
404 3 address=x%61;
405 3 }
406 2 else
407 2 address=x; //主窗口输出
408 2
409 2 set_page(page); //上层数据输出
410 2 set_address(address);
411 2
412 2 if (window)
413 2 putchar_r(bmp[p]);
414 2 else
415 2 putchar_l(bmp[p]);
416 2
417 2 set_page(page+1); //下层数据输出
418 2 set_address(address); //列保持不变
419 2
420 2 if (window)
421 2 putchar_r(bmp[p+width]);
422 2 else
423 2 putchar_l(bmp[p+width]);
424 2
425 2 p++;
426 2 }
427 1 }
C51 COMPILER V7.09 11_5_5 06/18/2004 09:33:22 PAGE 8
428
429 ////////////////////////////////////////////////////////////////////////////////
430 //函数:void disp_one_ascii(uchar col,uchar layer,uchar ascii_code)
431 //说明:显示单个ASCII码col-列;layer-上下行:1-上,0-下;ascii_code:所要显示德ASCCII码
432 ////////////////////////////////////////////////////////////////////////////////
433 void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode)
434 {
435 1 uchar i;
436 1 for(i=0;i<16;i++) //ASCII码显示占用16个字节
437 1 {
438 2 if(mode)dot_buffer[i]=~ascii[(ascii_code-0x20)*16 + i];
439 2 else dot_buffer[i]= ascii[(ascii_code-0x20)*16 + i];
440 2 }
441 1 draw_bmp(col,layer,8,dot_buffer);
442 1 }
443
444 ////////////////////////////////////////////////////////////////////////////////
445 //函数:void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
446 //说明:显示小于4个的十进制数字//修改缓冲区的大小可以扩展显示
447 ////////////////////////////////////////////////////////////////////////////////
448 void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
449 {
450 1 while(n--)
451 1 {
452 2 if(mode)disp_one_ascii(col,layer,disp_buffer[n]+0x30,1);
453 2 else disp_one_ascii(col,layer,disp_buffer[n]+0x30,0);
454 2 col += 8;
455 2 }
456 1 }
457
458 ////////////////////////////////////////////////////////////////////////////////
459 //函数:void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
460 //说明:ASCII(8*16) 和 汉字(16*16)显示函数
461 ////////////////////////////////////////////////////////////////////////////////
462 void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
463 {
464 1 uchar c1,c2;
465 1 uchar i,j,k;
466 1 uchar ulen;
467 1 //uchar ucol,ulayer,umode;
468 1 uchar ucol,ulayer;
469 1 ulen = 0;
470 1 ucol = col;
471 1 ulayer = layer;
472 1
473 1 while (ptr[ulen]!= 0)ulen++; //探测字串长度
474 1 i=0;
475 1 while(i<ulen)
476 1 {
477 2 c1 = ptr[i];
478 2 c2 = ptr[i+1];
479 2 //ASCII字符与汉字内码的区别在于128做分界;大于128的为汉字码
480 2 if(c1 <=128) //ASCII
481 2 {
482 3 if(mode)disp_one_ascii(ucol,ulayer,c1,1);
483 3 else disp_one_ascii(ucol,ulayer,c1,0);
484 3 ucol+=8;
485 3 i++; //ASCII码的处理
486 3 }
487 2 else //中文
488 2 {
489 3 for(j=0;j<sizeof(hz16)/sizeof(hz16[0]);j++)
C51 COMPILER V7.09 11_5_5 06/18/2004 09:33:22 PAGE 9
490 3 { //查找定位当前汉字的点阵区
491 4 if((c1 == hz16[j].index[0]) && (c2 == hz16[j].index[1]))
492 4 break;
493 4 }
494 3 for(k=0;k<32;k++)
495 3 { if(mode)dot_buffer[k]=~hz16[j].zimo[k];
496 4 else dot_buffer[k]= hz16[j].zimo[k];
497 4 }
498 3 draw_bmp(ucol,ulayer,16,dot_buffer);
499 3 ucol+=16;
500 3 i+=2; //中文的处理
501 3 }
502 2 }
503 1 }
504
505 ////////////////////////////////////////////////////////////////////////////////
506 ////////////////////////////////////////////////////////////////////////////////
507 void main(void)
508 {
509 1 uchar i;
510 1 uint j;
511 1 // DDRC=0xF0; //C口高四位为输出控制端口
512 1 // DDRA=0xFF; //A口为数据线(一般为输出,仅在读LCD状态时为输入)
513 1 for(i=0;i<10;i++)for(j=1;j;j++); //开机延时
514 1 lcd_init();
515 1 lcd_clr();
516 1 dprintf(10,1,"I AM CHINESE!",0); //说明/在up 行从第10列开始显示/正常显示
517 1 disp_ram_data(10,0,2,1); //说明/在dowm行从第10列开始显示/反白显示
518 1 while(1);
519 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 946 ----
CONSTANT SIZE = 1042 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 39
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 + -