📄 atmega103.lst
字号:
.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 + -