📄 lcd16x2.lst
字号:
0AD2 .dbfunc s DelayLCDStartup _DelayLCDStartup fI
.even
0AD2 _DelayLCDStartup::
0AD2 .dbline 60{
;
; /* called from the main 1ms interrupt, must allow at least 40ms before lcd can be initialised */
; void DelayLCDStartup( void )
; {
0AD2 .dbline 61
; if ( LCDCounter && !CHECKBIT( LCDStatus, LCD_BUSY ) )
0AD2 90200127 lds R2,_LCDCounter
0AD4 2022 tst R2
0AD5 F049 breq L12
0AD6 902000E0 lds R2,_LCDStatus
0AD8 FC22 sbrc R2,2
0AD9 C005 rjmp L12
0ADA .dbline 62
; LCDCounter--; /* count down delay timer */
0ADA 91800127 lds R24,_LCDCounter
0ADC 5081 subi R24,1
0ADD 93800127 sts _LCDCounter,R24
0ADF L12:
0ADF .dbline 64
;
; if ( CHECKBIT( LCDStatus, LCD_INITIALISE ) && LCDCounter == 1 )
0ADF 902000E0 lds R2,_LCDStatus
0AE1 FE23 sbrs R2,3
0AE2 C006 rjmp L14
0AE3 91800127 lds R24,_LCDCounter
0AE5 3081 cpi R24,1
0AE6 F411 brne L14
0AE7 .dbline 65
; InitScreen(); /* initialise lcd */
0AE7 940E0AEA call _InitScreen
0AE9 L14:
0AE9 .dbline 66}
; }
0AE9 L11:
0AE9 9508 ret
0AEA .dbfunc s InitScreen _InitScreen fI
.even
0AEA _InitScreen::
0AEA 9722 sbiw R28,2
0AEB .dbline 69{
;
; void InitScreen( void )
; {
0AEB .dbline 70
; sprintf( LCDStr1, "%s", LCDHeader1 ); /* initialise lcd lines */
0AEB 903000B0 lds R3,_LCDHeader1+1
0AED 902000AF lds R2,_LCDHeader1
0AEF 8228 std y+0,R2
0AF0 8239 std y+1,R3
0AF1 EC28 ldi R18,<L17
0AF2 E030 ldi R19,>L17
0AF3 E105 ldi R16,<_LCDStr1
0AF4 E011 ldi R17,>_LCDStr1
0AF5 940E070B call _sprintf
0AF7 .dbline 71
; sprintf( LCDStr2, "%s", LCDHeader2 );
0AF7 903000B2 lds R3,_LCDHeader2+1
0AF9 902000B1 lds R2,_LCDHeader2
0AFB 8228 std y+0,R2
0AFC 8239 std y+1,R3
0AFD EC28 ldi R18,<L17
0AFE E030 ldi R19,>L17
0AFF E004 ldi R16,<_LCDStr2
0B00 E011 ldi R17,>_LCDStr2
0B01 940E070B call _sprintf
0B03 .dbline 72
; LCDLine = LINE1_AND_LINE2; /* both lines to be updated */
0B03 E083 ldi R24,3
0B04 93800126 sts _LCDLine,R24
0B06 .dbline 73
; LCDCounter--;
0B06 91800127 lds R24,_LCDCounter
0B08 5081 subi R24,1
0B09 93800127 sts _LCDCounter,R24
0B0B .dbline 74
; SETBIT( LCDStatus, LCD_UPDATE );
0B0B 918000E0 lds R24,_LCDStatus
0B0D 6082 ori R24,2
0B0E 938000E0 sts _LCDStatus,R24
0B10 .dbline 75}
; }
0B10 L16:
0B10 9622 adiw R28,2
0B11 9508 ret
0B12 .dbfunc s RefreshLCD _RefreshLCD fI
.even
0B12 _RefreshLCD::
0B12 .dbline 79{
;
; /* continously called when not serving interrupts and the micro is doing nothing */
; void RefreshLCD( void )
; {
0B12 .dbline 80
; if ( CHECKBIT( LCDStatus, LCD_OK ) )
0B12 902000E0 lds R2,_LCDStatus
0B14 FE20 sbrs R2,0
0B15 C006 rjmp L19
0B16 .dbline 81
; {
0B16 .dbline 82
; if ( CHECKBIT( LCDStatus, LCD_UPDATE ) )
0B16 FE21 sbrs R2,1
0B17 C00A rjmp L20
0B18 .dbline 83
; WriteToScreen();
0B18 940E0B4C call _WriteToScreen
0B1A .dbline 84
; }
0B1A 940C0B22 jmp L20
0B1C L19:
0B1C .dbline 85
; else if ( LCDCounter == _20MS )
0B1C 91800127 lds R24,_LCDCounter
0B1E 3184 cpi R24,20
0B1F F411 brne L23
0B20 .dbline 86
; ConfigureLCD(); /* configure lcd to 2 lines, 8bit interface */
0B20 940E0B23 call _ConfigureLCD
0B22 L23:
0B22 L20:
0B22 .dbline 87}
; }
0B22 L18:
0B22 9508 ret
.area lit
--- 0000 L26:
--- 0000 380C .byte 56,12
--- 0001 01 .byte 1
.area text
--- 00AE .dbfile C:\Documents\Software\AVR\lcd16x2\code\lcd.c
--- 00AE .dbfunc s ConfigureLCD _ConfigureLCD fI
--- 00AE .dbsym s initialise_table L26 Ac[3:3]
; i -> R20
.even
0B23 _ConfigureLCD::
0B23 940E06D2 call push_gset1
0B25 .dbline 91{
;
; /* sets the lcd to 2-line 16-character mode with 8-bit interface and auto incrementation */
; void ConfigureLCD( void )
; {
0B25 .dbline 95
; static const unsigned char initialise_table[] = {FUNCTION_SET, DISPLAY_ON, DISPLAY_CLEAR};
; unsigned char i;
;
; for ( i=0; i<3; i++ )
0B25 2744 clr R20
0B26 940C0B3A jmp L30
0B28 L27:
0B28 .dbline 96
0B28 .dbline 97
0B28 940E0C07 call _CheckIfBusy
0B2A .dbline 98
0B2A 2722 clr R18
0B2B 2733 clr R19
0B2C E783 ldi R24,<L26
0B2D E091 ldi R25,>L26
0B2E 2E24 mov R2,R20
0B2F 2433 clr R3
0B30 0E28 add R2,R24
0B31 1E39 adc R3,R25
0B32 2DE2 mov R30,R2
0B33 2DF3 mov R31,R3
0B34 95C8 lpm
0B35 2D00 mov R16,R0
0B36 2711 clr R17
0B37 940E0BF7 call _WriteToDevice
0B39 .dbline 99
0B39 L28:
0B39 .dbline 95
0B39 5F4F subi R20,255 ; addi 1
0B3A L30:
0B3A .dbline 95
0B3A 3043 cpi R20,3
0B3B F360 brlo L27
0B3C .dbline 101
; {
; CheckIfBusy();
; WriteToDevice( initialise_table[i], INSTRUCTION );
; }
;
; LCDCounter--;
0B3C 91800127 lds R24,_LCDCounter
0B3E 5081 subi R24,1
0B3F 93800127 sts _LCDCounter,R24
0B41 .dbline 102
; SETBIT( LCDStatus, LCD_OK );
0B41 918000E0 lds R24,_LCDStatus
0B43 6081 ori R24,1
0B44 938000E0 sts _LCDStatus,R24
0B46 .dbline 103
; SETBIT( LCDStatus, LCD_INITIALISE );
0B46 6088 ori R24,8
0B47 938000E0 sts _LCDStatus,R24
0B49 .dbline 104}
; }
0B49 L25:
0B49 940E06D5 call pop_gset1
0B4B 9508 ret
0B4C .dbsym r i 20 c
.area bss
--- 0000 .dbfile C:\Documents\Software\AVR\lcd16x2\code\lcd.c
--- 0000 L32:
--- 0000 .blkb 1
.area text
--- 00D7 .dbfile C:\Documents\Software\AVR\lcd16x2\code\lcd.c
--- 00D7 .dbfunc s WriteToScreen _WriteToScreen fI
--- 00D7 .dbsym s i L32 c
.even
0B4C _WriteToScreen::
0B4C .dbline 107{
;
; void WriteToScreen( void )
; {
0B4C .dbline 110
; static unsigned char i;
;
; if ( !CHECKBIT( LCDStatus, LCD_BUSY ) )
0B4C 902000E0 lds R2,_LCDStatus
0B4E FC22 sbrc R2,2
0B4F C046 rjmp L33
0B50 .dbline 111
; {
0B50 .dbline 112
; if ( LCDLine == LINE2 ) /* set which line is to be updated */
0B50 91800126 lds R24,_LCDLine
0B52 3082 cpi R24,2
0B53 F441 brne L35
0B54 .dbline 113
; WriteToDevice( SECOND_LINE, INSTRUCTION );
0B54 2722 clr R18
0B55 2733 clr R19
0B56 EC00 ldi R16,192
0B57 E010 ldi R17,0
0B58 940E0BF7 call _WriteToDevice
0B5A 940C0B62 jmp L36
0B5C L35:
0B5C .dbline 115
; else
; WriteToDevice( FIRST_LINE, INSTRUCTION );
0B5C 2722 clr R18
0B5D 2733 clr R19
0B5E E800 ldi R16,128
0B5F E010 ldi R17,0
0B60 940E0BF7 call _WriteToDevice
0B62 L36:
0B62 .dbline 117
;
; for ( i=0; i<16; i++ ) /* replace all characters after the null which space characters */
0B62 2422 clr R2
0B63 922000E1 sts L32,R2
0B65 940C0B8A jmp L40
0B67 L37:
0B67 .dbline 118
; if ( LCDStr1[i] == CHARACTER_NULL )
0B67 E185 ldi R24,<_LCDStr1
0B68 E091 ldi R25,>_LCDStr1
0B69 91E000E1 lds R30,L32
0B6B 27FF clr R31
0B6C 0FE8 add R30,R24
0B6D 1FF9 adc R31,R25
0B6E 8020 ldd R2,z+0
0B6F 2022 tst R2
0B70 F4A1 brne L41
0B71 .dbline 119
; for ( ; i<16; i++ )
0B71 940C0B81 jmp L46
0B73 L43:
0B73 .dbline 120
0B73 E185 ldi R24,<_LCDStr1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -