📄 oc2上输出矩形波.lis
字号:
.module OC2上输出矩形波.c
.area text(rom, con, rel)
0000 .dbfile E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_OC2上输出矩形波\OC2上输出矩形波.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 9
0000 ; //ICC-AVR application builder : 2009-3-11 13:07:26
0000 ; // Target : M8
0000 ; // Crystal: 8.0000Mhz
0000 ;
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 10
0000 ; PORTB = 0x00;
0000 2224 clr R2
0002 28BA out 0x18,R2
0004 .dbline 11
0004 ; DDRB = 0x00;
0004 27BA out 0x17,R2
0006 .dbline 12
0006 ; PORTC = 0x00; //m103 output only
0006 25BA out 0x15,R2
0008 .dbline 13
0008 ; DDRC = 0x00;
0008 24BA out 0x14,R2
000A .dbline 14
000A ; PORTD = 0x00;
000A 22BA out 0x12,R2
000C .dbline 15
000C ; DDRD = 0x00;
000C 21BA out 0x11,R2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e init_devices _init_devices fV
.even
0010 _init_devices::
0010 .dbline -1
0010 .dbline 20
0010 ; }
0010 ;
0010 ; //call this routine to initialize all peripherals
0010 ; void init_devices(void)
0010 ; {
0010 .dbline 22
0010 ; //stop errant interrupts until set up
0010 ; CLI(); //disable all interrupts
0010 F894 cli
0012 .dbline 23
0012 ; port_init();
0012 F6DF rcall _port_init
0014 .dbline 25
0014 ;
0014 ; MCUCR = 0x00;
0014 2224 clr R2
0016 25BE out 0x35,R2
0018 .dbline 26
0018 ; GICR = 0x00;
0018 2BBE out 0x3b,R2
001A .dbline 27
001A ; TIMSK = 0x00; //timer interrupt sources
001A 29BE out 0x39,R2
001C .dbline 28
001C ; SEI(); //re-enable interrupts
001C 7894 sei
001E .dbline -2
001E L2:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbend
0020 .dbfunc e init_timer2_CTC _init_timer2_CTC fV
0020 ; p -> R16
.even
0020 _init_timer2_CTC::
0020 .dbline -1
0020 .dbline 42
0020 ; //all peripherals are now initialized
0020 ; }
0020 ;
0020 ; /************************************
0020 ; 用 途:TC2用CTC模式输出频率可调矩形波
0020 ; Taget :mega8
0020 ; crystal :8M
0020 ; 介 绍:初始化以后就可以在OC2上输出矩形波了,
0020 ; 但OC2必须设为输出(PB3)
0020 ; 入口参数:p可用来调节频率,为0-255中的一个
0020 ; 出口参数:
0020 ; *************************************/
0020 ; void init_timer2_CTC(unsigned char p)
0020 ; {
0020 .dbline 43
0020 ; DDRB|=(1<<PB3);
0020 BB9A sbi 0x17,3
0022 .dbline 44
0022 ; TCCR2=0x0;//TC2工作于定时方式,先停止TC2
0022 2224 clr R2
0024 25BC out 0x25,R2
0026 .dbline 45
0026 ; TCNT2=0x00;//计数器初始值设为0
0026 24BC out 0x24,R2
0028 .dbline 46
0028 ; OCR2=p;//设置比较参考值
0028 03BD out 0x23,R16
002A .dbline 47
002A ; TIMSK|=(1<<OCIE2);//打开TOV2的比较区配中断
002A 89B7 in R24,0x39
002C 8068 ori R24,128
002E 89BF out 0x39,R24
0030 .dbline 51
0030 ; //TC2工作于定时方式CTC(WGM2[1:0]=2)
0030 ; //比较匹配时触发OC2取反(COM2[1:0]=1)
0030 ; //系统时钟256分频(CS2[2:0]=0xC)
0030 ; TCCR2=(1<<WGM21)|(1<<COM20)|(1<<CS22)|(1<<CS21);
0030 8EE1 ldi R24,30
0032 85BD out 0x25,R24
0034 .dbline -2
0034 L3:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym r p 16 c
0036 .dbend
0036 .dbfunc e timer2_CTC _timer2_CTC fV
0036 ; x -> R16
.even
0036 _timer2_CTC::
0036 .dbline -1
0036 .dbline 55
0036 ; }
0036 ; //改变频率
0036 ; void timer2_CTC(unsigned char x)
0036 ; {
0036 .dbline 56
0036 ; OCR2=x;
0036 03BD out 0x23,R16
0038 .dbline -2
0038 L4:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbsym r x 16 c
003A .dbend
003A .dbfunc e main _main fV
.even
003A _main::
003A .dbline -1
003A .dbline 60
003A ; }
003A ;
003A ; void main()
003A ; {
003A .dbline 61
003A ; port_init();
003A E2DF rcall _port_init
003C .dbline 62
003C ; init_devices();
003C E9DF rcall _init_devices
003E .dbline 64
003E ;
003E ; init_timer2_CTC(20);
003E 04E1 ldi R16,20
0040 EFDF rcall _init_timer2_CTC
0042 L6:
0042 .dbline 66
0042 ; while(1)
0042 ; {
0042 .dbline 67
0042 ; ;
0042 .dbline 68
0042 ; }
0042 L7:
0042 .dbline 65
0042 FFCF rjmp L6
0044 X0:
0044 .dbline -2
0044 L5:
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbend
0046 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -