📄 t0时钟.s
字号:
.module T0时钟.c
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\T0CTCT~1/delay.h
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 10
; /*
; Title: icc-avr timer0 ctc timer
; Author: dushibiao
; Date: 2007 10 18
; Purpose: use timer0 ctc mode to generate a timer
; Frequency: Ext 8M
; Software: icc-avr
; Hardware: AVR mega16 BOARD
; Connect: dushibiao@126.com
; */
.dbline 11
; //内部8M晶振,T0 CTC方式 DUSHIBIAO 2007 7 7
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 15
;
; #include<iom16v.h>
; #include<macros.h>
; #include "shumaguan.h"
.dbline 16
; #define uint unsigned int
clr R20
clr R21
.dbline 17
; #define uchar unsigned char
xjmp L6
L3:
.dbline 18
xcall _delay_1us
L4:
.dbline 17
subi R20,255 ; offset = 1
sbci R21,255
L6:
.dbline 17
cp R20,R22
cpc R21,R23
brlo L3
.dbline -2
L2:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 22
;
; uint micsec; //毫秒
; uchar second, minute;
;
; void initial(void);
.dbline 24
clr R16
clr R17
xjmp L11
L8:
.dbline 24
L9:
.dbline 24
subi R16,255 ; offset = 1
sbci R17,255
L11:
.dbline 24
;
; void main()
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L8
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 28
; {
; initial();
;
; while(1)
.dbline 29
; {
clr R20
clr R21
.dbline 30
; unsigned int disvalue;
xjmp L16
L13:
.dbline 31
xcall _delay_1ms
L14:
.dbline 30
subi R20,255 ; offset = 1
sbci R21,255
L16:
.dbline 30
cp R20,R22
cpc R21,R23
brlo L13
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.area lit(rom, con, rel)
_discode::
.byte 192,249
.byte 164,176
.byte 153,146
.byte 130,248
.byte 128,144
.byte 255
.dbfile D:\M16开发板实验教程\icc-avr\T0CTCT~1/shumaguan.h
.dbsym e discode _discode A[11:11]kc
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\T0CTCT~1/shumaguan.h
.dbfunc e display _display fV
; number -> R20,R21
.even
_display::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 17
.dbline 21
cbi 0x18,0
.dbline 23
ldi R18,1000
ldi R19,3
movw R16,R20
xcall div16u
movw R30,R16
ldi R24,<_discode
ldi R25,>_discode
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 24
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 25
sbi 0x18,0
.dbline 27
cbi 0x18,1
.dbline 28
ldi R18,100
ldi R19,0
movw R16,R20
xcall div16u
ldi R18,10
ldi R19,0
xcall mod16u
movw R30,R16
ldi R24,<_discode
ldi R25,>_discode
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 29
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 30
sbi 0x18,1
.dbline 32
; disvalue=(unsigned int)minute*100+second;
; display(disvalue);
cbi 0x18,2
.dbline 33
; }
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16u
ldi R18,10
ldi R19,0
xcall div16u
movw R30,R16
ldi R24,<_discode
ldi R25,>_discode
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 34
;
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 35
; }
sbi 0x18,2
.dbline 37
; /*-------------------------------------------------------------
; fuction: initialize ports and timer0 register
cbi 0x18,3
.dbline 38
; --------------------------------------------------------------*/
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16u
movw R30,R16
ldi R24,<_discode
ldi R25,>_discode
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 39
; void initial(void)
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 40
; {
sbi 0x18,3
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r number 20 i
.dbend
.dbfile D:\M16开发板实验教程\icc-avr\T0CTCT~1\T0时钟.c
.dbfunc e main _main fV
; disvalue -> R20,R21
.even
_main::
.dbline -1
.dbline 25
.dbline 26
xcall _initial
xjmp L20
L19:
.dbline 29
.dbline 31
lds R2,_minute
ldi R24,100
mul R24,R2
movw R20,R0
lds R2,_second
clr R3
add R20,R2
adc R21,R3
.dbline 32
movw R16,R20
xcall _display
.dbline 33
L20:
.dbline 28
xjmp L19
X0:
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbsym r disvalue 20 i
.dbend
.dbfunc e initial _initial fV
.even
_initial::
.dbline -1
.dbline 40
.dbline 41
; PORTA=0XFF; //A口初始化
ldi R24,255
out 0x1b,R24
.dbline 42
; DDRA=0XFF; //out
out 0x1a,R24
.dbline 43
; PORTB=0XFF; //B口初始化
out 0x18,R24
.dbline 44
; DDRB=0XFF;
out 0x17,R24
.dbline 45
; PORTC=0XFF; //其它口上拉电阻有效
out 0x15,R24
.dbline 46
; PORTD=0XFF;
out 0x12,R24
.dbline 47
; _SEI();
sei
.dbline 48
; OCR0=249; //定时250us ORC0+1
ldi R24,249
out 0x3c,R24
.dbline 49
; TIMSK|=(1<<OCIE0); //比较匹配中断允许
in R24,0x39
ori R24,2
out 0x39,R24
.dbline 50
; TCCR0|=(1<<WGM01)|(1<<CS01); //CTC模式,8分频
in R24,0x33
ori R24,10
out 0x33,R24
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _T0INT
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\T0CTCT~1\T0时钟.c
.dbfunc e T0INT _T0INT fV
.even
_T0INT::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 87
; /*---------------------------------------------------------
; TCCR0
; 7: FOC0--------Force Output Campare
; 6,3 WGM01:0-----Waveform Generator Mode
; 00----------Normal
; 01----------PWM,Phase Correct
; 10----------CTC
; 11----------Fast PWM
; 5,4 COM11:0-----Compare Match Output Mode
; ----------------------------------------
; Non PWM mode
; ----------------------------------------
; 00----------Normal Port Operation, OC0 disconnected
; 01----------Toggle OC0 on compare match
; 10----------Clear OC0 on compare match
; 11----------Set OC0 on compare match
; 2--0 CS02:0------Clock Select
; 000---------None clock select
; 001---------clk(io)
; 010---------clk(io)/8
; 011---------clk(io)/64
; 100---------clk(io)/256
; 101---------clk(io)/1024
; 110---------T0 pin,falling edge
; 111---------T0 pin,rising edge
; ----------------------------------------------------------*/
; }
;
; /*------------------------------------------------------------
; function: interrupt service routine,it increases micsec,minute
; second , and the main loop routine display the current
; time
; -------------------------------------------------------------*/
;
; #pragma interrupt_handler T0INT: iv_TIMER0_COMP
; void T0INT(void)
; {
.dbline 88
; micsec += 1;
lds R24,_micsec
lds R25,_micsec+1
adiw R24,1
sts _micsec+1,R25
sts _micsec,R24
.dbline 89
; if(micsec==4000)
cpi R24,160
ldi R30,15
cpc R25,R30
brne L24
.dbline 90
; {
.dbline 91
; micsec=0;
clr R2
clr R3
sts _micsec+1,R3
sts _micsec,R2
.dbline 92
; second +=1 ;
lds R24,_second
subi R24,255 ; addi 1
sts _second,R24
.dbline 93
; if(second==60)
cpi R24,60
brne L26
.dbline 94
; {
.dbline 95
; second = 0;
sts _second,R2
.dbline 96
; minute += 1 ;
lds R24,_minute
subi R24,255 ; addi 1
sts _minute,R24
.dbline 97
; if(minute==60)
cpi R24,60
brne L28
.dbline 98
; minute=0;
sts _minute,R2
L28:
.dbline 99
; }
L26:
.dbline 100
L24:
.dbline -2
L23:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area bss(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\T0CTCT~1\T0时钟.c
_minute::
.blkb 1
.dbsym e minute _minute c
_second::
.blkb 1
.dbsym e second _second c
_micsec::
.blkb 2
.dbsym e micsec _micsec i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -