📄 timer0.s
字号:
.module Timer0.C
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 3
; /******************************************/
; //文件名:Timer0.c
; //功能: T/C0和INT0的应用
.dbline 5
; //作者: young
; //时间: 2006.10.1
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
; unsigned char KeyDown; //全局变量,用来记录按键按下次数
cp R20,R22
cpc R21,R23
brlo L7
.dbline -2
.dbline 18
; unsigned char CountNum; //记录T/C0中断,每中断一次是1/500S
; unsigned char TimeNum[3]={0, 0, 0}; //记录中断时间,分,秒,百分秒
;
; //初始化端口
; void Init_Port(void)
L6:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.area data(ram, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
_TimeNum::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0/Delay.h
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
.dbsym e TimeNum _TimeNum A[3:3]c
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
.dbfunc e Init_Port _Init_Port fV
.even
_Init_Port::
.dbline -1
.dbline 19
; {
.dbline 20
; DDRB=0xFF; //设置B口为输出模式
ldi R24,255
out 0x17,R24
.dbline 21
; PORTB=0xFF; //置高电平
out 0x18,R24
.dbline 22
; DDRC=0x7F;
ldi R24,127
out 0x14,R24
.dbline 23
; PORTC=0x7F;
out 0x15,R24
.dbline 24
; DDRD|=0x03;
in R24,0x11
ori R24,3
out 0x11,R24
.dbline 25
; PORTD=0xFF;
ldi R24,255
out 0x12,R24
.dbline -2
.dbline 26
; }
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Init_Int _Init_Int fV
.even
_Init_Int::
.dbline -1
.dbline 30
;
; //初始化外部中断
; void Init_Int(void)
; {
.dbline 31
; MCUCR|=0x02; //INT0下降沿触发
in R24,0x35
ori R24,2
out 0x35,R24
.dbline 32
; GICR|=0x40; //打开INT0中断
in R24,0x3b
ori R24,64
out 0x3b,R24
.dbline 33
; GIFR|=0x40; //清除INT0中断标志位
in R24,0x3a
ori R24,64
out 0x3a,R24
.dbline -2
.dbline 34
; }
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Init_Timer0 _Init_Timer0 fV
.even
_Init_Timer0::
.dbline -1
.dbline 38
;
; //初始化T/C0
; void Init_Timer0(void)
; {
.dbline 39
; TCCR0=0x00; //T/C0工作于定时方式,先停止T/C0
clr R2
out 0x33,R2
.dbline 40
; TCNT0=0x06; //计数初始值6
ldi R24,6
out 0x32,R24
.dbline 41
; TIMSK|=(1<<TOIE0); //开放TOV0中断
in R24,0x39
ori R24,1
out 0x39,R24
.dbline -2
.dbline 42
; }
L12:
.dbline 0 ; func end
ret
.dbend
.area lit(rom, con, rel)
L14:
.byte 63,6
.byte 91,'O
.byte 'f,'m
.byte 125,7
.byte 127,'o
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
.dbfunc e Display _Display fV
; num -> y+0
; i -> R22
; timer -> R10,R11
.even
_Display::
rcall push_gset3
movw R10,R16
sbiw R28,10
.dbline -1
.dbline 46
;
; //显示定时时间
; void Display(unsigned char *timer)
; {
.dbline 47
; unsigned char i=0;
clr R22
.dbline 48
; unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
ldi R24,<L14
ldi R25,>L14
movw R30,R28
ldi R16,10
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 51
; 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
; //依次显示"00:00.00"
; for(i=0; i<6; i++)
rjmp L18
L15:
.dbline 52
; {
.dbline 53
; PORTC&=~(1<<i);
ldi R16,1
mov R17,R22
rcall lsl8
mov R2,R16
com R2
in R3,0x15
and R3,R2
out 0x15,R3
.dbline 54
; switch(i)
mov R20,R22
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L22
cpi R20,3
ldi R30,0
cpc R21,R30
breq L22
rjmp L19
X0:
.dbline 55
; {
L22:
.dbline 58
; case 1:
; case 3:
; PORTB=num[timer[i]]+0x80;
mov R30,R22
clr R31
add R30,R10
adc R31,R11
ldd R30,z+0
clr R31
movw R24,R28
add R30,R24
adc R31,R25
ldd R24,z+0
subi R24,128 ; addi 128
out 0x18,R24
.dbline 59
; break;
rjmp L20
L19:
.dbline 61
; default:
; PORTB=num[timer[i]];
mov R30,R22
clr R31
add R30,R10
adc R31,R11
ldd R30,z+0
clr R31
movw R24,R28
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 62
; break;
L20:
.dbline 64
ldi R16,1
ldi R17,0
rcall _delay_ms
.dbline 65
in R24,0x15
ori R24,255
out 0x15,R24
.dbline 66
L16:
.dbline 51
inc R22
L18:
.dbline 51
cpi R22,6
brsh X1
rjmp L15
X1:
.dbline -2
.dbline 67
; }
; delay_ms(1);
; PORTC|=0xFF;
; }
; }
L13:
adiw R28,10
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l num 0 A[10:10]c
.dbsym r i 22 c
.dbsym r timer 10 pc
.dbend
.area vector(rom, abs)
.org 2
rjmp _int0_fun
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
.dbfunc e int0_fun _int0_fun fV
.even
_int0_fun::
st -y,R2
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 72
;
; //INT0中断函数
; #pragma interrupt_handler int0_fun:iv_INT0
; void int0_fun(void)
; {
.dbline 73
; KeyDown++;
lds R24,_KeyDown
subi R24,255 ; addi 1
sts _KeyDown,R24
.dbline 74
; switch(KeyDown)
mov R16,R24
clr R17
cpi R16,1
ldi R30,0
cpc R17,R30
breq L27
cpi R16,2
ldi R30,0
cpc R17,R30
breq L28
rjmp L24
X2:
.dbline 75
; {
L27:
.dbline 77
; case 1:
; TCNT0=0x06; //计数初始值6
ldi R24,6
out 0x32,R24
.dbline 78
; TCCR0=0x03; //打开T/C0,系统时钟64分频
ldi R24,3
out 0x33,R24
.dbline 79
; break;
rjmp L25
L28:
.dbline 81
; case 2:
; TCCR0=0x00; //关闭T/C0
clr R2
out 0x33,R2
.dbline 82
; break;
rjmp L25
L24:
.dbline 84
clr R2
sts _TimeNum+2,R2
sts _TimeNum+1,R2
sts _TimeNum,R2
.dbline 85
sts _KeyDown,R2
.dbline 86
L25:
.dbline -2
.dbline 88
; default:
; TimeNum[0]=TimeNum[1]=TimeNum[2]=0;//计时清零
; KeyDown=0;
; break;
; }
; }
L23:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 18
rjmp _timer0_fun
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
.dbfunc e timer0_fun _timer0_fun fV
.even
_timer0_fun::
st -y,R2
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 93
;
; //T/C0中断函数
; #pragma interrupt_handler timer0_fun:iv_TIMER0_OVF
; void timer0_fun(void)
; {
.dbline 94
; TCNT0=0x06 ; //重装计数初始值6
ldi R24,6
out 0x32,R24
.dbline 95
; if(++CountNum==5)
lds R24,_CountNum
subi R24,255 ; addi 1
mov R2,R24
sts _CountNum,R2
cpi R24,5
brne L32
.dbline 96
; {
.dbline 97
; CountNum=0; //计数到5次,计数值复位
clr R2
sts _CountNum,R2
.dbline 98
; TimeNum[2]++; //秒的百分位加1
lds R24,_TimeNum+2
subi R24,255 ; addi 1
sts _TimeNum+2,R24
.dbline 99
; if(TimeNum[2]==100)
cpi R24,100
brne L35
.dbline 100
; {
.dbline 101
; TimeNum[2]=0;
sts _TimeNum+2,R2
.dbline 102
; TimeNum[1]++; //秒进位
lds R24,_TimeNum+1
subi R24,255 ; addi 1
sts _TimeNum+1,R24
.dbline 103
; }
L35:
.dbline 104
; if(TimeNum[1]==60)
lds R24,_TimeNum+1
cpi R24,60
brne L40
.dbline 105
; {
.dbline 106
; TimeNum[1]=0;
clr R2
sts _TimeNum+1,R2
.dbline 107
; TimeNum[0]++; //分进位
lds R24,_TimeNum
subi R24,255 ; addi 1
sts _TimeNum,R24
.dbline 108
; }
L40:
.dbline 109
; if(TimeNum[0]==60)
lds R24,_TimeNum
cpi R24,60
brne L44
.dbline 110
; {
.dbline 111
; TimeNum[0]=0;
clr R2
sts _TimeNum,R2
.dbline 112
; }
L44:
.dbline 113
L32:
.dbline -2
.dbline 114
; }
; }
L31:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area lit(rom, con, rel)
L47:
.byte 0,0
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
.dbfunc e main _main fV
; timer -> y+0
.even
_main::
sbiw R28,6
.dbline -1
.dbline 118
;
; //主函数
; void main()
; {
.dbline 119
; unsigned char timer[6]={0, 0, 0, 0, 0, 0};
ldi R24,<L47
ldi R25,>L47
movw R30,R28
ldi R16,6
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 121
;
; CLI(); //先关闭全局中断
cli
.dbline 122
; Init_Port(); //初始化端口
rcall _Init_Port
.dbline 123
; Init_Int(); //初始化外部中断
rcall _Init_Int
.dbline 124
; Init_Timer0(); //初始化T/C0
rcall _Init_Timer0
.dbline 126
;
; KeyDown=0; //初始化全局变量
clr R2
sts _KeyDown,R2
.dbline 127
; CountNum=0;
sts _CountNum,R2
.dbline 128
; SEI(); //打开全局中断
sei
rjmp L49
L48:
.dbline 130
.dbline 131
ldi R17,10
lds R16,_TimeNum
rcall div8u
std y+0,R16
.dbline 132
ldi R17,10
lds R16,_TimeNum
rcall mod8u
std y+1,R16
.dbline 133
ldi R17,10
lds R16,_TimeNum+1
rcall div8u
std y+2,R16
.dbline 134
ldi R17,10
lds R16,_TimeNum+1
rcall mod8u
std y+3,R16
.dbline 135
ldi R17,10
lds R16,_TimeNum+2
rcall div8u
std y+4,R16
.dbline 136
ldi R17,10
lds R16,_TimeNum+2
rcall mod8u
std y+5,R16
.dbline 137
movw R16,R28
rcall _Display
.dbline 138
L49:
.dbline 129
rjmp L48
X3:
.dbline -2
.dbline 139
; while (1)
; {
; timer[0]=TimeNum[0]/10;
; timer[1]=TimeNum[0]%10;
; timer[2]=TimeNum[1]/10;
; timer[3]=TimeNum[1]%10;
; timer[4]=TimeNum[2]/10;
; timer[5]=TimeNum[2]%10;
; Display(timer); //显示时间
; }
; }
L46:
adiw R28,6
.dbline 0 ; func end
ret
.dbsym l timer 0 A[6:6]c
.dbend
.area bss(ram, con, rel)
.dbfile F:\Learn\AVR\Pro_Mega8\Timer\Timer0\Timer0.C
_CountNum::
.blkb 1
.dbsym e CountNum _CountNum c
_KeyDown::
.blkb 1
.dbsym e KeyDown _KeyDown c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -