📄 led.lst
字号:
__start:
__text_start:
E E5CF LDI R28,0x5F
F E0D2 LDI R29,2
10 BFCD OUT 0x3D,R28
11 BFDE OUT 0x3E,R29
12 51CE SUBI R28,0x1E
13 40D0 SBCI R29,0
14 EA0A LDI R16,0xAA
15 8308 STD Y+0,R16
16 2400 CLR R0
17 E6E1 LDI R30,0x61
18 E0F0 LDI R31,0
19 E010 LDI R17,0
1A 36E1 CPI R30,0x61
1B 07F1 CPC R31,R17
1C F011 BEQ 0x001F
1D 9201 ST R0,Z+
1E CFFB RJMP 0x001A
1F 8300 STD Z+0,R16
20 E1EA LDI R30,0x1A
21 E0F0 LDI R31,0
22 E6A0 LDI R26,0x60
23 E0B0 LDI R27,0
24 E010 LDI R17,0
25 E000 LDI R16,0
26 BF0B OUT 0x3B,R16
27 31EB CPI R30,0x1B
28 07F1 CPC R31,R17
29 F021 BEQ 0x002E
2A 95C8 LPM
2B 9631 ADIW R30,1
2C 920D ST R0,X+
2D CFF9 RJMP 0x0027
2E D077 RCALL _main
_exit:
2F CFFF RJMP _exit
_ISR_int0_handler:
b --> Y,+1
a --> Y,+1
30 920A ST R0,-Y
31 921A ST R1,-Y
32 922A ST R2,-Y
33 923A ST R3,-Y
34 924A ST R4,-Y
35 925A ST R5,-Y
36 926A ST R6,-Y
37 927A ST R7,-Y
38 928A ST R8,-Y
39 929A ST R9,-Y
3A 930A ST R16,-Y
3B 931A ST R17,-Y
3C 932A ST R18,-Y
3D 933A ST R19,-Y
3E 938A ST R24,-Y
3F 939A ST R25,-Y
40 93AA ST R26,-Y
41 93BA ST R27,-Y
42 93EA ST R30,-Y
43 93FA ST R31,-Y
44 B60F IN R0,0x3F
45 920A ST R0,-Y
FILE: f:\MYDOCU~1\AVR\led\代码\led.c
(0001) /*-----------------------------------------------------------------------------
(0002) * File: LED01.C
(0003) * Author: David Boydston - Solutions Consulting - http://www.serialio.com
(0004) * Copyright (c) 1999 Solutions Consulting All Rights Reserved.
(0005) *
(0006) * Function: Test the light sequence on Atmel 8515 development board
(0007) * Lights should blink one at a time 'up' from PB0 to PB7 then back 'down'
(0008) * from PB7 to PB0. Then the lights will 'stack up' from PB0 to PB7 and
(0009) * 'stack down' from PB7 to PB0. At any time when the PB2 button is
(0010) * pressed the lights should display with an alternating pattern momentarily
(0011) * then continue with the blinking pattern.
(0012) *
(0013) * See disclaimer at http://www.serialio.com/Legal/SoftDisclaimer.htm
(0014) *---------------------------------------------------------------------------*/
(0015)
(0016) #include <io8515v.h>
(0017) #include <macros.h>
(0018)
(0019) #define CLK_DIV_BY_0 0x01 //rolls at 8.19ms with 4Mhz Clock
(0020) #define CLK_DIV_BY_8 0x02 //rolls at 65.5ms with 4Mhz Clock
(0021) #define CLK_DIV_BY_64 0x03 //rolls at 524ms with 4Mhz Clock
(0022) #define CLK_DIV_BY_256 0x04 //rolls at 2.1sec with 4Mhz Clock
(0023) #define CLK_DIV_BY_1024 0x05 //rolls at 8.4sec with 4Mhz Clock
(0024) #define TMR1_OVF_INT_ENA 0x80
(0025) #define GLOBAL_INT_ENA 0x80
(0026) #define INT0_ENA 0x40
(0027) #define INT0_TRIG_FALL_EDGE 0x02
(0028) #define INT1_ENA 0x80
(0029)
(0030) unsigned char tmrRollFlag = 0;
(0031)
(0032) void delay2(unsigned char);
(0033) #pragma interrupt_handler ISR_int0_handler:2
(0034) //Note: GIMSK I-bit cleared by MCU on INT and set by MCU on RETI
(0035) //Thus there should be no danger of us being involked multiple
(0036) //times by switch bounce (as long as delay is reasonable to see LED)
(0037) void ISR_int0_handler()
(0038) {
(0039) unsigned char a, b;
(0040) PORTB = 0x55;
46 E585 LDI R24,0x55
47 BB88 OUT 0x18,R24
(0041) delay2(5); //doing this in ISR causes heavy stack use.
48 E005 LDI R16,5
49 D037 RCALL _delay2
4A 9009 LD R0,Y+
4B BE0F OUT 0x3F,R0
4C 91F9 LD R31,Y+
4D 91E9 LD R30,Y+
4E 91B9 LD R27,Y+
4F 91A9 LD R26,Y+
50 9199 LD R25,Y+
51 9189 LD R24,Y+
52 9139 LD R19,Y+
53 9129 LD R18,Y+
54 9119 LD R17,Y+
55 9109 LD R16,Y+
56 9099 LD R9,Y+
57 9089 LD R8,Y+
58 9079 LD R7,Y+
59 9069 LD R6,Y+
5A 9059 LD R5,Y+
5B 9049 LD R4,Y+
5C 9039 LD R3,Y+
5D 9029 LD R2,Y+
5E 9019 LD R1,Y+
5F 9009 LD R0,Y+
60 9518 RETI
_ISR_tmr1_ovf_handler:
61 938A ST R24,-Y
62 B78F IN R24,0x3F
63 938A ST R24,-Y
(0042) /*
(0043) //this way is easier on the stack
(0044) for (a = 1; a; a++)
(0045) for (b = 1; b; b++)
(0046) ;
(0047) */
(0048) }
(0049)
(0050) #pragma interrupt_handler ISR_tmr1_ovf_handler:7
(0051) void ISR_tmr1_ovf_handler()
(0052) {
(0053) // PORTB = 0x0f; //sanity check
(0054) tmrRollFlag = 1;
64 E081 LDI R24,1
65 9380 0060 STS tmrRollFlag,R24
67 9189 LD R24,Y+
68 BF8F OUT 0x3F,R24
69 9189 LD R24,Y+
6A 9518 RETI
_delay:
i --> R20
n --> R16
6B 934A ST R20,-Y
6C 935A ST R21,-Y
(0055) }
(0056)
(0057) void delay(unsigned char n)
(0058) {
(0059) int i;
(0060)
(0061) for (i = 0; i < n; i++) {
6D 2744 CLR R20
6E 2755 CLR R21
6F C009 RJMP 0x0079
(0062) tmrRollFlag = 0;
70 2422 CLR R2
71 9220 0060 STS tmrRollFlag,R2
(0063) while (!tmrRollFlag); //wait for IRQ
73 9020 0060 LDS R2,tmrRollFlag
75 2022 TST R2
76 F3E1 BEQ 0x0073
77 5F4F SUBI R20,0xFF
78 4F5F SBCI R21,0xFF
79 2E20 MOV R2,R16
7A 2433 CLR R3
7B 1542 CP R20,R2
7C 0553 CPC R21,R3
7D F394 BLT 0x0070
7E 9159 LD R21,Y+
7F 9149 LD R20,Y+
80 9508 RET
_delay2:
a --> R20
b --> R22
c --> R10
n --> R16
81 D06A RCALL push_xgsetF00C
(0064) }
(0065)
(0066) }
(0067)
(0068) #ifdef FIXED_DELAY
(0069) void delay()
(0070) {
(0071) tmrRollFlag = 0;
(0072) while (!tmrRollFlag); //wait for IRQ
(0073) }
(0074) #endif
(0075)
(0076) void delay2(unsigned char n)
(0077) {
(0078) unsigned char a, b, c;
(0079)
(0080) for (a = 1; a; a++)
82 E041 LDI R20,1
83 C00C RJMP 0x0090
(0081) for (b = 1; b; b++)
84 E061 LDI R22,1
85 C007 RJMP 0x008D
(0082) for (c = 1; c<n; c++)
86 24AA CLR R10
87 94A3 INC R10
88 C001 RJMP 0x008A
89 94A3 INC R10
8A 16A0 CP R10,R16
8B F3E8 BCS 0x0089
8C 9563 INC R22
8D 2366 TST R22
8E F7B9 BNE 0x0086
8F 9543 INC R20
90 2344 TST R20
91 F791 BNE 0x0084
92 C060 RJMP pop_xgsetF00C
_LED_On:
i --> R10
93 92AA ST R10,-Y
94 92BA ST R11,-Y
95 2EA0 MOV R10,R16
96 2EB1 MOV R11,R17
(0083) ;
(0084) }
(0085)
(0086) void LED_On(int i)
(0087) {
(0088) PORTB = ~BIT(i); /* low output to turn LED on */
97 E001 LDI R16,1
98 E010 LDI R17,0
99 2D2A MOV R18,R10
9A 2D3B MOV R19,R11
9B D05E RCALL lsl16
9C 2E20 MOV R2,R16
9D 2E31 MOV R3,R17
9E 9420 COM R2
9F 9430 COM R3
A0 BA28 OUT 0x18,R2
(0089) // delay2(0);
(0090) delay(3);
A1 E003 LDI R16,3
A2 DFC8 RCALL _delay
A3 90B9 LD R11,Y+
A4 90A9 LD R10,Y+
A5 9508 RET
(0091) }
(0092)
(0093) void main()
(0094) {
(0095) signed char i, v;
(0096)
(0097) DDRB = 0xFF; /* output */
_main:
v --> R22
i --> R20
A6 EF8F LDI R24,0xFF
A7 BB87 OUT 0x17,R24
(0098) PORTB = 0x55; //sanity check
A8 E585 LDI R24,0x55
A9 BB88 OUT 0x18,R24
(0099) delay2(5);
AA E005 LDI R16,5
AB DFD5 RCALL _delay2
(0100)
(0101) TCCR1A = 0;
AC 2422 CLR R2
AD BC2F OUT 0x2F,R2
(0102) TCCR1B = CLK_DIV_BY_8;
AE E082 LDI R24,2
AF BD8E OUT 0x2E,R24
(0103) // TCCR1B = CLK_DIV_BY_64;
(0104) TIMSK = TMR1_OVF_INT_ENA;
B0 E880 LDI R24,0x80
B1 BF89 OUT 0x39,R24
(0105)
(0106) MCUCR = INT0_TRIG_FALL_EDGE;
B2 E082 LDI R24,2
B3 BF85 OUT 0x35,R24
(0107) MCUCR = 0; //low level trig
B4 BE25 OUT 0x35,R2
(0108) GIMSK = INT0_ENA;
B5 E480 LDI R24,0x40
B6 BF8B OUT 0x3B,R24
(0109)
(0110) SREG = GLOBAL_INT_ENA; //enable ints
B7 E880 LDI R24,0x80
B8 BF8F OUT 0x3F,R24
B9 C030 RJMP 0x00EA
(0111)
(0112) while (1)
(0113) {
(0114) /* forward march */
(0115) for (i = 0; i < 8; i++)
BA 2744 CLR R20
BB C006 RJMP 0x00C2
(0116) LED_On(i);
BC 2F04 MOV R16,R20
BD 2711 CLR R17
BE FD07 SBRC R16,7
BF 9510 COM R17
C0 DFD2 RCALL _LED_On
C1 9543 INC R20
C2 3048 CPI R20,0x8
C3 F3C4 BLT 0x00BC
(0117) /* backward march, don't repeat bit 7 */
(0118) for (i = 6; i >= 0; i--)
C4 E046 LDI R20,6
C5 C006 RJMP 0x00CC
(0119) LED_On(i);
C6 2F04 MOV R16,R20
C7 2711 CLR R17
C8 FD07 SBRC R16,7
C9 9510 COM R17
CA DFC8 RCALL _LED_On
CB 954A DEC R20
CC 3040 CPI R20,0
CD F7C4 BGE 0x00C6
(0120) //PORTB = 0xF0; //sanity check
(0121) //delay();
(0122) /* stack, don't repeat bit 0 */
(0123) for (i = 0, v = 3; i < 7; i++) {
CE 2744 CLR R20
CF E063 LDI R22,3
D0 C009 RJMP 0x00DA
(0124) PORTB = ~v;
D1 2E26 MOV R2,R22
D2 9420 COM R2
D3 BA28 OUT 0x18,R2
(0125) v |= v << 1;
D4 2E26 MOV R2,R22
D5 0C22 LSL R2
D6 2962 OR R22,R2
(0126) delay(3);
D7 E003 LDI R16,3
D8 DF92 RCALL _delay
D9 9543 INC R20
DA 3047 CPI R20,7
DB F3AC BLT 0x00D1
(0127) }
(0128) /* unstack */
(0129) for (i = 0, v = 0x7F; i < 8; i++) {
DC 2744 CLR R20
DD E76F LDI R22,0x7F
DE C009 RJMP 0x00E8
(0130) PORTB = ~v;
DF 2E26 MOV R2,R22
E0 9420 COM R2
E1 BA28 OUT 0x18,R2
(0131) v &= v >> 1;
E2 2E26 MOV R2,R22
E3 9425 ASR R2
E4 2162 AND R22,R2
(0132) delay(3);
FILE: <library>
E5 E003 LDI R16,3
E6 DF84 RCALL _delay
E7 9543 INC R20
E8 3048 CPI R20,0x8
E9 F3AC BLT 0x00DF
EA CFCF RJMP 0x00BA
EB 9508 RET
push_xgsetF00C:
EC 937A ST R23,-Y
ED 936A ST R22,-Y
EE 935A ST R21,-Y
EF 934A ST R20,-Y
F0 92BA ST R11,-Y
F1 92AA ST R10,-Y
F2 9508 RET
pop_xgsetF00C:
F3 90A9 LD R10,Y+
F4 90B9 LD R11,Y+
F5 9149 LD R20,Y+
F6 9159 LD R21,Y+
F7 9169 LD R22,Y+
F8 9179 LD R23,Y+
F9 9508 RET
lsl16:
FA 2322 TST R18
FB F021 BEQ 0x0100
FC 0F00 LSL R16
FD 1F11 ROL R17
FE 952A DEC R18
FF CFFA RJMP lsl16
100 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -