📄 timer2.s
字号:
.module Timer2.C
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer2/Delay.h
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 3
; /******************************************/
; //文件名:Timer2.c
; //功能: T/C2和INT0的应用
.dbline 5
; //作者: young
; //时间: 2006.10.9
ldi R16,1
ldi R17,0
rjmp L5
L2:
.dbline 6
L3:
.dbline 5
subi R16,255 ; offset = 1
sbci R17,255
L5:
.dbline 5
cpi R16,118
ldi R30,4
cpc R17,R30
brlo L2
.dbline -2
.dbline 7
; //目标MCU:ATmega8
; //晶振: 8MHZ
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_ms::
rcall push_gset2
movw R22,R16
.dbline -1
.dbline 11
; /******************************************/
; #include <iom8v.h>
; #include <macros.h>
; #include "Delay.h"
.dbline 12
;
clr R20
clr R21
rjmp L8
L7:
.dbline 14
.dbline 15
rcall _delay_1ms
.dbline 16
subi R20,255 ; offset = 1
sbci R21,255
.dbline 17
L8:
.dbline 13
; #define U8 unsigned char
cp R20,R22
cpc R21,R23
brlo L7
.dbline -2
.dbline 18
; #define U16 unsigned int
;
; U8 KeyDown;
;
; //初始化端口
L6:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer2\Timer2.C
.dbfunc e init_port _init_port fV
.even
_init_port::
.dbline -1
.dbline 20
; void init_port(void)
; {
.dbline 21
; DDRB = 0x08;
ldi R24,8
out 0x17,R24
.dbline 22
; PORTB = 0xFF;
ldi R24,255
out 0x18,R24
.dbline 23
; PORTC = 0x0F;
ldi R24,15
out 0x15,R24
.dbline 24
; DDRC = 0xFF;
ldi R24,255
out 0x14,R24
.dbline 25
; PORTD = 0x04;
ldi R24,4
out 0x12,R24
.dbline 26
; DDRD |= 0xFF;
in R24,0x11
ori R24,255
out 0x11,R24
.dbline -2
.dbline 27
; }
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_int _init_int fV
.even
_init_int::
.dbline -1
.dbline 31
;
; //初始化外部中断
; void init_int(void)
; {
.dbline 32
; MCUCR |= 0x02; //INT0下降沿触发
in R24,0x35
ori R24,2
out 0x35,R24
.dbline 33
; GICR |= 0x40; //打开INT0中断
in R24,0x3b
ori R24,64
out 0x3b,R24
.dbline 34
; GIFR |= 0x40; //清除INT0中断标志位
in R24,0x3a
ori R24,64
out 0x3a,R24
.dbline -2
.dbline 35
; }
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_timer2 _init_timer2 fV
.even
_init_timer2::
.dbline -1
.dbline 39
;
; //初始化T/C2
; void init_timer2(void)
; {
.dbline 40
; TCCR2 = 0x00; //T/C2工作于定时方式,先停止T/C0
clr R2
out 0x25,R2
.dbline 41
; TCNT2 = 0x00; //计数初始值0
out 0x24,R2
.dbline 42
; OCR2 = 0x00; //设置比较参考值
out 0x23,R2
.dbline 43
; TIMSK&= 0x3F; //关闭TOV2中断
in R24,0x39
andi R24,63
out 0x39,R24
.dbline -2
.dbline 44
; }
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 48
;
; //初始化所以硬件
; void init_devices(void)
; {
.dbline 49
; CLI(); //关闭全局中断
cli
.dbline 50
; init_port();
rcall _init_port
.dbline 51
; init_int();
rcall _init_int
.dbline 52
; init_timer2();
rcall _init_timer2
.dbline 53
; SEI(); //打开全局中断
sei
.dbline -2
.dbline 54
; }
L13:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 2
rjmp _int0_fun
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer2\Timer2.C
.dbfunc e int0_fun _int0_fun fV
.even
_int0_fun::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 59
;
; //INT0中断函数
; #pragma interrupt_handler int0_fun:iv_INT0
; void int0_fun(void)
; {
.dbline 60
; KeyDown++;
lds R24,_KeyDown
subi R24,255 ; addi 1
sts _KeyDown,R24
.dbline -2
.dbline 61
; }
L14:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 65
;
; //主函数
; void main(void)
; {
.dbline 66
; init_devices();
rcall _init_devices
rjmp L17
L16:
.dbline 68
; while(1)
; {
.dbline 69
; switch(KeyDown)
lds R20,_KeyDown
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L22
cpi R20,2
ldi R30,0
cpc R21,R30
breq L23
cpi R20,3
ldi R30,0
cpc R21,R30
breq L24
cpi R20,4
ldi R30,0
cpc R21,R30
breq L25
cpi R20,5
ldi R30,0
cpc R21,R30
breq L26
cpi R20,6
ldi R30,0
cpc R21,R30
breq L27
rjmp L19
X0:
.dbline 70
; {
L22:
.dbline 74
; case 1:
; //打开T/C2,选择相位可调PWM模式
; //COM2[1:0]=3正向比较输出,系统时钟64分频
; TCCR2|=(1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<CS22);
in R24,0x25
ori R24,116
out 0x25,R24
.dbline 75
; KeyDown++;
lds R24,_KeyDown
subi R24,255 ; addi 1
sts _KeyDown,R24
.dbline 76
; break;
rjmp L20
L23:
.dbline 78
; case 2: //恒定第电平
; OCR2 = 0x00;
clr R2
out 0x23,R2
.dbline 79
; break;
rjmp L20
L24:
.dbline 81
; case 3: //恒定高电平
; OCR2 = 0xFF;
ldi R24,255
out 0x23,R24
.dbline 82
; break;
rjmp L20
L25:
.dbline 84
; case 4: //高低电平占空比200:56
; OCR2 = 56;
ldi R24,56
out 0x23,R24
.dbline 85
; break;
rjmp L20
L26:
.dbline 87
; case 5: //高低电平占空比56:200
; OCR2 = 200;
ldi R24,200
out 0x23,R24
.dbline 88
; break;
rjmp L20
L27:
.dbline 90
; case 6:
; TCCR2=0x00; //关闭T/C0
clr R2
out 0x25,R2
.dbline 91
; KeyDown=0;
sts _KeyDown,R2
.dbline 92
; break;
rjmp L20
L19:
.dbline 94
; default:
; KeyDown=0;
clr R2
sts _KeyDown,R2
.dbline 95
; break;
L20:
.dbline 97
lds R2,_KeyDown
out 0x15,R2
.dbline 98
ldi R16,10
ldi R17,0
rcall _delay_ms
.dbline 99
L17:
.dbline 67
rjmp L16
X1:
.dbline -2
.dbline 100
; }
; PORTC=KeyDown;
; delay_ms(10);
; }
; }
L15:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer2\Timer2.C
_KeyDown::
.blkb 1
.dbsym e KeyDown _KeyDown c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -