📄 lcd.lis
字号:
0266 0081 ldd R16,z+0
0268 1127 clr R17
026A 0E948201 call _WriteToDevice
026E .dbline 128
;
; if ( i>15 ) /* finished line */
026E 8FE0 ldi R24,15
0270 20900000 lds R2,L32
0274 8215 cp R24,R2
0276 10F0 brlo X0
0278 0C948101 jmp L47
027C X0:
027C .dbline 129
; {
027C .dbline 130
; CheckIfBusy(); /* check is lcd is connected */
027C 0E949201 call _CheckIfBusy
0280 .dbline 131
; if ( LCDLine == LINE2 )
0280 80914500 lds R24,_LCDLine
0284 8230 cpi R24,2
0286 41F4 brne L49
0288 .dbline 132
; WriteToDevice( SECOND_LINE, INSTRUCTION );
0288 2227 clr R18
028A 3327 clr R19
028C 00EC ldi R16,192
028E 10E0 ldi R17,0
0290 0E948201 call _WriteToDevice
0294 0C945201 jmp L50
0298 L49:
0298 .dbline 134
; else
; WriteToDevice( FIRST_LINE, INSTRUCTION );
0298 2227 clr R18
029A 3327 clr R19
029C 00E8 ldi R16,128
029E 10E0 ldi R17,0
02A0 0E948201 call _WriteToDevice
02A4 L50:
02A4 .dbline 136
;
; CheckIfBusy(); /* check if first character is correct */
02A4 0E949201 call _CheckIfBusy
02A8 .dbline 137
; if ( ReadDevice( DATA ) != LCDStr1[0] )
02A8 01E0 ldi R16,1
02AA 10E0 ldi R17,0
02AC 0E949901 call _ReadDevice
02B0 20903400 lds R2,_LCDStr1
02B4 0215 cp R16,R2
02B6 11F0 breq L51
02B8 .dbline 138
; LCDInitialise(); /* reinitialise lcd otherwise */
02B8 0E940000 call _LCDInitialise
02BC L51:
02BC .dbline 140
;
; if ( LCDLine == LINE1_AND_LINE2 )
02BC 80914500 lds R24,_LCDLine
02C0 8330 cpi R24,3
02C2 59F4 brne L53
02C4 .dbline 141
; {
02C4 .dbline 142
; strcpy( LCDStr1, LCDStr2 ); /* load str2 into str1 and update line 2 */
02C4 20E0 ldi R18,<_LCDStr2
02C6 30E0 ldi R19,>_LCDStr2
02C8 00E0 ldi R16,<_LCDStr1
02CA 10E0 ldi R17,>_LCDStr1
02CC 0E940000 call _strcpy
02D0 .dbline 143
; LCDLine = LINE2;
02D0 82E0 ldi R24,2
02D2 80934500 sts _LCDLine,R24
02D6 .dbline 144
; }
02D6 0C947C01 jmp L54
02DA L53:
02DA .dbline 146
; else
; {
02DA .dbline 147
; if ( CHECKBIT( LCDStatus, LCD_QUEUE ) )
02DA 20900000 lds R2,_LCDStatus
02DE 24FE sbrs R2,4
02E0 06C0 rjmp L55
02E2 .dbline 148
; LCDPrintf( LCDQueueStr1, LCDQueueStr2 );
02E2 20E0 ldi R18,<_LCDQueueStr2
02E4 30E0 ldi R19,>_LCDQueueStr2
02E6 00E0 ldi R16,<_LCDQueueStr1
02E8 10E0 ldi R17,>_LCDQueueStr1
02EA 0E940A00 call _LCDPrintf
02EE L55:
02EE .dbline 150
;
; CLEARBIT( LCDStatus, LCD_UPDATE );
02EE 80910000 lds R24,_LCDStatus
02F2 8D7F andi R24,253
02F4 80930000 sts _LCDStatus,R24
02F8 .dbline 151
; }
02F8 L54:
02F8 .dbline 153
;
; CLEARBIT( LCDStatus, LCD_BUSY );
02F8 80910000 lds R24,_LCDStatus
02FC 8B7F andi R24,251
02FE 80930000 sts _LCDStatus,R24
0302 .dbline 154
; }
0302 L47:
0302 .dbline 155}
; }
0302 L31:
0302 0895 ret
0304 .dbfunc s WriteToDevice _WriteToDevice fI
; LCD_IO -> R20,R21
; select -> R18
; data -> R16
.even
0304 _WriteToDevice::
0304 0E940000 call push_gset1
0308 .dbline 159{
;
; /* writes to lcd */
; void WriteToDevice( char data, unsigned char select )
; {
0308 .dbline 162
; char *LCD_IO;
;
; if ( select == INSTRUCTION ) /* set RS */
0308 2223 tst R18
030A 21F4 brne L58
030C .dbline 163
; LCD_IO = ( char * ) 0x8000;
030C 40E0 ldi R20,0
030E 50E8 ldi R21,128
0310 0C948C01 jmp L59
0314 L58:
0314 .dbline 165
; else
; LCD_IO = ( char * ) 0xC000;
0314 40E0 ldi R20,0
0316 50EC ldi R21,192
0318 L59:
0318 .dbline 167
;
; *LCD_IO = data;
0318 E42F mov R30,R20
031A F52F mov R31,R21
031C 0083 std z+0,R16
031E .dbline 168}
; }
031E L57:
031E 0E940000 call pop_gset1
0322 0895 ret
0324 .dbsym r LCD_IO 20 pc
0324 .dbsym r select 18 c
0324 .dbsym r data 16 c
0324 .dbfunc s CheckIfBusy _CheckIfBusy fI
.even
0324 _CheckIfBusy::
0324 .dbline 171{
;
; void CheckIfBusy( void )
; {
0324 L61:
0324 .dbline 172
0324 L62:
0324 .dbline 172
; while ( ReadDevice( INSTRUCTION ) & BUSY_FLAG );
0324 0027 clr R16
0326 1127 clr R17
0328 0E949901 call _ReadDevice
032C 07FD sbrc R16,7
032E FACF rjmp L61
0330 .dbline 173}
; }
0330 L60:
0330 0895 ret
0332 .dbfunc s ReadDevice _ReadDevice fI
; LCD_IO -> R20,R21
; select -> R16
.even
0332 _ReadDevice::
0332 0E940000 call push_gset1
0336 .dbline 177{
;
; /* reads from lcd */
; char ReadDevice( unsigned char select )
; {
0336 .dbline 180
; char *LCD_IO;
;
; if ( select == INSTRUCTION ) /* set RS */
0336 0023 tst R16
0338 21F4 brne L65
033A .dbline 181
; LCD_IO = ( char * ) 0x8000;
033A 40E0 ldi R20,0
033C 50E8 ldi R21,128
033E 0C94A301 jmp L66
0342 L65:
0342 .dbline 183
; else
; LCD_IO = ( char * ) 0xC000;
0342 40E0 ldi R20,0
0344 50EC ldi R21,192
0346 L66:
0346 .dbline 185
;
; return *LCD_IO;
0346 E42F mov R30,R20
0348 F52F mov R31,R21
034A 0081 ldd R16,z+0
034C 1127 clr R17
034E L64:
034E 0E940000 call pop_gset1
0352 0895 ret
0354 .dbline 186}
0354 .dbsym r LCD_IO 20 pc
0354 .dbsym r select 16 c
.area bss
0001 .dbfile C:\Documents\Software\AVR\lcd16x2\code\lcd.c
0001 _LCDQueueStr2:
0001 .blkb 17
0012 .dbfile c:/documents/software/avr/lcd16x2/include/lcd.h
0012 .dbsym s LCDQueueStr2 _LCDQueueStr2 Ac[17:17]
0012 _LCDQueueStr1:
0012 .blkb 17
0023 .dbsym s LCDQueueStr1 _LCDQueueStr1 Ac[17:17]
0023 _LCDStr2:
0023 .blkb 17
0034 .dbsym s LCDStr2 _LCDStr2 Ac[17:17]
0034 _LCDStr1:
0034 .blkb 17
0045 .dbsym s LCDStr1 _LCDStr1 Ac[17:17]
0045 _LCDLine:
0045 .blkb 1
0046 .dbsym s LCDLine _LCDLine c
0046 _LCDCounter:
0046 .blkb 1
0047 .dbsym s LCDCounter _LCDCounter c
.area data
0000 .dbfile c:/documents/software/avr/lcd16x2/include/lcd.h
0000 L17:
0000 .blkb 3
.area idata
0000 257300 .byte 37,'s,0
.area data
0003 .dbfile c:/documents/software/avr/lcd16x2/include/lcd.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -