📄 int_2.s
字号:
.area vector(rom, abs)
.org 72
jmp _ext_int2_isr
.module int_2.c
.area text(rom, con, rel)
.dbfile D:\16实验程序\外部中断\int_2.c
.area vector(rom, abs)
.area text(rom, con, rel)
.dbfile D:\16实验程序\外部中断\int_2.c
.dbfunc e s_ms _s_ms fI
; ms -> R16,R17
.even
_s_ms::
.dbline -1
.dbline 12
; //外部中断程序
; //使用外部中断INT2
; //按键9,0,a,b输入,led显示
; #include <iom16v.h>
; #pragma interrupt_handler ext_int2_isr:19
; //指定外部中断函数
; #define uint unsigned int
; #define uchar unsigned char
;
;
; s_ms(uint ms)
; {
.dbline 13
; for(;ms>1;ms--);
xjmp L5
L2:
.dbline 13
L3:
.dbline 13
subi R16,1
sbci R17,0
L5:
.dbline 13
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r ms 16 i
.dbend
.area data(ram, con, rel)
.dbfile D:\16实验程序\外部中断\int_2.c
_i::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile D:\16实验程序\外部中断\int_2.c
.dbsym e i _i c
.area text(rom, con, rel)
.dbfile D:\16实验程序\外部中断\int_2.c
.dbfunc e ext_int2_isr _ext_int2_isr fV
; aa -> R20
.even
_ext_int2_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_xgsetF000
.dbline -1
.dbline 19
; }
;
; unsigned char i=1;
; // External Interrupt 0 service routine
; void ext_int2_isr(void)
; {
.dbline 20
; uchar aa=1;
ldi R20,1
.dbline 21
; PORTD=~i++;
lds R2,_i
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _i,R24
com R2
out 0x12,R2
xjmp L8
L7:
.dbline 23
; while(aa) //判断端口是否恢复高电平,有延时抗干扰
; {
.dbline 24
; aa=!(PINB&(1<<2));
sbic 0x16,2
rjmp L10
X1:
ldi R22,1
ldi R23,0
xjmp L11
L10:
clr R22
clr R23
L11:
mov R20,R22
.dbline 25
; if(aa==0)
tst R22
brne L12
X2:
.dbline 26
; {
.dbline 27
; s_ms(15000);
ldi R16,15000
ldi R17,58
xcall _s_ms
.dbline 28
; aa=!(PINB&(1<<2));
sbic 0x16,2
rjmp L14
X3:
ldi R22,1
ldi R23,0
xjmp L15
L14:
clr R22
clr R23
L15:
mov R20,R22
.dbline 29
; }
L12:
.dbline 30
; }
L8:
.dbline 22
tst R20
brne L7
X4:
.dbline -2
L6:
.dbline 0 ; func end
xcall pop_xgsetF000
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r aa 20 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 35
; }
;
;
; void main(void)
; {
.dbline 36
; DDRD=0xff;
ldi R24,255
out 0x11,R24
.dbline 37
; PORTD=0XFF;
out 0x12,R24
.dbline 38
; DDRB=0xf0;
ldi R24,240
out 0x17,R24
.dbline 39
; PORTB=0x0f;
ldi R24,15
out 0x18,R24
.dbline 41
;
; SREG=0x80; //开全局中断
ldi R24,128
out 0x3f,R24
.dbline 43
;
; GICR=0x20; //开外部中断int_2,对应按键K9,K0,KA,KB
ldi R24,32
out 0x3b,R24
L17:
.dbline 44
; while (1);
L18:
.dbline 44
xjmp L17
X5:
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -