📄 timer2.lst
字号:
__start:
__text_start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E1 CPI R30,0x61
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D04C RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: F:\Learn\AVR\Pro_Mega8\Timer\Timer2\Delay.h
(0001) //延时1MS
(0002) void delay_1ms(void)
(0003) {
(0004) unsigned int i;
(0005) for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
i --> R16
0033 E001 LDI R16,1
0034 E010 LDI R17,0
0035 C002 RJMP 0x0038
0036 5F0F SUBI R16,0xFF
0037 4F1F SBCI R17,0xFF
0038 3706 CPI R16,0x76
0039 E0E4 LDI R30,4
003A 071E CPC R17,R30
003B F3D0 BCS 0x0036
(0006) ;
(0007) }
003C 9508 RET
_delay_ms:
i --> R20
n --> R22
003D D09C RCALL push_gset2
003E 01B8 MOVW R22,R16
(0008)
(0009) //延时nMS
(0010) void delay_ms(unsigned int n)
(0011) {
(0012) unsigned int i=0;
003F 2744 CLR R20
0040 2755 CLR R21
0041 C003 RJMP 0x0045
(0013) while(i<n)
(0014) {
(0015) delay_1ms();
0042 DFF0 RCALL _delay_1ms
(0016) i++;
0043 5F4F SUBI R20,0xFF
0044 4F5F SBCI R21,0xFF
0045 1746 CP R20,R22
0046 0757 CPC R21,R23
0047 F3D0 BCS 0x0042
(0017) }
(0018) }
0048 D078 RCALL pop_gset2
0049 9508 RET
FILE: F:\Learn\AVR\Pro_Mega8\Timer\Timer2\Timer2.C
(0001) /******************************************/
(0002) //文件名:Timer2.c
(0003) //功能: T/C2和INT0的应用
(0004) //作者: young
(0005) //时间: 2006.10.9
(0006) //目标MCU:ATmega8
(0007) //晶振: 8MHZ
(0008) /******************************************/
(0009) #include <iom8v.h>
(0010) #include <macros.h>
(0011) #include "Delay.h"
(0012)
(0013) #define U8 unsigned char
(0014) #define U16 unsigned int
(0015)
(0016) U8 KeyDown;
(0017)
(0018) //初始化端口
(0019) void init_port(void)
(0020) {
(0021) DDRB = 0x08;
_init_port:
004A E088 LDI R24,0x8
004B BB87 OUT 0x17,R24
(0022) PORTB = 0xFF;
004C EF8F LDI R24,0xFF
004D BB88 OUT 0x18,R24
(0023) PORTC = 0x0F;
004E E08F LDI R24,0xF
004F BB85 OUT 0x15,R24
(0024) DDRC = 0xFF;
0050 EF8F LDI R24,0xFF
0051 BB84 OUT 0x14,R24
(0025) PORTD = 0x04;
0052 E084 LDI R24,4
0053 BB82 OUT 0x12,R24
(0026) DDRD |= 0xFF;
0054 B381 IN R24,0x11
0055 6F8F ORI R24,0xFF
0056 BB81 OUT 0x11,R24
(0027) }
0057 9508 RET
(0028)
(0029) //初始化外部中断
(0030) void init_int(void)
(0031) {
(0032) MCUCR |= 0x02; //INT0下降沿触发
_init_int:
0058 B785 IN R24,0x35
0059 6082 ORI R24,2
005A BF85 OUT 0x35,R24
(0033) GICR |= 0x40; //打开INT0中断
005B B78B IN R24,0x3B
005C 6480 ORI R24,0x40
005D BF8B OUT 0x3B,R24
(0034) GIFR |= 0x40; //清除INT0中断标志位
005E B78A IN R24,0x3A
005F 6480 ORI R24,0x40
0060 BF8A OUT 0x3A,R24
(0035) }
0061 9508 RET
(0036)
(0037) //初始化T/C2
(0038) void init_timer2(void)
(0039) {
(0040) TCCR2 = 0x00; //T/C2工作于定时方式,先停止T/C0
_init_timer2:
0062 2422 CLR R2
0063 BC25 OUT 0x25,R2
(0041) TCNT2 = 0x00; //计数初始值0
0064 BC24 OUT 0x24,R2
(0042) OCR2 = 0x00; //设置比较参考值
0065 BC23 OUT 0x23,R2
(0043) TIMSK&= 0x3F; //关闭TOV2中断
0066 B789 IN R24,0x39
0067 738F ANDI R24,0x3F
0068 BF89 OUT 0x39,R24
(0044) }
0069 9508 RET
(0045)
(0046) //初始化所以硬件
(0047) void init_devices(void)
(0048) {
(0049) CLI(); //关闭全局中断
_init_devices:
006A 94F8 BCLR 7
(0050) init_port();
006B DFDE RCALL _init_port
(0051) init_int();
006C DFEB RCALL _init_int
(0052) init_timer2();
006D DFF4 RCALL _init_timer2
(0053) SEI(); //打开全局中断
006E 9478 BSET 7
(0054) }
006F 9508 RET
_int0_fun:
0070 938A ST R24,-Y
0071 939A ST R25,-Y
0072 B78F IN R24,0x3F
0073 938A ST R24,-Y
(0055)
(0056) //INT0中断函数
(0057) #pragma interrupt_handler int0_fun:iv_INT0
(0058) void int0_fun(void)
(0059) {
(0060) KeyDown++;
0074 91800060 LDS R24,_KeyDown
0076 5F8F SUBI R24,0xFF
0077 93800060 STS _KeyDown,R24
(0061) }
0079 9189 LD R24,Y+
007A BF8F OUT 0x3F,R24
007B 9199 LD R25,Y+
007C 9189 LD R24,Y+
007D 9518 RETI
(0062)
(0063) //主函数
(0064) void main(void)
(0065) {
(0066) init_devices();
_main:
007E DFEB RCALL _init_devices
007F C03F RJMP 0x00BF
(0067) while(1)
(0068) {
(0069) switch(KeyDown)
0080 91400060 LDS R20,_KeyDown
0082 2755 CLR R21
0083 3041 CPI R20,1
0084 E0E0 LDI R30,0
0085 075E CPC R21,R30
0086 F0A9 BEQ 0x009C
0087 3042 CPI R20,2
0088 E0E0 LDI R30,0
0089 075E CPC R21,R30
008A F0D1 BEQ 0x00A5
008B 3043 CPI R20,3
008C E0E0 LDI R30,0
008D 075E CPC R21,R30
008E F0C9 BEQ 0x00A8
008F 3044 CPI R20,4
0090 E0E0 LDI R30,0
0091 075E CPC R21,R30
0092 F0C1 BEQ 0x00AB
0093 3045 CPI R20,5
0094 E0E0 LDI R30,0
0095 075E CPC R21,R30
0096 F0B9 BEQ 0x00AE
0097 3046 CPI R20,6
0098 E0E0 LDI R30,0
0099 075E CPC R21,R30
009A F0B1 BEQ 0x00B1
009B C01A RJMP 0x00B6
(0070) {
(0071) case 1:
(0072) //打开T/C2,选择相位可调PWM模式
(0073) //COM2[1:0]=3正向比较输出,系统时钟64分频
(0074) TCCR2|=(1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<CS22);
009C B585 IN R24,0x25
009D 6784 ORI R24,0x74
009E BD85 OUT 0x25,R24
(0075) KeyDown++;
009F 91800060 LDS R24,_KeyDown
00A1 5F8F SUBI R24,0xFF
00A2 93800060 STS _KeyDown,R24
(0076) break;
00A4 C014 RJMP 0x00B9
(0077) case 2: //恒定第电平
(0078) OCR2 = 0x00;
00A5 2422 CLR R2
00A6 BC23 OUT 0x23,R2
(0079) break;
00A7 C011 RJMP 0x00B9
(0080) case 3: //恒定高电平
(0081) OCR2 = 0xFF;
00A8 EF8F LDI R24,0xFF
00A9 BD83 OUT 0x23,R24
(0082) break;
00AA C00E RJMP 0x00B9
(0083) case 4: //高低电平占空比200:56
(0084) OCR2 = 56;
00AB E388 LDI R24,0x38
00AC BD83 OUT 0x23,R24
(0085) break;
00AD C00B RJMP 0x00B9
(0086) case 5: //高低电平占空比56:200
(0087) OCR2 = 200;
00AE EC88 LDI R24,0xC8
00AF BD83 OUT 0x23,R24
(0088) break;
00B0 C008 RJMP 0x00B9
(0089) case 6:
(0090) TCCR2=0x00; //关闭T/C0
00B1 2422 CLR R2
00B2 BC25 OUT 0x25,R2
(0091) KeyDown=0;
00B3 92200060 STS _KeyDown,R2
(0092) break;
00B5 C003 RJMP 0x00B9
(0093) default:
(0094) KeyDown=0;
00B6 2422 CLR R2
00B7 92200060 STS _KeyDown,R2
(0095) break;
(0096) }
(0097) PORTC=KeyDown;
00B9 90200060 LDS R2,_KeyDown
00BB BA25 OUT 0x15,R2
(0098) delay_ms(10);
00BC E00A LDI R16,0xA
00BD E010 LDI R17,0
00BE DF7E RCALL _delay_ms
00BF CFC0 RJMP 0x0080
(0099) }
(0100) }
FILE: <library>
00C0 9508 RET
pop_gset2:
00C1 E0E2 LDI R30,2
00C2 C004 RJMP pop
push_gset1:
00C3 935A ST R21,-Y
00C4 934A ST R20,-Y
00C5 9508 RET
pop_gset1:
00C6 E0E1 LDI R30,1
pop:
00C7 9149 LD R20,Y+
00C8 9159 LD R21,Y+
00C9 FDE0 SBRC R30,0
00CA 9508 RET
00CB 9169 LD R22,Y+
00CC 9179 LD R23,Y+
00CD FDE1 SBRC R30,1
00CE 9508 RET
00CF 90A9 LD R10,Y+
00D0 90B9 LD R11,Y+
00D1 FDE2 SBRC R30,2
00D2 9508 RET
00D3 90C9 LD R12,Y+
00D4 90D9 LD R13,Y+
00D5 FDE3 SBRC R30,3
00D6 9508 RET
00D7 90E9 LD R14,Y+
00D8 90F9 LD R15,Y+
00D9 9508 RET
push_gset2:
00DA 937A ST R23,-Y
00DB 936A ST R22,-Y
00DC CFE6 RJMP push_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -