外部中断.lst
来自「ICC mega8例子」· LST 代码 · 共 373 行
LST
373 行
__text_start:
__start:
1C E5CF LDI R28,0x5F
1D E0D4 LDI R29,4
1E BFCD OUT 0x3D,R28
1F BFDE OUT 0x3E,R29
20 51CE SUBI R28,0x1E
21 40D0 SBCI R29,0
22 EA0A LDI R16,0xAA
23 8308 STD Y+0,R16
24 2400 CLR R0
25 E6E1 LDI R30,0x61
26 E0F0 LDI R31,0
27 E010 LDI R17,0
28 36E1 CPI R30,0x61
29 07F1 CPC R31,R17
2A F011 BEQ 0x002D
2B 9201 ST R0,Z+
2C CFFB RJMP 0x0028
2D 8300 STD Z+0,R16
2E E3E6 LDI R30,0x36
2F E0F0 LDI R31,0
30 E6A0 LDI R26,0x60
31 E0B0 LDI R27,0
32 E010 LDI R17,0
33 E000 LDI R16,0
34 BF0B OUT 0x3B,R16
35 33E7 CPI R30,0x37
36 07F1 CPC R31,R17
37 F021 BEQ 0x003C
38 95C8 LPM
39 9631 ADIW R30,1
3A 920D ST R0,X+
3B CFF9 RJMP 0x0035
3C D07E RCALL _main
_exit:
3D CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\mega8_C语言常用程序\ICCAVR_mega8_外部中断\外部中断.c
(0001) //ICC-AVR application builder : 2009-3-10 17:06:48
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) unsigned char i=0;
(0008)
(0009) void port_init(void)
(0010) {
(0011) PORTB = 0x00;
_port_init:
3E 2422 CLR R2
3F BA28 OUT 0x18,R2
(0012) DDRB = 0x00;
40 BA27 OUT 0x17,R2
(0013) PORTC = 0x00; //m103 output only
41 BA25 OUT 0x15,R2
(0014) DDRC = 0x00;
42 BA24 OUT 0x14,R2
(0015) PORTD = 0x00;
43 BA22 OUT 0x12,R2
(0016) DDRD = 0x00;
44 BA21 OUT 0x11,R2
45 9508 RET
(0017) }
(0018)
(0019) //call this routine to initialize all peripherals
(0020) void init_devices(void)
(0021) {
(0022) //stop errant interrupts until set up
(0023) CLI(); //disable all interrupts
_init_devices:
46 94F8 BCLR 7
(0024) port_init();
47 DFF6 RCALL _port_init
(0025)
(0026) MCUCR = 0x00;
48 2422 CLR R2
49 BE25 OUT 0x35,R2
(0027) GICR = 0x00;
4A BE2B OUT 0x3B,R2
(0028) TIMSK = 0x00; //timer interrupt sources
4B BE29 OUT 0x39,R2
(0029) SEI(); //re-enable interrupts
4C 9478 BSET 7
4D 9508 RET
(0030) //all peripherals are now initialized
(0031) }
(0032)
(0033) /************************************
(0034) 用 途:微秒级延时程序
(0035) Taget :mega8
(0036) crystal :8M
(0037) 介 绍:在8M的晶振上进行us级的延时
(0038) 入口参数:
(0039) *************************************/
(0040) void delay_us(int time)
(0041) {
(0042) do
(0043) {
(0044) time--;
_delay_us:
time --> R16
4E 5001 SUBI R16,1
4F 4010 SBCI R17,0
(0045) }
(0046) while (time > 1);
50 E081 LDI R24,1
51 E090 LDI R25,0
52 1780 CP R24,R16
53 0791 CPC R25,R17
54 F3CC BLT 0x004E
55 9508 RET
_show_2_digit:
i --> Y,+1
digi --> R10
56 92AA ST R10,-Y
57 2EA0 MOV R10,R16
(0047) }
(0048)
(0049)
(0050) /************************************
(0051) 用 途:两位数码管显示一个数
(0052) Taget :mega8
(0053) crystal :8M
(0054) 介 绍:共阳数码管
(0055) 1-PC1(片选)
(0056) 2-PC0
(0057) -----
(0058) a-PB0(数据)
(0059) b-PB1
(0060) ...
(0061) h-PB6
(0062) DP-PB7
(0063) 入口参数:要显示的数,十进制表示
(0064) *************************************/
(0065) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0066) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0067) void show_2_digit(unsigned char digi)
(0068) {
(0069) unsigned char i;
(0070) DDRC=0xff;
58 EF8F LDI R24,0xFF
59 BB84 OUT 0x14,R24
(0071) DDRB=0xff;
5A BB87 OUT 0x17,R24
(0072) PORTC=0;//关片选
5B 2422 CLR R2
5C BA25 OUT 0x15,R2
(0073) PORTB=~num[(unsigned char )(digi/10)];//显示十位
5D E02A LDI R18,0xA
5E E030 LDI R19,0
5F 2D0A MOV R16,R10
60 2711 CLR R17
61 D066 RCALL div16s
62 2FE0 MOV R30,R16
63 27FF CLR R31
64 E286 LDI R24,0x26
65 E090 LDI R25,0
66 0FE8 ADD R30,R24
67 1FF9 ADC R31,R25
68 9024 LPM R2,0(Z)
69 9420 COM R2
6A BA28 OUT 0x18,R2
(0074) PORTC=(0x1<<1);//开十位的显示
6B E082 LDI R24,2
6C BB85 OUT 0x15,R24
(0075) delay_us(200);
6D EC08 LDI R16,0xC8
6E E010 LDI R17,0
6F DFDE RCALL _delay_us
(0076) PORTC=0;//关显示
70 2422 CLR R2
71 BA25 OUT 0x15,R2
(0077) PORTB=~num[(unsigned char )(digi%10)];//显示个位
72 E02A LDI R18,0xA
73 E030 LDI R19,0
74 2D0A MOV R16,R10
75 2711 CLR R17
76 D04D RCALL mod16s
77 2FE0 MOV R30,R16
78 27FF CLR R31
79 E286 LDI R24,0x26
7A E090 LDI R25,0
7B 0FE8 ADD R30,R24
7C 1FF9 ADC R31,R25
7D 9024 LPM R2,0(Z)
7E 9420 COM R2
7F BA28 OUT 0x18,R2
(0078) PORTC=(0x1<<0);//开个位的显示
80 E081 LDI R24,1
81 BB85 OUT 0x15,R24
(0079) delay_us(200);
82 EC08 LDI R16,0xC8
83 E010 LDI R17,0
84 DFC9 RCALL _delay_us
(0080) PORTC=0x0;//关显示
85 2422 CLR R2
86 BA25 OUT 0x15,R2
87 90A9 LD R10,Y+
88 9508 RET
(0081) }
(0082)
(0083) /************************************
(0084) 用 途:打开外部中断
(0085) 介 绍:
(0086) 入口参数:
(0087) 出口参数:
(0088) *************************************/
(0089) void int_init()
(0090) {
(0091) CLI();
_int_init:
89 94F8 BCLR 7
(0092) PORTD|=(1<<PD2)|(1<<PD3);
8A B382 IN R24,0x12
8B 608C ORI R24,0xC
8C BB82 OUT 0x12,R24
(0093) MCUCR|=(1<<ISC11)|(1<<ISC01);//3-0,外部中断定1,0的控制方式
8D B785 IN R24,0x35
8E 608A ORI R24,0xA
8F BF85 OUT 0x35,R24
(0094) //MCUCR=3-2,0是低电平中断,1是下(降沿)和上(升沿)中断,2是下中断,3是上中断
(0095) GICR|=(1<<INT0)|(1<<INT1);//7,6外部中断1,0使能
90 B78B IN R24,0x3B
91 6C80 ORI R24,0xC0
92 BF8B OUT 0x3B,R24
(0096) SEI();
93 9478 BSET 7
94 9508 RET
_init_0:
95 938A ST R24,-Y
96 B78F IN R24,0x3F
97 938A ST R24,-Y
(0097) }
(0098)
(0099) /************************************
(0100) 用 途:中断0服务子程序
(0101) 介 绍:
(0102) 入口参数:
(0103) 出口参数:
(0104) *************************************/
(0105) #pragma interrupt_handler init_0:2
(0106) void init_0()
(0107) {
(0108) i--;
98 9180 0060 LDS R24,i
9A 5081 SUBI R24,1
9B 9380 0060 STS i,R24
(0109) if (i==0)i=99;
9D 2388 TST R24
9E F419 BNE 0x00A2
9F E683 LDI R24,0x63
A0 9380 0060 STS i,R24
A2 9189 LD R24,Y+
A3 BF8F OUT 0x3F,R24
A4 9189 LD R24,Y+
A5 9518 RETI
_init_1:
A6 922A ST R2,-Y
A7 938A ST R24,-Y
A8 939A ST R25,-Y
A9 B62F IN R2,0x3F
AA 922A ST R2,-Y
(0110) }
(0111)
(0112) /************************************
(0113) 用 途:中断1服务子程序
(0114) 介 绍:
(0115) 入口参数:
(0116) 出口参数:
(0117) *************************************/
(0118) #pragma interrupt_handler init_1:3
(0119) void init_1()
(0120) {
(0121) i++;
AB 9180 0060 LDS R24,i
AD 5F8F SUBI R24,0xFF
AE 9380 0060 STS i,R24
(0122) if (i==100)i=0;
B0 3684 CPI R24,0x64
B1 F419 BNE 0x00B5
B2 2422 CLR R2
B3 9220 0060 STS i,R2
B5 9029 LD R2,Y+
B6 BE2F OUT 0x3F,R2
B7 9199 LD R25,Y+
B8 9189 LD R24,Y+
B9 9029 LD R2,Y+
BA 9518 RETI
(0123) }
(0124)
(0125) void main()
(0126) {
(0127) port_init();
_main:
BB DF82 RCALL _port_init
(0128) init_devices();
BC DF89 RCALL _init_devices
(0129)
(0130) int_init();//中断初始化
BD DFCB RCALL _int_init
BE C003 RJMP 0x00C2
(0131) while(1)
(0132) {
(0133) show_2_digit(i);
FILE: <library>
BF 9100 0060 LDS R16,i
C1 DF94 RCALL _show_2_digit
C2 CFFC RJMP 0x00BF
C3 9508 RET
mod16s:
C4 9468 BSET 6
C5 92DA ST R13,-Y
C6 2ED1 MOV R13,R17
C7 C004 RJMP 0x00CC
div16s:
C8 94E8 BCLR 6
C9 92DA ST R13,-Y
CA 2ED1 MOV R13,R17
CB 26D3 EOR R13,R19
CC FF17 SBRS R17,7
CD C004 RJMP 0x00D2
CE 9510 COM R17
CF 9500 COM R16
D0 5F0F SUBI R16,0xFF
D1 4F1F SBCI R17,0xFF
D2 FF37 SBRS R19,7
D3 C004 RJMP 0x00D8
D4 9530 COM R19
D5 9520 COM R18
D6 5F2F SUBI R18,0xFF
D7 4F3F SBCI R19,0xFF
D8 D00B RCALL xdiv16u
D9 FED7 SBRS R13,7
DA C004 RJMP 0x00DF
DB 9510 COM R17
DC 9500 COM R16
DD 5F0F SUBI R16,0xFF
DE 4F1F SBCI R17,0xFF
DF 90D9 LD R13,Y+
E0 9508 RET
mod16u:
E1 9468 BSET 6
E2 C001 RJMP xdiv16u
div16u:
E3 94E8 BCLR 6
xdiv16u:
E4 92EA ST R14,-Y
E5 92FA ST R15,-Y
E6 938A ST R24,-Y
E7 24EE CLR R14
E8 24FF CLR R15
E9 E180 LDI R24,0x10
EA 0F00 LSL R16
EB 1F11 ROL R17
EC 1CEE ROL R14
ED 1CFF ROL R15
EE 16E2 CP R14,R18
EF 06F3 CPC R15,R19
F0 F018 BCS 0x00F4
F1 1AE2 SUB R14,R18
F2 0AF3 SBC R15,R19
F3 9503 INC R16
F4 958A DEC R24
F5 F7A1 BNE 0x00EA
F6 F416 BRTC 0x00F9
F7 2D0E MOV R16,R14
F8 2D1F MOV R17,R15
F9 9189 LD R24,Y+
FA 90F9 LD R15,Y+
FB 90E9 LD R14,Y+
FC 9508 RET
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?