📄 hal_lcd.lst
字号:
395 void HalLcdDisplayPercentBar( char *title, uint8 value )
\ HalLcdDisplayPercentBar:
396 {
\ 000000 74F4 MOV A,#-0xc
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 12
\ 000005 ; Auto size: 17
\ 000005 74EF MOV A,#-0x11
\ 000007 12.... LCALL ?ALLOC_XSTACK8
\ 00000A E9 MOV A,R1
\ 00000B FE MOV R6,A
397 #if (HAL_LCD == TRUE)
398 uint8 percent;
399 uint8 leftOver;
400 uint8 buf[17];
401 uint32 err;
402 uint8 x;
403
404 /* Write the title: */
405 HalLcdWriteString( title, HAL_LCD_LINE_1 );
406
407 if ( value > 100 )
\ 00000C C3 CLR C
\ 00000D 9465 SUBB A,#0x65
\ 00000F 4002 JC ??HalLcdDisplayPercentBar_0
408 value = 100;
\ 000011 7E64 MOV R6,#0x64
409
410 /* convert to blocks */
411 percent = (byte)(value / 10);
\ ??HalLcdDisplayPercentBar_0:
\ 000013 75F00A MOV B,#0xa
\ 000016 EE MOV A,R6
\ 000017 84 DIV AB
\ 000018 F5.. MOV ?V0 + 3,A
412 leftOver = (byte)(value % 10);
\ 00001A EE MOV A,R6
\ 00001B 75F00A MOV B,#0xa
\ 00001E 84 DIV AB
\ 00001F AFF0 MOV R7,B
413
414 /* Make window */
415 osal_memcpy( buf, "[ ] ", 15 );
\ 000021 ; Setup parameters for call to function osal_memcpy
\ 000021 75.... MOV ?V0 + 0,#(`?<Constant "[ ] ">` & 0xff)
\ 000024 75.... MOV ?V0 + 1,#((`?<Constant "[ ] ">` >> 8) & 0xff)
\ 000027 75..00 MOV ?V0 + 2,#0x0
\ 00002A 78.. MOV R0,#?V0 + 0
\ 00002C 12.... LCALL ?PUSH_XSTACK_I_THREE
\ 00002F 7C0F MOV R4,#0xf
\ 000031 7D00 MOV R5,#0x0
\ 000033 7403 MOV A,#0x3
\ 000035 12.... LCALL ?XSTACK_DISP0_8
\ 000038 AA82 MOV R2,DPL
\ 00003A AB83 MOV R3,DPH
\ 00003C 90.... MOV DPTR,#(osal_memcpy & 0xffff)
\ 00003F 74.. MOV A,#((osal_memcpy >> 16) & 0xff)
\ 000041 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000044 7403 MOV A,#0x3
\ 000046 12.... LCALL ?DEALLOC_XSTACK8
416
417 for ( x = 0; x < percent; x ++ )
\ 000049 800C SJMP ??HalLcdDisplayPercentBar_1
418 {
419 buf[1+x] = '>';
\ ??HalLcdDisplayPercentBar_2:
\ 00004B 85.... MOV ?V0 + 0,?V0 + 2
\ 00004E 12.... LCALL ?Subroutine1 & 0xFFFF
\ ??CrossCallReturnLabel_3:
\ 000051 A3 INC DPTR
\ 000052 743E MOV A,#0x3e
\ 000054 F0 MOVX @DPTR,A
420 }
\ 000055 05.. INC ?V0 + 2
\ ??HalLcdDisplayPercentBar_1:
\ 000057 E5.. MOV A,?V0 + 2
\ 000059 C3 CLR C
\ 00005A 95.. SUBB A,?V0 + 3
\ 00005C 40ED JC ??HalLcdDisplayPercentBar_2
421
422 if ( leftOver >= 5 )
\ 00005E EF MOV A,R7
\ 00005F C3 CLR C
\ 000060 9405 SUBB A,#0x5
\ 000062 4016 JC ??HalLcdDisplayPercentBar_3
423 buf[1+x] = '+';
\ 000064 85..82 MOV DPL,?XSP + 0
\ 000067 85..83 MOV DPH,?XSP + 1
\ 00006A E582 MOV A,DPL
\ 00006C 25.. ADD A,?V0 + 2
\ 00006E F582 MOV DPL,A
\ 000070 E583 MOV A,DPH
\ 000072 3400 ADDC A,#0x0
\ 000074 F583 MOV DPH,A
\ 000076 A3 INC DPTR
\ 000077 742B MOV A,#0x2b
\ 000079 F0 MOVX @DPTR,A
424
425 err = (uint32)value;
426 _ltoa( err, (uint8*)&buf[13], 10 );
\ ??HalLcdDisplayPercentBar_3:
\ 00007A ; Setup parameters for call to function _ltoa
\ 00007A 740D MOV A,#0xd
\ 00007C 12.... LCALL ?XSTACK_DISP0_8
\ 00007F 8582.. MOV ?V0 + 0,DPL
\ 000082 8583.. MOV ?V0 + 1,DPH
\ 000085 78.. MOV R0,#?V0 + 0
\ 000087 12.... LCALL ?PUSH_XSTACK_I_TWO
\ 00008A 790A MOV R1,#0xa
\ 00008C EE MOV A,R6
\ 00008D FA MOV R2,A
\ 00008E 7B00 MOV R3,#0x0
\ 000090 7C00 MOV R4,#0x0
\ 000092 7D00 MOV R5,#0x0
\ 000094 90.... MOV DPTR,#(_ltoa & 0xffff)
\ 000097 74.. MOV A,#((_ltoa >> 16) & 0xff)
\ 000099 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00009C 7402 MOV A,#0x2
\ 00009E 12.... LCALL ?DEALLOC_XSTACK8
427
428 HalLcdWriteString( (char*)buf, HAL_LCD_LINE_2 );
429 #endif /* HAL_LCD */
430 }
\ 0000A1 7411 MOV A,#0x11
\ 0000A3 12.... LCALL ?DEALLOC_XSTACK8
\ 0000A6 7F04 MOV R7,#0x4
\ 0000A8 02.... LJMP ?BANKED_LEAVE_XDATA
\ In segment XDATA_ID, align 1, keep-with-next
\ `?<Initializer for <Constant "[ ] ">>`:
\ 000000 5B202020 DB "[ ] "
\ 20202020
\ 2020205D
\ 202000
\ In segment XDATA_I, align 1, keep-with-next
\ `?<Constant "[ ] ">`:
\ 000000 DS 15
\ 00000F REQUIRE `?<Initializer for <Constant "[ ] ">>`
\ 00000F REQUIRE __INIT_XDATA_I
431
432 #if (defined LCD_HW) && (HAL_LCD == TRUE)
433 /*********************************************************************
434 * @fn initLcd
435 * @brief Initializes LCD I/O bus and LCD device
436 * @param void
437 * @return void
438 */
439 static void initLcd( void )
440 {
441 uint8 buffer[8];
442
443 // Initialize the serial I/O bus
444 initSmb();
445
446 // Load LCD initialization message
447 buffer[0] = LCD_ADDR;
448 buffer[1] = LCD_RS_0; // Instruction Register
449 buffer[2] = 0x0C; // Display control D = 1: Display On
450 // C = 0: Cursor Off
451 // B = 0: Cursor character blink off
452 buffer[3] = 0x21; // Function set H = 1: Use extended instruction set
453 buffer[4] = 0xA0; // Set DDRAM address ADD = 0x20
454 buffer[5] = 0x07; // Display configuration P = 1: Column data right to left
455 // Q = 1: Row data, bottom to top
456 buffer[6] = 0x34; // Function set DL= 0: 4 bits
457 // M = 1: 2-line by 16 display
458 // SL= 0: MUX1:18
459 // H = 0: Use basic instruction set
460 buffer[7] = 0x01; // Clearing display
461
462 // Send message to LCD device
463 smbSend( buffer, 8 );
464
465 }
466
467 /*********************************************************************
468 * @fn lcdUpdateLine
469 * @brief Updates one line of the LCD display
470 * @param line - LCD line numberptr to string going to LCD line 1
471 * @param p2 - ptr to string going to LCD line 2
472 * @return void
473 */
474 static void lcdUpdateLine( uint8 line, uint8 *pLine )
475 {
476 uint8 i;
477 uint8 chr;
478 uint8 addr;
479 uint8 *buffer;
480
481 if ( line == HAL_LCD_LINE_1 )
482 addr = LCD_LINE1_ADDR;
483 else
484 addr = LCD_LINE2_ADDR;
485
486 // Get a buffer to work with
487 buffer = osal_mem_alloc( 2+HAL_LCD_MAX_CHARS );
488 if ( buffer != NULL )
489 {
490 // Build and send control string
491 buffer[0] = LCD_ADDR;
492 buffer[1] = LCD_RS_0;
493 buffer[2] = addr;
494 smbSend( buffer, 3 );
495
496 // Build and send message string
497 buffer[0] = LCD_ADDR;
498 buffer[1] = LCD_RS_1;
499 // Convert and save message bytes
500 for( i = 2; i < 2+HAL_LCD_MAX_CHARS; i++ )
501 {
502 chr = *pLine++;
503 if ( chr == '\0' )
504 {
505 chr = lcdConvertChar( ' ' );
506 break;
507 }
508 else
509 buffer[i] = lcdConvertChar( chr );
510 }
511
512 // Fill remainder of line with blanks
513 for( ; i < 2+HAL_LCD_MAX_CHARS; i++ )
514 buffer[i] = chr;
515
516 // Put it on the display
517 smbSend( buffer, 2+HAL_LCD_MAX_CHARS );
518
519 // Give back buffer memory
520 osal_mem_free( buffer );
521 }
522 }
523
524 /*********************************************************************
525 * @fn lcdConvertChar
526 * @brief Converts an ASCII character to an LCD character (R sheet)
527 * @param aChar - ASCII character
528 * @return lChar - LCD character
529 */
530 static byte lcdConvertChar( byte aChar )
531 {
532 uint8 lChar;
533
534 if ((aChar >= 'a') && (aChar <= 'z'))
535 // Lower case
536 lChar = aChar + ('a' - 0xE1);
537 else if ((aChar >= 'A') && (aChar <= 'Z'))
538 // Upper case
539 lChar = aChar + ('A' - 0xC1);
540 else if (((aChar >= ' ') && (aChar <= '#')) ||
541 ((aChar >= '%') && (aChar <= '?')))
542 // Sonme symbols
543 lChar = aChar + (' ' - 0xA0);
544 else
545 {
546 switch ( aChar )
547 {
548 case '$':
549 lChar = 0x82;
550 break;
551 case '
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -