📄 lcd16x2.lst
字号:
0B74 E091 ldi R25,>_LCDStr1
0B75 91E000E1 lds R30,L32
0B77 27FF clr R31
0B78 0FE8 add R30,R24
0B79 1FF9 adc R31,R25
0B7A E280 ldi R24,32
0B7B 8380 std z+0,R24
0B7C L44:
0B7C .dbline 119
0B7C 918000E1 lds R24,L32
0B7E 5F8F subi R24,255 ; addi 1
0B7F 938000E1 sts L32,R24
0B81 L46:
0B81 .dbline 119
0B81 918000E1 lds R24,L32
0B83 3180 cpi R24,16
0B84 F370 brlo L43
0B85 L41:
0B85 L38:
0B85 .dbline 117
0B85 918000E1 lds R24,L32
0B87 5F8F subi R24,255 ; addi 1
0B88 938000E1 sts L32,R24
0B8A L40:
0B8A .dbline 117
0B8A 918000E1 lds R24,L32
0B8C 3180 cpi R24,16
0B8D F2C8 brlo L37
0B8E .dbline 121
; LCDStr1[i] = CHARACTER_SPACE;
; i = 0;
0B8E 2422 clr R2
0B8F 922000E1 sts L32,R2
0B91 .dbline 122
; SETBIT( LCDStatus, LCD_BUSY );
0B91 918000E0 lds R24,_LCDStatus
0B93 6084 ori R24,4
0B94 938000E0 sts _LCDStatus,R24
0B96 .dbline 123
; }
0B96 L33:
0B96 .dbline 125
;
; CheckIfBusy();
0B96 940E0C07 call _CheckIfBusy
0B98 .dbline 126
; WriteToDevice( LCDStr1[i++], DATA ); /* write character to screen */
0B98 E021 ldi R18,1
0B99 E030 ldi R19,0
0B9A 902000E1 lds R2,L32
0B9C 2433 clr R3
0B9D 2D82 mov R24,R2
0B9E 2D93 mov R25,R3
0B9F 9601 adiw R24,1
0BA0 938000E1 sts L32,R24
0BA2 E185 ldi R24,<_LCDStr1
0BA3 E091 ldi R25,>_LCDStr1
0BA4 2DE2 mov R30,R2
0BA5 2DF3 mov R31,R3
0BA6 0FE8 add R30,R24
0BA7 1FF9 adc R31,R25
0BA8 8100 ldd R16,z+0
0BA9 2711 clr R17
0BAA 940E0BF7 call _WriteToDevice
0BAC .dbline 128
;
; if ( i>15 ) /* finished line */
0BAC E08F ldi R24,15
0BAD 902000E1 lds R2,L32
0BAF 1582 cp R24,R2
0BB0 F010 brlo X0
0BB1 940C0BF6 jmp L47
0BB3 X0:
0BB3 .dbline 129
; {
0BB3 .dbline 130
; CheckIfBusy(); /* check is lcd is connected */
0BB3 940E0C07 call _CheckIfBusy
0BB5 .dbline 131
; if ( LCDLine == LINE2 )
0BB5 91800126 lds R24,_LCDLine
0BB7 3082 cpi R24,2
0BB8 F441 brne L49
0BB9 .dbline 132
; WriteToDevice( SECOND_LINE, INSTRUCTION );
0BB9 2722 clr R18
0BBA 2733 clr R19
0BBB EC00 ldi R16,192
0BBC E010 ldi R17,0
0BBD 940E0BF7 call _WriteToDevice
0BBF 940C0BC7 jmp L50
0BC1 L49:
0BC1 .dbline 134
; else
; WriteToDevice( FIRST_LINE, INSTRUCTION );
0BC1 2722 clr R18
0BC2 2733 clr R19
0BC3 E800 ldi R16,128
0BC4 E010 ldi R17,0
0BC5 940E0BF7 call _WriteToDevice
0BC7 L50:
0BC7 .dbline 136
;
; CheckIfBusy(); /* check if first character is correct */
0BC7 940E0C07 call _CheckIfBusy
0BC9 .dbline 137
; if ( ReadDevice( DATA ) != LCDStr1[0] )
0BC9 E001 ldi R16,1
0BCA E010 ldi R17,0
0BCB 940E0C0E call _ReadDevice
0BCD 90200115 lds R2,_LCDStr1
0BCF 1502 cp R16,R2
0BD0 F011 breq L51
0BD1 .dbline 138
; LCDInitialise(); /* reinitialise lcd otherwise */
0BD1 940E0A75 call _LCDInitialise
0BD3 L51:
0BD3 .dbline 140
;
; if ( LCDLine == LINE1_AND_LINE2 )
0BD3 91800126 lds R24,_LCDLine
0BD5 3083 cpi R24,3
0BD6 F459 brne L53
0BD7 .dbline 141
; {
0BD7 .dbline 142
; strcpy( LCDStr1, LCDStr2 ); /* load str2 into str1 and update line 2 */
0BD7 E024 ldi R18,<_LCDStr2
0BD8 E031 ldi R19,>_LCDStr2
0BD9 E105 ldi R16,<_LCDStr1
0BDA E011 ldi R17,>_LCDStr1
0BDB 940E09AE call _strcpy
0BDD .dbline 143
; LCDLine = LINE2;
0BDD E082 ldi R24,2
0BDE 93800126 sts _LCDLine,R24
0BE0 .dbline 144
; }
0BE0 940C0BF1 jmp L54
0BE2 L53:
0BE2 .dbline 146
; else
; {
0BE2 .dbline 147
; if ( CHECKBIT( LCDStatus, LCD_QUEUE ) )
0BE2 902000E0 lds R2,_LCDStatus
0BE4 FE24 sbrs R2,4
0BE5 C006 rjmp L55
0BE6 .dbline 148
; LCDPrintf( LCDQueueStr1, LCDQueueStr2 );
0BE6 EE22 ldi R18,<_LCDQueueStr2
0BE7 E030 ldi R19,>_LCDQueueStr2
0BE8 EF03 ldi R16,<_LCDQueueStr1
0BE9 E010 ldi R17,>_LCDQueueStr1
0BEA 940E0A7F call _LCDPrintf
0BEC L55:
0BEC .dbline 150
;
; CLEARBIT( LCDStatus, LCD_UPDATE );
0BEC 918000E0 lds R24,_LCDStatus
0BEE 7F8D andi R24,253
0BEF 938000E0 sts _LCDStatus,R24
0BF1 .dbline 151
; }
0BF1 L54:
0BF1 .dbline 153
;
; CLEARBIT( LCDStatus, LCD_BUSY );
0BF1 918000E0 lds R24,_LCDStatus
0BF3 7F8B andi R24,251
0BF4 938000E0 sts _LCDStatus,R24
0BF6 .dbline 154
; }
0BF6 L47:
0BF6 .dbline 155}
; }
0BF6 L31:
0BF6 9508 ret
0BF7 .dbfunc s WriteToDevice _WriteToDevice fI
; LCD_IO -> R20,R21
; select -> R18
; data -> R16
.even
0BF7 _WriteToDevice::
0BF7 940E06D2 call push_gset1
0BF9 .dbline 159{
;
; /* writes to lcd */
; void WriteToDevice( char data, unsigned char select )
; {
0BF9 .dbline 162
; char *LCD_IO;
;
; if ( select == INSTRUCTION ) /* set RS */
0BF9 2322 tst R18
0BFA F421 brne L58
0BFB .dbline 163
; LCD_IO = ( char * ) 0x8000;
0BFB E040 ldi R20,0
0BFC E850 ldi R21,128
0BFD 940C0C01 jmp L59
0BFF L58:
0BFF .dbline 165
; else
; LCD_IO = ( char * ) 0xC000;
0BFF E040 ldi R20,0
0C00 EC50 ldi R21,192
0C01 L59:
0C01 .dbline 167
;
; *LCD_IO = data;
0C01 2FE4 mov R30,R20
0C02 2FF5 mov R31,R21
0C03 8300 std z+0,R16
0C04 .dbline 168}
; }
0C04 L57:
0C04 940E06D5 call pop_gset1
0C06 9508 ret
0C07 .dbsym r LCD_IO 20 pc
0C07 .dbsym r select 18 c
0C07 .dbsym r data 16 c
0C07 .dbfunc s CheckIfBusy _CheckIfBusy fI
.even
0C07 _CheckIfBusy::
0C07 .dbline 171{
;
; void CheckIfBusy( void )
; {
0C07 L61:
0C07 .dbline 172
0C07 L62:
0C07 .dbline 172
; while ( ReadDevice( INSTRUCTION ) & BUSY_FLAG );
0C07 2700 clr R16
0C08 2711 clr R17
0C09 940E0C0E call _ReadDevice
0C0B FD07 sbrc R16,7
0C0C CFFA rjmp L61
0C0D .dbline 173}
; }
0C0D L60:
0C0D 9508 ret
0C0E .dbfunc s ReadDevice _ReadDevice fI
; LCD_IO -> R20,R21
; select -> R16
.even
0C0E _ReadDevice::
0C0E 940E06D2 call push_gset1
0C10 .dbline 177{
;
; /* reads from lcd */
; char ReadDevice( unsigned char select )
; {
0C10 .dbline 180
; char *LCD_IO;
;
; if ( select == INSTRUCTION ) /* set RS */
0C10 2300 tst R16
0C11 F421 brne L65
0C12 .dbline 181
; LCD_IO = ( char * ) 0x8000;
0C12 E040 ldi R20,0
0C13 E850 ldi R21,128
0C14 940C0C18 jmp L66
0C16 L65:
0C16 .dbline 183
; else
; LCD_IO = ( char * ) 0xC000;
0C16 E040 ldi R20,0
0C17 EC50 ldi R21,192
0C18 L66:
0C18 .dbline 185
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -