📄 lcd.lis
字号:
.module lcd.c
.text
0000 .dbfile C:\Documents\Software\AVR\lcd16x2\code\lcd.c
.area text
0000 .dbfile C:\Documents\Software\AVR\lcd16x2\code\lcd.c
0000 .dbfunc s LCDInitialise _LCDInitialise fI
.even
0000 _LCDInitialise::
0000 .dbline 22{
; /* ATmega103 lcd.c file
;
; Author : Robert Stuart
; Company : PDL Industries Ltd
; Date of Creation : 13 April 2000
; Tested : 13 April 2000
;
; Function :
; This module controls the operation of a 16x2 lcd for the ATmega603/103.
;
; Auto detection of lcd added. Reads the last character of each line to
; determine whether write was successful.
;
; EN timing performed by hardware.
; */
;
; /* include */
; #include "lcd.h"
;
; /* Initialises the lcd */
; void LCDInitialise( void )
; {
0000 .dbline 23
; MCUCR |= BIT(SRE) | BIT(SRW);
0000 85B7 in R24,0x35
0002 806C ori R24,192
0004 85BF out 0x35,R24
0006 .dbline 24
; LCDCounter = _50MS; /* delay counter for lcd initialisation */
0006 82E3 ldi R24,50
0008 80934600 sts _LCDCounter,R24
000C .dbline 25
; LCDStatus = 0; /* lcd status flags are reset */
000C 2224 clr R2
000E 20920000 sts _LCDStatus,R2
0012 .dbline 26}
; }
0012 L1:
0012 0895 ret
0014 .dbfunc s LCDPrintf _LCDPrintf fI
; ptr2 -> R20,R21
; ptr1 -> R22,R23
.even
0014 _LCDPrintf::
0014 0E940000 call push_gset2
0018 422F mov R20,R18
001A 532F mov R21,R19
001C 602F mov R22,R16
001E 712F mov R23,R17
0020 .dbline 30{
;
; /* global function called when writing to the lcd */
; void LCDPrintf( char *ptr1, char *ptr2 )
; {
0020 .dbline 31
; if ( !CHECKBIT( LCDStatus, LCD_UPDATE ) )
0020 20900000 lds R2,_LCDStatus
0024 21FC sbrc R2,1
0026 31C0 rjmp L3
0028 .dbline 32
; { /* check that lcd is not currently updating */
0028 .dbline 33
; strcpy( LCDStr1, ptr1 ); /* copy strings into local variables */
0028 262F mov R18,R22
002A 372F mov R19,R23
002C 00E0 ldi R16,<_LCDStr1
002E 10E0 ldi R17,>_LCDStr1
0030 0E940000 call _strcpy
0034 .dbline 34
; strcpy( LCDStr2, ptr2 );
0034 242F mov R18,R20
0036 352F mov R19,R21
0038 00E0 ldi R16,<_LCDStr2
003A 10E0 ldi R17,>_LCDStr2
003C 0E940000 call _strcpy
0040 .dbline 36
;
; if ( LCDStr1[0] == CHARACTER_NULL ) /* line 1 not updated */
0040 20903400 lds R2,_LCDStr1
0044 2220 tst R2
0046 59F4 brne L5
0048 .dbline 37
; {
0048 .dbline 38
; strcpy( LCDStr1, LCDStr2 );
0048 20E0 ldi R18,<_LCDStr2
004A 30E0 ldi R19,>_LCDStr2
004C 00E0 ldi R16,<_LCDStr1
004E 10E0 ldi R17,>_LCDStr1
0050 0E940000 call _strcpy
0054 .dbline 39
; LCDLine = LINE2;
0054 82E0 ldi R24,2
0056 80934500 sts _LCDLine,R24
005A .dbline 40
; }
005A 0C943B00 jmp L6
005E L5:
005E .dbline 41
; else if ( LCDStr2[0] == CHARACTER_NULL )
005E 20902300 lds R2,_LCDStr2
0062 2220 tst R2
0064 29F4 brne L7
0066 .dbline 42
; LCDLine = LINE1; /* line 2 not updated */
0066 81E0 ldi R24,1
0068 80934500 sts _LCDLine,R24
006C 0C943B00 jmp L8
0070 L7:
0070 .dbline 44
; else
; LCDLine = LINE1_AND_LINE2;
0070 83E0 ldi R24,3
0072 80934500 sts _LCDLine,R24
0076 L8:
0076 L6:
0076 .dbline 46
;
; SETBIT( LCDStatus, LCD_UPDATE ); /* set flags */
0076 80910000 lds R24,_LCDStatus
007A 8260 ori R24,2
007C 80930000 sts _LCDStatus,R24
0080 .dbline 47
; CLEARBIT( LCDStatus, LCD_QUEUE );
0080 8F7E andi R24,239
0082 80930000 sts _LCDStatus,R24
0086 .dbline 48
; }
0086 0C945A00 jmp L4
008A L3:
008A .dbline 49
; else if ( !CHECKBIT( LCDStatus, LCD_QUEUE ) )
008A 20900000 lds R2,_LCDStatus
008E 24FC sbrc R2,4
0090 11C0 rjmp L9
0092 .dbline 50
; { /* update after existing update has been completed */
0092 .dbline 51
; strcpy( LCDQueueStr1, ptr1);
0092 262F mov R18,R22
0094 372F mov R19,R23
0096 00E0 ldi R16,<_LCDQueueStr1
0098 10E0 ldi R17,>_LCDQueueStr1
009A 0E940000 call _strcpy
009E .dbline 52
; strcpy( LCDQueueStr2, ptr2);
009E 242F mov R18,R20
00A0 352F mov R19,R21
00A2 00E0 ldi R16,<_LCDQueueStr2
00A4 10E0 ldi R17,>_LCDQueueStr2
00A6 0E940000 call _strcpy
00AA .dbline 54
;
; SETBIT( LCDStatus, LCD_QUEUE );
00AA 80910000 lds R24,_LCDStatus
00AE 8061 ori R24,16
00B0 80930000 sts _LCDStatus,R24
00B4 .dbline 55
; }
00B4 L9:
00B4 L4:
00B4 .dbline 56}
; }
00B4 L2:
00B4 0E940000 call pop_gset2
00B8 0895 ret
00BA .dbsym r ptr2 20 pc
00BA .dbsym r ptr1 22 pc
00BA .dbfunc s DelayLCDStartup _DelayLCDStartup fI
.even
00BA _DelayLCDStartup::
00BA .dbline 60{
;
; /* called from the main 1ms interrupt, must allow at least 40ms before lcd can be initialised */
; void DelayLCDStartup( void )
; {
00BA .dbline 61
; if ( LCDCounter && !CHECKBIT( LCDStatus, LCD_BUSY ) )
00BA 20904600 lds R2,_LCDCounter
00BE 2220 tst R2
00C0 49F0 breq L12
00C2 20900000 lds R2,_LCDStatus
00C6 22FC sbrc R2,2
00C8 05C0 rjmp L12
00CA .dbline 62
; LCDCounter--; /* count down delay timer */
00CA 80914600 lds R24,_LCDCounter
00CE 8150 subi R24,1
00D0 80934600 sts _LCDCounter,R24
00D4 L12:
00D4 .dbline 64
;
; if ( CHECKBIT( LCDStatus, LCD_INITIALISE ) && LCDCounter == 1 )
00D4 20900000 lds R2,_LCDStatus
00D8 23FE sbrs R2,3
00DA 06C0 rjmp L14
00DC 80914600 lds R24,_LCDCounter
00E0 8130 cpi R24,1
00E2 11F4 brne L14
00E4 .dbline 65
; InitScreen(); /* initialise lcd */
00E4 0E947500 call _InitScreen
00E8 L14:
00E8 .dbline 66}
; }
00E8 L11:
00E8 0895 ret
00EA .dbfunc s InitScreen _InitScreen fI
.even
00EA _InitScreen::
00EA 2297 sbiw R28,2
00EC .dbline 69{
;
; void InitScreen( void )
; {
00EC .dbline 70
; sprintf( LCDStr1, "%s", LCDHeader1 ); /* initialise lcd lines */
00EC 30900100 lds R3,_LCDHeader1+1
00F0 20900000 lds R2,_LCDHeader1
00F4 2882 std y+0,R2
00F6 3982 std y+1,R3
00F8 20E0 ldi R18,<L17
00FA 30E0 ldi R19,>L17
00FC 00E0 ldi R16,<_LCDStr1
00FE 10E0 ldi R17,>_LCDStr1
0100 0E940000 call _sprintf
0104 .dbline 71
; sprintf( LCDStr2, "%s", LCDHeader2 );
0104 30900100 lds R3,_LCDHeader2+1
0108 20900000 lds R2,_LCDHeader2
010C 2882 std y+0,R2
010E 3982 std y+1,R3
0110 20E0 ldi R18,<L17
0112 30E0 ldi R19,>L17
0114 00E0 ldi R16,<_LCDStr2
0116 10E0 ldi R17,>_LCDStr2
0118 0E940000 call _sprintf
011C .dbline 72
; LCDLine = LINE1_AND_LINE2; /* both lines to be updated */
011C 83E0 ldi R24,3
011E 80934500 sts _LCDLine,R24
0122 .dbline 73
; LCDCounter--;
0122 80914600 lds R24,_LCDCounter
0126 8150 subi R24,1
0128 80934600 sts _LCDCounter,R24
012C .dbline 74
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -