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

📄 atmega103.lst

📁 里面给出了ATmega103单片机编程的C语言实例程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
                         .module buttons.c
                         .text
--- 0000                   .dbfile C:\Documents\Software\AVR\ATmega103\code\buttons.c
                         .area text
--- 0000                   .dbfile C:\Documents\Software\AVR\ATmega103\code\buttons.c
--- 0000                   .dbfunc s ReadButtons _ReadButtons fI
                         .even
 0B41                  _ReadButtons::
 0B41                    .dbline 16{
                       ; /* ATmega103 buttons.c file 
                       ; 
                       ;    Author : Robert Stuart 
                       ;    Company : PDL Industries Ltd 
                       ;    Date of Creation : 22 July 1999
                       ;    Tested : 12 August 1999
                       ;  
                       ;    Function : 
                       ; */
                       ; 
                       ; /* include */
                       ; #include "button.h"
                       ; 
                       ; /* function is called from "runtime.c" every interrupt */
                       ; void ReadButtons( void )
                       ; {
 0B41                    .dbline 17
                       ;   BufferButton();
 0B41  940E0B46          call _BufferButton
 0B43                    .dbline 19
                       ; 
                       ;   DetermineButtonState();
 0B43  940E0BC6          call _DetermineButtonState
 0B45                    .dbline 20}
                       ; }
 0B45                  L2:
 0B45  9508              ret
 0B46                    .dbfunc s BufferButton _BufferButton fI
                         .even
 0B46                  _BufferButton::
 0B46  940E0711          call push_gset1
 0B48                    .dbline 23{
                       ; 
                       ; void BufferButton( void )
                       ; {
 0B48                    .dbline 24
                       ;   switch ( BUTTON )         /* determine which button has been hit */
 0B48  B340              in R20,0x10
 0B49  2755              clr R21
 0B4A  714C              andi R20,28
 0B4B  7050              andi R21,0
 0B4C  3048              cpi R20,8
 0B4D  E080              ldi R24,0
 0B4E  0758              cpc R21,R24
 0B4F  F109              breq L9
 0B50  E088              ldi R24,8
 0B51  E090              ldi R25,0
 0B52  1784              cp R24,R20
 0B53  0795              cpc R25,R21
 0B54  F034              brlt L11
 0B55                  L10:
 0B55  3044              cpi R20,4
 0B56  E080              ldi R24,0
 0B57  0758              cpc R21,R24
 0B58  F041              breq L7
 0B59  940C0B79          jmp L4
 0B5B                  L11:
 0B5B  3140              cpi R20,16
 0B5C  E080              ldi R24,0
 0B5D  0758              cpc R21,R24
 0B5E  F051              breq L8
 0B5F  940C0B79          jmp L4
 0B61                  X0:
 0B61                    .dbline 25
                       ;   {
 0B61                  L7:
 0B61                    .dbline 26
                       ;     case SET_BUTTON : PushedButton = SET_MAP; break;
 0B61  E081              ldi R24,1
 0B62  E090              ldi R25,0
 0B63  93900145          sts _PushedButton+1,R25
 0B65  93800144          sts _PushedButton,R24
 0B67                    .dbline 26
 0B67  940C0B7F          jmp L5
 0B69                  L8:
 0B69                    .dbline 27
                       ;     case UP_BUTTON : PushedButton = UP_MAP; break;
 0B69  E082              ldi R24,2
 0B6A  E090              ldi R25,0
 0B6B  93900145          sts _PushedButton+1,R25
 0B6D  93800144          sts _PushedButton,R24
 0B6F                    .dbline 27
 0B6F  940C0B7F          jmp L5
 0B71                  L9:
 0B71                    .dbline 28
                       ;     case DOWN_BUTTON : PushedButton = DOWN_MAP; break;
 0B71  E083              ldi R24,3
 0B72  E090              ldi R25,0
 0B73  93900145          sts _PushedButton+1,R25
 0B75  93800144          sts _PushedButton,R24
 0B77                    .dbline 28
 0B77  940C0B7F          jmp L5
 0B79                  L4:
 0B79                    .dbline 29
                       ;     default : PushedButton = NONE_MAP;
 0B79  E084              ldi R24,4
 0B7A  E090              ldi R25,0
 0B7B  93900145          sts _PushedButton+1,R25
 0B7D  93800144          sts _PushedButton,R24
 0B7F                    .dbline 30
                       ;   }
 0B7F                  L5:
 0B7F                    .dbline 32
                       ; 
                       ;   if ( PushedButton == NONE_MAP )
 0B7F  91900145          lds R25,_PushedButton+1
 0B81  91800144          lds R24,_PushedButton
 0B83  3084              cpi R24,4
 0B84  E080              ldi R24,0
 0B85  0798              cpc R25,R24
 0B86  F4A9              brne L12
 0B87                    .dbline 33
                       ;   {
 0B87                    .dbline 34
                       ;     Buffer = 0;             /* resets the delay counter and button in reset mode */
 0B87  2422              clr R2
 0B88  2433              clr R3
 0B89  92300147          sts _Buffer+1,R3
 0B8B  92200146          sts _Buffer,R2
 0B8D                    .dbline 35
                       ;     Button = BUTTON_NONE;
 0B8D  E084              ldi R24,4
 0B8E  E090              ldi R25,0
 0B8F  9390015B          sts _Button+1,R25
 0B91  9380015A          sts _Button,R24
 0B93                    .dbline 36
                       ;     ButtonStatus = 0;
 0B93  2422              clr R2
 0B94  92200158          sts _ButtonStatus,R2
 0B96                    .dbline 37
                       ;     SETBIT( ButtonStatus, BUTTON_RESET );
 0B96  2D82              mov R24,R2
 0B97  6081              ori R24,1
 0B98  93800158          sts _ButtonStatus,R24
 0B9A                    .dbline 38
                       ;   }
 0B9A  940C0B9E          jmp L13
 0B9C                  L12:
 0B9C                    .dbline 40
                       ;   else
                       ;     DebounceButton();       /* check which button was hit */
 0B9C  940E0BA1          call _DebounceButton
 0B9E                  L13:
 0B9E                    .dbline 41}
                       ; }
 0B9E                  L3:
 0B9E  940E0714          call pop_gset1
 0BA0  9508              ret
 0BA1                    .dbfunc s DebounceButton _DebounceButton fI
                         .even
 0BA1                  _DebounceButton::
 0BA1                    .dbline 44{
                       ; 
                       ; void DebounceButton( void )
                       ; {
 0BA1                    .dbline 45
                       ;   if ( LastButton == PushedButton ) /* same button hit as last interrupt */
 0BA1  90300145          lds R3,_PushedButton+1
 0BA3  90200144          lds R2,_PushedButton
 0BA5  90500143          lds R5,_LastButton+1
 0BA7  90400142          lds R4,_LastButton
 0BA9  1442              cp R4,R2
 0BAA  0453              cpc R5,R3
 0BAB  F459              brne L15
 0BAC                    .dbline 46
                       ;     Buffer++;           /* increment delay counter */
 0BAC  91900147          lds R25,_Buffer+1
 0BAE  91800146          lds R24,_Buffer
 0BB0  9601              adiw R24,1
 0BB1  93900147          sts _Buffer+1,R25
 0BB3  93800146          sts _Buffer,R24
 0BB5  940C0BBD          jmp L16
 0BB7                  L15:
 0BB7                    .dbline 48
                       ;   else
                       ;     Buffer = 0;             /* different button has been hit */
 0BB7  2422              clr R2
 0BB8  2433              clr R3
 0BB9  92300147          sts _Buffer+1,R3
 0BBB  92200146          sts _Buffer,R2
 0BBD                  L16:
 0BBD                    .dbline 50
                       ;     
                       ;   LastButton = PushedButton;        /* set "last_button" for next interrupt */
 0BBD  90300145          lds R3,_PushedButton+1
 0BBF  90200144          lds R2,_PushedButton
 0BC1  92300143          sts _LastButton+1,R3
 0BC3  92200142          sts _LastButton,R2
 0BC5                    .dbline 51}
                       ; }
 0BC5                  L14:
 0BC5  9508              ret
 0BC6                    .dbfunc s DetermineButtonState _DetermineButtonState fI
                         .even
 0BC6                  _DetermineButtonState::
 0BC6                    .dbline 54{
                       ; 
                       ; void DetermineButtonState( void )
                       ; {
 0BC6                    .dbline 55
                       ;   if ( Buffer > _50MS )         /* button debouce timeout */
 0BC6  E382              ldi R24,50
 0BC7  E090              ldi R25,0
 0BC8  90300147          lds R3,_Buffer+1
 0BCA  90200146          lds R2,_Buffer
 0BCC  1582              cp R24,R2
 0BCD  0593              cpc R25,R3
 0BCE  F5E0              brsh L18
 0BCF                    .dbline 56
                       ;   {
 0BCF                    .dbline 57
                       ;     Button = LastButton;        /* set button state to which button has been hit */
 0BCF  90300143          lds R3,_LastButton+1
 0BD1  90200142          lds R2,_LastButton
 0BD3  9230015B          sts _Button+1,R3
 0BD5  9220015A          sts _Button,R2
 0BD7                    .dbline 59
                       ;     
                       ;     Buffer = MINIMUM( Buffer, UNSIGNED_INT_LIMIT ); 
 0BD7  91900147          lds R25,_Buffer+1
 0BD9  91800146          lds R24,_Buffer
 0BDB  3F8F              cpi R24,255
 0BDC  EFAF              ldi R26,255
 0BDD  079A              cpc R25,R26
 0BDE  F420              brsh L20
 0BDF  2F08              mov R16,R24
 0BE0  2F19              mov R17,R25
 0BE1  940C0BE5          jmp L21
 0BE3                  L20:
 0BE3  EF0F              ldi R16,255
 0BE4  EF1F              ldi R17,255
 0BE5                  L21:
 0BE5  93100147          sts _Buffer+1,R17
 0BE7  93000146          sts _Buffer,R16
 0BE9                    .dbline 62
                       ;                     /* prevent "button_buffer" from overflowing */
                       ;       
                       ;     if ( CHECKBIT( ButtonStatus, BUTTON_RESET ) ) 
 0BE9  90200158          lds R2,_ButtonStatus
 0BEB  FE20              sbrs R2,0
 0BEC  C009              rjmp L22
 0BED                    .dbline 63
                       ;     {               /* button has just been hit */
 0BED                    .dbline 64
                       ;       SETBIT( ButtonStatus, BUTTON_SINGLE );
 0BED  2D82              mov R24,R2
 0BEE  6082              ori R24,2
 0BEF  93800158          sts _ButtonStatus,R24
 0BF1                    .dbline 65
                       ;       CLEARBIT( ButtonStatus, BUTTON_RESET );
 0BF1  7F8E              andi R24,254
 0BF2  93800158          sts _ButtonStatus,R24
 0BF4                    .dbline 66
                       ;     }
 0BF4  940C0C10          jmp L19
 0BF6                  L22:
 0BF6                    .dbline 68
                       ;     else
                       ;     {
 0BF6                    .dbline 69
                       ;       CLEARBIT( ButtonStatus, BUTTON_SINGLE );
 0BF6  91800158          lds R24,_ButtonStatus
 0BF8  7F8D              andi R24,253
 0BF9  93800158          sts _ButtonStatus,R24
 0BFB                    .dbline 71
                       ;       
                       ;       if ( Buffer > _1SEC )         /* delay for 1s before hold is true */
 0BFB  EE88              ldi R24,232
 0BFC  E093              ldi R25,3
 0BFD  90300147          lds R3,_Buffer+1
 0BFF  90200146          lds R2,_Buffer
 0C01  1582              cp R24,R2
 0C02  0593              cpc R25,R3
 0C03  F460              brsh L19
 0C04                    .dbline 72
                       ;         SETBIT( ButtonStatus, BUTTON_HOLD ); 
 0C04  91800158          lds R24,_ButtonStatus
 0C06  6084              ori R24,4
 0C07  93800158          sts _ButtonStatus,R24
 0C09                    .dbline 73
                       ;     }
 0C09                    .dbline 74
                       ;   }
 0C09  940C0C10          jmp L19
 0C0B                  L18:
 0C0B                    .dbline 76
                       ;   else              /* button is in debouce mode */
                       ;     CLEARBIT( ButtonStatus, BUTTON_HOLD | BUTTON_SINGLE );
 0C0B  91800158          lds R24,_ButtonStatus
 0C0D  7F8B              andi R24,251
 0C0E  93800158          sts _ButtonStatus,R24
 0C10                  L19:
 0C10                    .dbline 77}
                       ; }
 0C10                  L17:
 0C10  9508              ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -