📄 text1.lst
字号:
267 0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00,
268 "测",0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
269 0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,
270 "试",0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
271 0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00,
272 };
273 uchar gCurRow,gCurCol; // 当前行、列存储,行高16 点,列宽8 点
274 uchar fnGetRow(void)
275 {
276 return gCurRow;
277 }
278 uchar fnGetCol(void)
279 {
280 return gCurCol;
281 }
282 uchar fnST01(void) // 状态位STA1,STA0 判断(读写指令和读写数据)
283 {
284 uchar i;
285 for(i=10;i>0;i--)
286 {
287 if((LCMCW & 0x03) == 0x03)
288 break;
289 }
290 return i; // 若返回零,说明错误
291 }
292 uchar fnST2(void) // 状态位ST2 判断(数据自动读状态)
293 {
294 uchar i;
295 for(i=10;i>0;i--)
296 {
297 if((LCMCW & 0x04) == 0x04)
298 break;
299 }
300 return i; // 若返回零,说明错误
301 }
302 uchar fnST3(void) // 状态位ST3 判断(数据自动写状态)
303 {
C51 COMPILER V6.12 TEXT1 08/27/2008 00:32:44 PAGE 6
304 uchar i;
305 for(i=10;i>0;i--)
306 {
307 if((LCMCW & 0x08) == 0x08)
308 break;
309 }
310 return i; // 若返回零,说明错误
311 }
312 uchar fnST6(void) // 状态位ST6 判断(屏读/屏拷贝状态)
313 {
314 uchar i;
315 for(i=10;i>0;i--)
316 {
317 if((LCMCW & 0x40) == 0x40)
318 break;
319 }
320 return i; // 若返回零,说明错误
321 }
322 uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令
323 {
324 if(fnST01() == 0)
325 return 1;
326 LCMDW = uPar1;
327 if(fnST01() == 0)
328 return 2;
329 LCMDW = uPar2;
330 if(fnST01() == 0)
331 return 3;
332 LCMCW = uCmd;
333 return 0; // 返回0 成功
334 }
335 uchar fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令
336 {
337 if(fnST01() == 0)
338 return 1;
339 LCMDW = uPar1;
340 if(fnST01() == 0)
341 return 2;
342 LCMCW = uCmd;
343 return 0; // 返回0 成功
344 }
345 uchar fnPR12(uchar uCmd) // 写无参数的指令
346 {
347 if(fnST01() == 0)
348 return 1;
349 LCMCW = uCmd;
350 return 0; // 返回0 成功
351 }
352 uchar fnPR13(uchar uData) // 写数据
353 {
354 if(fnST3() == 0)
355 return 1;
356 LCMDW = uData;
357 return 0; // 返回0 成功
358 }
359 uchar fnPR2(void) // 读数据
360 {
361 if(fnST01() == 0)
362 return 1;
363 return LCMDW;
364 }
365 // 设置当前地址
C51 COMPILER V6.12 TEXT1 08/27/2008 00:32:44 PAGE 7
366 void fnSetPos(uchar urow, uchar ucol)
367 {
368 uint iPos;
369 iPos = urow * 30 + ucol;
370 fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
371 gCurRow = urow;
372 gCurCol = ucol;
373 }
374 // 设置当前显示行、列
375 void cursor(uchar uRow, uchar uCol)
376 {
377 fnSetPos(uRow * 16, uCol);
378 }
379 // 清屏
380 void cls(void)
381 {
382 uint i;
383 fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针
384 fnPR12(LC_AUT_WR); // 自动写
385 for(i=0;i<240*30;i++)
386 {
387 fnST3();
388 fnPR13(0x00); // 写数据
389 }
390 fnPR12(LC_AUT_OVR); // 自动写结束
391 fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
392 gCurRow = 0; // 置地址指针存储变量
393 gCurCol = 0;
394 }
395 // LCM 初始化
396 char fnLCMInit(void)
397 {
398 if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
399 return -1;
400 fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
401 fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
402 fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
403 fnPR12(LC_CUR_SHP | 0x01); // 光标形状
404 fnPR12(LC_MOD_OR); // 显示方式设置
405 fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
406 return 0;
407 }
408 // ASCII(8*16) 及 汉字(16*16) 显示函数
409 uchar dprintf(char *fmt, ...)
410 {
411 va_list arg_ptr;
412 char c1,c2,cData;
413 char tmpBuf[64]; // LCD显示数据缓冲区
414 uchar i=0,j,uLen,uRow,uCol;
415 uint k;
416 va_start(arg_ptr, fmt);
417 uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
418 va_end(arg_ptr);
419 while(i<uLen)
420 {
421 c1 = tmpBuf[i];
422 c2 = tmpBuf[i+1];
423 uRow = fnGetRow();
424 uCol = fnGetCol();
425 if(c1 >= 0)
426 { // ASCII
427 if(c1 < 0x20)
C51 COMPILER V6.12 TEXT1 08/27/2008 00:32:44 PAGE 8
428 {
429 switch(c1)
430 {
431 case CR:
432 case LF: // 回车或换行
433 i++;
434 if(uRow < 112)
435 fnSetPos(uRow+16,0);
436 else
437 fnSetPos(0,0);
438 continue;
439 case BS: // 退格
440 if(uCol > 0)
441 uCol--;
442 fnSetPos(uRow,uCol);
443 cData = 0x00;
444 break;
445 default: // 其他
446 c1 = 0x1f;
447 }
448 }
449 for(j=0;j<16;j++)
450 {
451 fnPR12(LC_AUT_WR); // 写数据
452 if(c1 >= 0x1f)
453 {
454 if(j < (16-ASC_CHR_HEIGHT))
455 fnPR13(0x00);
456 else
457 fnPR13(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-
458 ASC_CHR_HEIGHT)]);
459 }
460 else
461 fnPR13(cData);
462 fnPR12(LC_AUT_OVR);
463 fnSetPos(uRow+j+1,uCol);
464 }
465 if(c1 != BS) // 非退格
466 uCol++;
467 }
468 else
469 { // 中文
470 for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
471 {
472 if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
473 break;
474 }
475 for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
476 {
477 fnSetPos(uRow+k,uCol);
478 fnPR12(LC_AUT_WR); // 写数据
479 if(j < sizeof(GB_16)/sizeof(GB_16[0]))
480 {
481 fnPR13(GB_16[j].Msk[k*2]);
482 fnPR13(GB_16[j].Msk[k*2+1]);
483 }
484 else // 未找到该字
485 {
486 if(k < sizeof(GB_16[0].Msk)/4)
487 {
488 fnPR13(0x00);
489 fnPR13(0x00);
C51 COMPILER V6.12 TEXT1 08/27/2008 00:32:44 PAGE 9
490 }
491 else
492 {
493 fnPR13(0xff);
494 fnPR13(0xff);
495 }
496 }
497 fnPR12(LC_AUT_OVR);
498 }
499 uCol += 2;
500 i++;
501 }
502 if(uCol >= 30) // 光标后移
503 {
504 uRow += 16;
505 if(uRow < 0x80)
506 uCol -= 30;
507 else
508 {
509 uRow = 0;
510 uCol = 0;
511 }
512 }
513 fnSetPos(uRow,uCol);
514 i++;
515 }
516 return uLen;
517 }
518 void main(void) // 测试用
519 {
520 fnLCMInit();
521 cls();
522 cursor(0,0);
523 dprintf("%s","This is a test:中文测试");
524 }
525 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 28 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
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 + -