📄 delay_1s.lst
字号:
__start:
__text_start:
0033 E5CF LDI R28,0x5F
0034 E0D4 LDI R29,4
0035 BFCD OUT 0x3D,R28
0036 BFDE OUT 0x3E,R29
0037 51C0 SUBI R28,0x10
0038 40D0 SBCI R29,0
0039 EA0A LDI R16,0xAA
003A 8308 STD Y+0,R16
003B 2400 CLR R0
003C E6E0 LDI R30,0x60
003D E0F0 LDI R31,0
003E E010 LDI R17,0
003F 36E1 CPI R30,0x61
0040 07F1 CPC R31,R17
0041 F011 BEQ 0x0044
0042 9201 ST R0,Z+
0043 CFFB RJMP 0x003F
0044 8300 STD Z+0,R16
0045 E6E5 LDI R30,0x65
0046 E0F0 LDI R31,0
0047 E6A0 LDI R26,0x60
0048 E0B0 LDI R27,0
0049 E010 LDI R17,0
004A 36E5 CPI R30,0x65
004B 07F1 CPC R31,R17
004C F021 BEQ 0x0051
004D 95C8 LPM
004E 9631 ADIW R30,1
004F 920D ST R0,X+
0050 CFF9 RJMP 0x004A
0051 940E009A CALL _main
_exit:
0053 CFFF RJMP _exit
FILE: E:\avr\2.2.3\main.c
(0001) // ICC-AVR application builder : 2007-5-28 22:03:35
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 连接:接好电源和晶振的跳线
(0005) // 7断数码管的ABCD接VCC,a~dp接PA0~PA7
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008)
(0009) const unsigned char seg7_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0~F and "shut"
(0010) volatile unsigned char i; //在中断中会变化的变量,加volatile限定词定义
(0011)
(0012) void port_init(void)
(0013) {
(0014) PORTA = 0x00;
_port_init:
0054 2422 CLR R2
0055 BA2B OUT 0x1B,R2
(0015) DDRA = 0xFF;
0056 EF8F LDI R24,0xFF
0057 BB8A OUT 0x1A,R24
(0016) PORTB = 0x00;
0058 BA28 OUT 0x18,R2
(0017) DDRB = 0x00;
0059 BA27 OUT 0x17,R2
(0018) PORTC = 0x00; //m103 output only
005A BA25 OUT 0x15,R2
(0019) DDRC = 0x00;
005B BA24 OUT 0x14,R2
(0020) PORTD = 0x00;
005C BA22 OUT 0x12,R2
(0021) DDRD = 0x00;
005D BA21 OUT 0x11,R2
005E 9508 RET
(0022) }
(0023)
(0024) //TIMER1 initialize - prescale:256
(0025) // WGM: 0) Normal, TOP=0xFFFF
(0026) // desired value: 1Sec
(0027) // actual value: 1.000Sec (0.0%)
(0028) void timer1_init(void)
(0029) {
(0030) TCCR1B = 0x00; //stop
_timer1_init:
005F 2422 CLR R2
0060 BC2E OUT 0x2E,R2
(0031) TCNT1H = 0x8F; //setup
0061 E88F LDI R24,0x8F
0062 BD8D OUT 0x2D,R24
(0032) TCNT1L = 0x81;
0063 E881 LDI R24,0x81
0064 BD8C OUT 0x2C,R24
(0033) OCR1AH = 0x70;
0065 E780 LDI R24,0x70
0066 BD8B OUT 0x2B,R24
(0034) OCR1AL = 0x7F;
0067 E78F LDI R24,0x7F
0068 BD8A OUT 0x2A,R24
(0035) OCR1BH = 0x70;
0069 E780 LDI R24,0x70
006A BD89 OUT 0x29,R24
(0036) OCR1BL = 0x7F;
006B E78F LDI R24,0x7F
006C BD88 OUT 0x28,R24
(0037) ICR1H = 0x70;
006D E780 LDI R24,0x70
006E BD87 OUT 0x27,R24
(0038) ICR1L = 0x7F;
006F E78F LDI R24,0x7F
0070 BD86 OUT 0x26,R24
(0039) TCCR1A = 0x00;
0071 BC2F OUT 0x2F,R2
(0040) TCCR1B = 0x04; //start Timer
0072 E084 LDI R24,4
0073 BD8E OUT 0x2E,R24
0074 9508 RET
_timer1_ovf_isr:
0075 922A ST R2,-Y
0076 938A ST R24,-Y
0077 939A ST R25,-Y
0078 B62F IN R2,0x3F
0079 922A ST R2,-Y
(0041) }
(0042)
(0043) #pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
(0044) void timer1_ovf_isr(void)
(0045) {
(0046) //TIMER1 has overflowed
(0047) TCNT1H = 0x8F; //reload counter high value
007A E88F LDI R24,0x8F
007B BD8D OUT 0x2D,R24
(0048) TCNT1L = 0x81; //reload counter low value
007C E881 LDI R24,0x81
007D BD8C OUT 0x2C,R24
(0049) i++; //在文件开始的定义,volatile unsigned char i;
007E 91800060 LDS R24,i
0080 5F8F SUBI R24,0xFF
0081 93800060 STS i,R24
(0050) if(i==10) i=0;
0083 91800060 LDS R24,i
0085 308A CPI R24,0xA
0086 F419 BNE 0x008A
0087 2422 CLR R2
0088 92200060 STS i,R2
008A 9029 LD R2,Y+
008B BE2F OUT 0x3F,R2
008C 9199 LD R25,Y+
008D 9189 LD R24,Y+
008E 9029 LD R2,Y+
008F 9518 RETI
(0051) }
(0052)
(0053) //call this routine to initialize all peripherals
(0054) void init_devices(void)
(0055) {
(0056) //stop errant interrupts until set up
(0057) CLI(); //disable all interrupts
_init_devices:
0090 94F8 BCLR 7
(0058) port_init();
0091 DFC2 RCALL _port_init
(0059) timer1_init();
0092 DFCC RCALL _timer1_init
(0060)
(0061) MCUCR = 0x00;
0093 2422 CLR R2
0094 BE25 OUT 0x35,R2
(0062) GICR = 0x00;
0095 BE2B OUT 0x3B,R2
(0063) TIMSK = 0x04; //timer interrupt sources ,这里允许了timer1溢出中断。
0096 E084 LDI R24,4
0097 BF89 OUT 0x39,R24
(0064) SEI(); //re-enable interrupts
0098 9478 BSET 7
0099 9508 RET
(0065) //all peripherals are now initialized
(0066) }
(0067)
(0068) void main(void)
(0069) {
(0070) init_devices(); //初始化,包含了定时器的初始化
_main:
009A DFF5 RCALL _init_devices
009B C009 RJMP 0x00A5
(0071) while(1)
(0072) {
(0073) PORTA=seg7_data[i]; //一直刷新显示计时
FILE: <library>
009C E584 LDI R24,0x54
009D E090 LDI R25,0
009E 91E00060 LDS R30,i
00A0 27FF CLR R31
00A1 0FE8 ADD R30,R24
00A2 1FF9 ADC R31,R25
00A3 91E4 LPM R30,0(Z)
00A4 BBEB OUT 0x1B,R30
00A5 CFF6 RJMP 0x009C
00A6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -