⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.lis

📁 使用iccavr的例子
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                         .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 + -