📄 ctc.lst
字号:
__text_start:
__start:
002B E5CF LDI R28,0x5F
002C E0D4 LDI R29,4
002D BFCD OUT 0x3D,R28
002E BFDE OUT 0x3E,R29
002F 51C0 SUBI R28,0x10
0030 40D0 SBCI R29,0
0031 EA0A LDI R16,0xAA
0032 8308 STD Y+0,R16
0033 2400 CLR R0
0034 E6E2 LDI R30,0x62
0035 E0F0 LDI R31,0
0036 E010 LDI R17,0
0037 36E2 CPI R30,0x62
0038 07F1 CPC R31,R17
0039 F011 BEQ 0x003C
003A 9201 ST R0,Z+
003B CFFB RJMP 0x0037
003C 8300 STD Z+0,R16
003D E5E4 LDI R30,0x54
003E E0F0 LDI R31,0
003F E6A0 LDI R26,0x60
0040 E0B0 LDI R27,0
0041 E010 LDI R17,0
0042 35E6 CPI R30,0x56
0043 07F1 CPC R31,R17
0044 F021 BEQ 0x0049
0045 95C8 LPM
0046 9631 ADIW R30,1
0047 920D ST R0,X+
0048 CFF9 RJMP 0x0042
0049 940E0081 CALL _main
_exit:
004B CFFF RJMP _exit
FILE: D:\AVR\我的程序\定时器1的捕捉比较控制LED实验\cfg.h
(0001) /*******************************
(0002) *程序名称:各功能函数
(0003) *作 者:萧联珠
(0004) *日 期:2007-11-20
(0005) ********************************/
(0006) #include <iom16v.h>
(0007) int flag_led=0;
(0008)
(0009) /*端口初始化*/
(0010) void port_init()
(0011) {
(0012) PORTB=0xFF; //PB口配置为输出
_port_init:
004C EF8F LDI R24,0xFF
004D BB88 OUT 0x18,R24
(0013) DDRB=0xFF; //PB口初始值为"1"
004E BB87 OUT 0x17,R24
004F 9508 RET
(0014) }
(0015)
(0016) /*CTC初始化*/
(0017) void ctc_init() //因为定时时间太短,看不到灯的变化
(0018) {
(0019) SREG = 0x80; //使能全局中断
_ctc_init:
0050 E880 LDI R24,0x80
0051 BF8F OUT 0x3F,R24
(0020) TIMSK|=(1<<OCIE0); //使能OC0比较中断
0052 B789 IN R24,0x39
0053 6082 ORI R24,2
0054 BF89 OUT 0x39,R24
(0021) TCCR0=0x09; //配置定时器工作在CTC模式,比较匹配时OC0电平取反
0055 E089 LDI R24,0x9
0056 BF83 OUT 0x33,R24
(0022) TCNT0=0;
0057 2422 CLR R2
0058 BE22 OUT 0x32,R2
(0023) OCR0=250; //设置捕捉比较输出初值
0059 EF8A LDI R24,0xFA
005A BF8C OUT 0x3C,R24
005B 9508 RET
_OC0_int:
005C 922A ST R2,-Y
005D 923A ST R3,-Y
005E 938A ST R24,-Y
005F 939A ST R25,-Y
0060 93EA ST R30,-Y
0061 B62F IN R2,0x3F
0062 922A ST R2,-Y
(0024) }
(0025)
(0026) /*CTC中断服务程序*/
(0027) #pragma interrupt_handler OC0_int:20
(0028) void OC0_int(void)
(0029) {
(0030) flag_led=flag_led+1;
0063 91800060 LDS R24,flag_led
0065 91900061 LDS R25,flag_led+1
0067 9601 ADIW R24,1
0068 93900061 STS flag_led+1,R25
006A 93800060 STS flag_led,R24
(0031) if(flag_led==1000) //对PB口取反
006C 3E88 CPI R24,0xE8
006D E0E3 LDI R30,3
006E 079E CPC R25,R30
006F F449 BNE 0x0079
(0032) {
(0033) flag_led=0;
0070 2422 CLR R2
0071 2433 CLR R3
0072 92300061 STS flag_led+1,R3
0074 92200060 STS flag_led,R2
(0034) PORTB=~PORTB;
0076 B228 IN R2,0x18
0077 9420 COM R2
0078 BA28 OUT 0x18,R2
(0035) }
0079 9029 LD R2,Y+
007A BE2F OUT 0x3F,R2
007B 91E9 LD R30,Y+
007C 9199 LD R25,Y+
007D 9189 LD R24,Y+
007E 9039 LD R3,Y+
007F 9029 LD R2,Y+
0080 9518 RETI
FILE: D:\AVR\我的程序\定时器1的捕捉比较控制LED实验\main.c
(0001) /****************************************
(0002) *实验目的:熟悉定时器CTC模式比较中断编程
(0003) *设 计:萧联珠
(0004) *日 期:2007-11-20
(0005) ****************************************/
(0006) #include <iom16v.h>
(0007) #include "cfg.h"
(0008)
(0009) void main()
(0010) {
(0011) port_init();
_main:
0081 DFCA RCALL _port_init
(0012) ctc_init();
0082 DFCD RCALL _ctc_init
(0013)
(0014) while(1);
FILE: <library>
0083 CFFF RJMP 0x0083
0084 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -