📄 lcd16b20.lst
字号:
d=DATA & 0xf;
d=d<<4;
d=d & 0xf0;
LCD_Data_Port=LCD_Data_Port | d;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
#endif
298 1 }
299 #endif
300
301
302 /*************************************************
303 * 函数说明:MCU向LCD16B20读取数据 *
C51 COMPILER V6.23a LCD16B20 10/16/2008 12:20:45 PAGE 6
304 * 输出参数: unsigned char DATA *
305 **************************************************/
306 #if LCD_EN_readData
unsigned char LCDreadData(void)
{
unsigned char redata;
#if LCD_DL<8
unsigned char temp;
#endif
LCDwaitForReady();
LCD_RS=1;//选择数据寄存器
NOP();
LCD_RW=1;//读取数据寄存器
NOP();
#if LCD_DL>4
LCD_Data_Port=0xff;
LCD_EN=1;
NOP();
redata=LCD_Data_Port;
LCD_EN=0;
#elif
LCD_Data_Port=LCD_Data_Port | 0xf0;
LCD_EN=1;
NOP();
redata=LCD_Data_Port;
LCD_EN=0;
redata=redata & 0xf0;
NOP();
LCD_EN=1;
NOP();
temp=LCD_Data_Port;
LCD_EN=0;
temp=temp >>4;
temp=temp & 0xf;
redata=redata | temp;
#endif
return (redata);
}
#endif
345
346
347 /**************************************
348 * 函数说明:背光灯控制 *
349 * 输入参数: bit onoff *
350 ***************************************/
351 #if LCD_EN_light
352 void LCDlight(bit onoff)
353 {
354 1 LCD_LED=onoff;
355 1 }
356 #endif
357
358
359 /***********************************************
360 * 函数说明:设置显示坐标函数 *
361 ************************************************/
362 //控制器内部带有80个*8位RAM(即80字节RAM),对于关系:
363 //第一行:00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10......27(40个)
364 //第二行:40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50......67(40个)
365 //第一行首个地址为:0x80+00;
C51 COMPILER V6.23a LCD16B20 10/16/2008 12:20:45 PAGE 7
366 //第二行首个地址为:0x80+0x0x40+00,即:0xc0+00
367 #if LCD_EN_setXY
368 void LCDsetXY(unsigned char X,unsigned char Y)
369 {
370 1 unsigned char Address;
371 1 if(X>39)
372 1 X=39;
373 1 if (Y == 0)
374 1 {
375 2 Address = 0x80 + X;
376 2 }
377 1 else
378 1 {
379 2 Address = 0xc0 + X;
380 2 }
381 1 LCDSendCommand(Address);
382 1 }
383 #endif
384
385
386 /********************************************************
387 * 函数说明:LCD字符串显示函数 *
388 ********************************************************/
389 #if LCD_EN_displayStr
void LCDdisplayStr(char *String)
{
while(*String)
{
LCDwriteData(*String);
String++;
}
}
#endif
399
400
401 /********************************************************
402 * 函数说明:指定XY坐标显示一个字符 *
403 * 输入参数:unsigned char X: X坐标 *
404 * unsigned cahr Y: Y坐标 *
405 * char ch: 被显示的字符 *
406 ********************************************************/
407 #if LCD_EN_putChar
408 void LCDputChar(unsigned char X,unsigned char Y,char ch)
409 {
410 1 LCDsetXY(X,Y);
411 1 LCDwriteData((unsigned char)ch);
412 1 }
413 #endif
414
415
416
417 /************************************************************
418 * 从指定位置开始显示字符串,如果是从第一行开始显示的,但是
419 * 无法显示完,自动从第二行开始显示,如果还没有显示完,就将余下的
420 *抛弃;如果是从第二行开始显示的,但是无法显示完,
421 *就抛弃没有显示的内容.
422 **************************************************************/
423 #if LCD_EN_printf
424 void LCDprintf(unsigned char X,unsigned char Y,char *String)
425 {
426 1 if(Y==0)
427 1 {
C51 COMPILER V6.23a LCD16B20 10/16/2008 12:20:45 PAGE 8
428 2 if(X<16)
429 2 {
430 3 LCDsetXY(X,Y);
431 3 for(;X<16 && *String!='\0';X++)
432 3 {
433 4 LCDwriteData((unsigned char)*String);
434 4 String++;
435 4 }
436 3 if(*String!='\0')
437 3 {
438 4 X=0;
439 4 Y=1;
440 4 }
441 3 }
442 2 }
443 1 if(Y==1)
444 1 {
445 2 LCDsetXY(X,Y);
446 2 for(;X<16 && *String!='\0';X++)
447 2 {
448 3 LCDwriteData((unsigned char)*String);
449 3 String++;
450 3 }
451 2 }
452 1 }
453 #endif
454
455
456 /*************************************************
457 * 函数说明:清除指定的一行显示,然后光标回到行首 *
458 * 输入参数:bit line: 如果line=0,表示是第一行 *
459 * 如果line=1,表示是第二行 *
460 **************************************************/
461 #if LCD_EN_clearLine
void LCDclearLine(bit line)
{
unsigned char i;
if(line) //第二行
LCDsetXY(0,1);
else //第一行
LCDsetXY(0,0);
for(i=0;i<16;i++)
LCDwriteData(' '); //向LCD写入16个空格
if(line) //回到第二行的第一个位置
LCDsetXY(0,1);
else //回到第一行的第一个位置
LCDsetXY(0,0);
}
#endif
477 //--------------------------------------------------
478 //延时nms函数
479 #if LCD_EN_delaynms
480 void delaynms(unsigned char n)
481 {
482 1 unsigned char i,j,k;
483 1 i=1;
484 1 #if Fosc>6
485 1 i=2;
486 1 #endif
487 1
488 1 for(;i>0;i--)
489 1 {
C51 COMPILER V6.23a LCD16B20 10/16/2008 12:20:45 PAGE 9
490 2 for(j=0;j<n;j++)
491 2 {
492 3 for(k=0;k<166;k++);
493 3 for(k=0;k<166;k++);
494 3 }
495 2 }
496 1 }
497 #endif
498
499
500 /********************************************
501 * 函数说明:LCD复位 *
502 *********************************************/
503 /*
504 1.延时15ms
505 2.写入指令:0x38(不检测忙信号)
506 3.延时5ms
507 4.写入指令:0x38(不检测忙信号)
508 5.延时5ms
509 6.写入指令:0x38(不检测忙信号)
510 以后读写都要检测忙信号
511 7.如果定义8位数据接口设置8位数据线,两行显示,字体格式:5*8
512 (7).如果定义是4为数据接口设置8位数据线,两行显示,字体格式:5*8
513 8.设置显示画面、光标、光标是否闪烁开关
514 9.设置输入模式,默认增量方式,画面不动,光标移动
515 10.清屏
516 */
517 #if LCD_EN_reset
518 void LCDreset(void)
519 {
520 1 delaynms(15); //延时15ms
521 1 LCD_RS=0;//选择指令寄存器
522 1 NOP();
523 1 LCD_RW=0;//MCU向LCD写入命令数据
524 1 NOP();
525 1 #if LCD_DL>4
526 1 LCD_Data_Port=0x38;
527 1 NOP();
528 1 LCD_EN=1;
529 1 NOP();
530 1 LCD_EN=0;
531 1 delaynms(5);
532 1
533 1 LCD_EN=1;
534 1 NOP();
535 1 LCD_EN=0;
536 1 delaynms(5);
537 1
538 1 LCD_EN=1;
539 1 NOP();
540 1 LCD_EN=0;
541 1 delaynms(5);
542 1 LCDsetFunction(1,1,1); //设置8位数据线,两行显示,字体格式:5*8
543 1 #elif
LCD_Data_Port=LCD_Data_Port & 0x3f;
LCD_Data_Port=LCD_Data_Port | 0x30;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
C51 COMPILER V6.23a LCD16B20 10/16/2008 12:20:45 PAGE 10
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCDsetFunction(0,1,1); //设置4位数据线,两行显示,字体格式:5*7
#endif
563 1
564 1 LCDsetDisplayModel(1,1,1);//设置显示画面、光标、光标是否闪烁开
565 1 LCDsetInputModel(1,0);//设置输入模式,默认增量方式,画面不动,光标向右边移动
566 1 LCDclear();
567 1 }
568 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 438 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- 9
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -