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

📄 led.lst

📁 AVR单片机源代码,采集按键值,并点亮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 + -