📄 main.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 + -