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

📄 main.lst

📁 一个关于AVR单片机的例程
💻 LST
字号:
__start:
__text_start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E0      CPI	R30,0x60
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E008E  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: E:\avr\2.2.2\main.c
(0001) //ICC-AVR application builder : 2007-6-9 0:33:58
(0002) // Target : M16
(0003) // Crystal: 1.0000Mhz
(0004) // 用途:演示定时器的工作原理
(0005) // 作者:古欣
(0006) // AVR与虚拟仪器 http://www.avrvi.com
(0007) #include <iom16v.h>
(0008) #include <macros.h>
(0009) 
(0010) void port_init(void)
(0011) {
(0012)  PORTA = 0x00;
_port_init:
    004B 2422      CLR	R2
    004C BA2B      OUT	0x1B,R2
(0013)  DDRA  = 0x03; //PA0 PA1 输出
    004D E083      LDI	R24,3
    004E BB8A      OUT	0x1A,R24
(0014)  PORTB = 0x00;
    004F BA28      OUT	0x18,R2
(0015)  DDRB  = 0xFF; //PB 输出
    0050 EF8F      LDI	R24,0xFF
    0051 BB87      OUT	0x17,R24
(0016)  PORTC = 0x00; //m103 output only
    0052 BA25      OUT	0x15,R2
(0017)  DDRC  = 0x00;
    0053 BA24      OUT	0x14,R2
(0018)  PORTD = 0x00;
    0054 BA22      OUT	0x12,R2
(0019)  DDRD  = 0x00;
    0055 BA21      OUT	0x11,R2
    0056 9508      RET
(0020) }
(0021) 
(0022) //TIMER0 initialize - prescale:8
(0023) // WGM: Normal
(0024) // desired value: 1KHz
(0025) // actual value:  1.000KHz (0.0%)
(0026) void timer0_init(void)
(0027) {
(0028)  TCCR0 = 0x00; //stop
_timer0_init:
    0057 2422      CLR	R2
    0058 BE23      OUT	0x33,R2
(0029)  TCNT0 = 0x83; //set count
    0059 E883      LDI	R24,0x83
    005A BF82      OUT	0x32,R24
(0030)  OCR0  = 0x7D;  //set compare
    005B E78D      LDI	R24,0x7D
    005C BF8C      OUT	0x3C,R24
(0031)  TCCR0 = 0x02; //start timer
    005D E082      LDI	R24,2
    005E BF83      OUT	0x33,R24
    005F 9508      RET
_timer0_comp_isr:
    0060 922A      ST	R2,-Y
    0061 938A      ST	R24,-Y
    0062 B62F      IN	R2,0x3F
    0063 922A      ST	R2,-Y
(0032) }
(0033) 
(0034) //比较匹配中断
(0035) #pragma interrupt_handler timer0_comp_isr:20
(0036) void timer0_comp_isr(void)
(0037) {
(0038)  //compare occured TCNT0=OCR0
(0039)  if(OCR0==0x7D) //调整0x7D
    0064 B78C      IN	R24,0x3C
    0065 378D      CPI	R24,0x7D
    0066 F419      BNE	0x006A
(0040)  {
(0041)   OCR0=0x7F;
    0067 E78F      LDI	R24,0x7F
    0068 BF8C      OUT	0x3C,R24
(0042)  }
    0069 C002      RJMP	0x006C
(0043)  else
(0044)  {
(0045)   OCR0=0x7D;
    006A E78D      LDI	R24,0x7D
    006B BF8C      OUT	0x3C,R24
(0046)  }
(0047)   PORTA ^= 0x01; //PA0取反
    006C E081      LDI	R24,1
    006D B22B      IN	R2,0x1B
    006E 2628      EOR	R2,R24
    006F BA2B      OUT	0x1B,R2
    0070 9029      LD	R2,Y+
    0071 BE2F      OUT	0x3F,R2
    0072 9189      LD	R24,Y+
    0073 9029      LD	R2,Y+
    0074 9518      RETI
_timer0_ovf_isr:
    0075 922A      ST	R2,-Y
    0076 938A      ST	R24,-Y
    0077 B62F      IN	R2,0x3F
    0078 922A      ST	R2,-Y
(0048) }
(0049) 
(0050) //溢出中断中断
(0051) #pragma interrupt_handler timer0_ovf_isr:10
(0052) void timer0_ovf_isr(void)
(0053) {
(0054)  TCNT0 = 0x83; //reload counter value
    0079 E883      LDI	R24,0x83
    007A BF82      OUT	0x32,R24
(0055)  PORTA ^= 0x01; //PA0取反
    007B E081      LDI	R24,1
    007C B22B      IN	R2,0x1B
    007D 2628      EOR	R2,R24
    007E BA2B      OUT	0x1B,R2
    007F 9029      LD	R2,Y+
    0080 BE2F      OUT	0x3F,R2
    0081 9189      LD	R24,Y+
    0082 9029      LD	R2,Y+
    0083 9518      RETI
(0056) }
(0057) 
(0058) //call this routine to initialize all peripherals
(0059) void init_devices(void)
(0060) {
(0061)  //stop errant interrupts until set up
(0062)  CLI(); //disable all interrupts
_init_devices:
    0084 94F8      BCLR	7
(0063)  port_init();
    0085 DFC5      RCALL	_port_init
(0064)  timer0_init();
    0086 DFD0      RCALL	_timer0_init
(0065) 
(0066)  MCUCR = 0x00;
    0087 2422      CLR	R2
    0088 BE25      OUT	0x35,R2
(0067)  GICR  = 0x00;
    0089 BE2B      OUT	0x3B,R2
(0068)  TIMSK = 0x03; //timer interrupt sources 允许定时器零匹配和溢出中断
    008A E083      LDI	R24,3
    008B BF89      OUT	0x39,R24
(0069)  SEI(); //re-enable interrupts
    008C 9478      BSET	7
    008D 9508      RET
(0070)  //all peripherals are now initialized
(0071) }
(0072) 
(0073) void main(void)
(0074) {
(0075)  init_devices();
_main:
    008E DFF5      RCALL	_init_devices
(0076)  PORTA=0x00;
    008F 2422      CLR	R2
    0090 BA2B      OUT	0x1B,R2
    0091 C002      RJMP	0x0094
(0077)  while(1)
(0078)  {
(0079)   PORTB = TCNT0; //任何时候都可以读TCNT0
FILE: <library>
    0092 B622      IN	R2,0x32
    0093 BA28      OUT	0x18,R2
    0094 CFFD      RJMP	0x0092
    0095 9508      RET

⌨️ 快捷键说明

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