📄 中断按键.s
字号:
.module _中断按键.c
.area data(ram, con, rel)
_LED_data::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键/数码管.h
.dbsym e LED_data _LED_data A[10:10]c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键/数码管.h
.dbfunc e LED_init _LED_init fV
.even
_LED_init::
.dbline -1
.dbline 18
; //内部晶振 8M
; //包含所需头文件
; #include <ioM16v.h>
; #include <macros.h>
; #include"数码管.h"
; #include"delay.h"
;
;
;
; /*------宏定义------*/
; #define uchar unsigned char
; #define uint unsigned int
;
; /*********标志位************************************************/
; #define start 0x0;
; #define stop 0x1;
; //----------函数申明-------------------------
; /***************************************************************/
.dbline 19
; //void LED_init(void); //LED初始化
ldi R24,255
out 0x1a,R24
.dbline 20
; //void show_LED(uchar data1,uchar data2,uchar data3,uchar data4); //LED显示
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 21
; //void LED_run(void) ;
clr R2
out 0x1b,R2
.dbline 22
; /****************************************************************/
in R2,0x18
out 0x18,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e show_LED _show_LED fV
; data4 -> y+6
; data3 -> y+4
; data2 -> R20
; data1 -> R22
.even
_show_LED::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 25
; /*********标志位************************************************/
; uchar LED_ret;
;
.dbline 26
; uchar a,b, c,d;//全局变量定义
ldi R24,<_LED_data
ldi R25,>_LED_data
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 27
;
ldi R24,247
out 0x18,R24
.dbline 28
; //端口初始化
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 30
; void port_init(void)
; {
ldi R24,<_LED_data
ldi R25,>_LED_data
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 31
; PORTA = 0x00;//设置A口置1
ldi R24,251
out 0x18,R24
.dbline 32
; DDRA = 0x00;//设置A口输入
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 34
; PORTB = 0x00;
; DDRB = 0x00;
ldi R24,<_LED_data
ldi R25,>_LED_data
ldd R30,y+4
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 35
; PORTC = 0x00;
ldi R24,253
out 0x18,R24
.dbline 36
; DDRC = 0x00;
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 38
; PORTD = 0x0c;
; DDRD = 0x00;
ldi R24,<_LED_data
ldi R25,>_LED_data
ldd R30,y+6
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 39
; }
ldi R24,254
out 0x18,R24
.dbline 40
;
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline -2
L2:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l data4 6 c
.dbsym l data3 4 c
.dbsym r data2 20 c
.dbsym r data1 22 c
.dbend
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键/delay.h
.dbfunc e DelayUS _DelayUS fV
; time -> R16,R17
.even
_DelayUS::
.dbline -1
.dbline 9
xjmp L5
L4:
.dbline 11
subi R16,1
sbci R17,0
L5:
.dbline 10
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L4
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e DelayMS _DelayMS fV
; i -> R20,R21
; time -> R16,R17
.even
_DelayMS::
xcall push_gset1
.dbline -1
.dbline 20
xjmp L9
L8:
.dbline 23
.dbline 24
ldi R20,1
ldi R21,0
xjmp L14
L11:
.dbline 25
L12:
.dbline 24
subi R20,255 ; offset = 1
sbci R21,255
L14:
.dbline 24
cpi R20,118
ldi R30,4
cpc R21,R30
brlo L11
.dbline 26
L9:
.dbline 22
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L8
tst R3
brne L8
X0:
.dbline -2
L7:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r time 16 i
.dbend
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\中断按键.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 30
.dbline 31
clr R2
out 0x1b,R2
.dbline 32
out 0x1a,R2
.dbline 33
out 0x18,R2
.dbline 34
out 0x17,R2
.dbline 35
out 0x15,R2
.dbline 36
out 0x14,R2
.dbline 37
ldi R24,12
out 0x12,R24
.dbline 38
out 0x11,R2
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e int_init _int_init fV
.even
_int_init::
.dbline -1
.dbline 44
;
; //外中断初始化
; void int_init(void)
; {
.dbline 45
; MCUCR |= 0x0a;//INT0、INT1下降沿触发中断
in R24,0x35
ori R24,10
out 0x35,R24
.dbline 46
; MCUCSR|= 0x00;//关闭INT2
in R2,0x34
out 0x34,R2
.dbline 47
; GICR |= 0xC0;//INT0、INT1中断使能
in R24,0x3b
ori R24,192
out 0x3b,R24
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\中断按键.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R24
in R24,0x3f
st -y,R24
.dbline -1
.dbline 56
; }
;
;
;
;
; //外中断0服务程序
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
.dbline 58
; //外中断0
; LED_ret=stop;
ldi R24,1
sts _LED_ret,R24
.dbline 58
.dbline -2
L17:
ld R24,y+
out 0x3f,R24
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 8
jmp _int1_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\中断按键.c
.dbfunc e int1_isr _int1_isr fV
.even
_int1_isr::
st -y,R2
in R2,0x3f
st -y,R2
.dbline -1
.dbline 65
; }
;
;
; //外中断1服务程序
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void)
; {
.dbline 67
; //外中断1
; LED_ret=start;
clr R2
sts _LED_ret,R2
.dbline 67
.dbline -2
L18:
ld R2,y+
out 0x3f,R2
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e LED_run _LED_run fV
.even
_LED_run::
.dbline -1
.dbline 70
; }
; void LED_run(void)
; {
.dbline 71
; d++;//个位相加
lds R24,_d
subi R24,255 ; addi 1
sts _d,R24
.dbline 72
; DelayMS(1);
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 73
; if(d==10)
lds R24,_d
cpi R24,10
brne L20
.dbline 74
; {
.dbline 75
; d=0;
clr R2
sts _d,R2
.dbline 76
; c++;//十位相加
lds R24,_c
subi R24,255 ; addi 1
sts _c,R24
.dbline 77
; DelayMS(1);
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 78
; if(c==10)
lds R24,_c
cpi R24,10
brne L22
.dbline 79
; {
.dbline 80
; c=0;
clr R2
sts _c,R2
.dbline 81
; b++;//百位相加
lds R24,_b
subi R24,255 ; addi 1
sts _b,R24
.dbline 82
; DelayMS(1);
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 83
; if(b==10)
lds R24,_b
cpi R24,10
brne L24
.dbline 84
; {
.dbline 85
; b=0;
clr R2
sts _b,R2
.dbline 86
; a++;//千位相加
lds R24,_a
subi R24,255 ; addi 1
sts _a,R24
.dbline 87
; DelayMS(1);
ldi R16,1
ldi R17,0
xcall _DelayMS
.dbline 88
; if(a==10)
lds R24,_a
cpi R24,10
brne L26
.dbline 89
; a=0;
clr R2
sts _a,R2
L26:
.dbline 90
; }
L24:
.dbline 91
; }
L22:
.dbline 92
L20:
.dbline -2
L19:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 96
; }
; }
;
; void init_devices(void)
; {
.dbline 97
; CLI(); //禁止所有中断
cli
.dbline 98
; MCUCR = 0x00;///触发中断方式
clr R2
out 0x35,R2
.dbline 99
; MCUCSR = 0x80;//禁止JTAG
ldi R24,128
out 0x34,R24
.dbline 100
; GICR = 0x00;//中断使能
out 0x3b,R2
.dbline 101
; port_init();
xcall _port_init
.dbline 102
; int_init();
xcall _int_init
.dbline 103
; LED_init();
xcall _LED_init
.dbline 104
; SEI();//开全局中断
sei
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
sbiw R28,3
.dbline -1
.dbline 108
; }
; //主函数
; void main(void)
; {
.dbline 109
; init_devices();//初始化端口、中断
xcall _init_devices
xjmp L31
L30:
.dbline 112
; //在这继续添加你的代码
; while(1)
; {
.dbline 113
; show_LED(d,c,b,a);//显示数字
lds R2,_a
std y+2,R2
lds R2,_b
std y+0,R2
lds R18,_c
lds R16,_d
xcall _show_LED
.dbline 114
; if(LED_ret==0)//判断中断按键
lds R2,_LED_ret
tst R2
brne L33
.dbline 115
; LED_run();//数字累加
xcall _LED_run
L33:
.dbline 116
L31:
.dbline 111
xjmp L30
X1:
.dbline -2
L29:
adiw R28,3
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\中断按键.c
_d::
.blkb 1
.dbsym e d _d c
_c::
.blkb 1
.dbsym e c _c c
_b::
.blkb 1
.dbsym e b _b c
_a::
.blkb 1
.dbsym e a _a c
_LED_ret::
.blkb 1
.dbsym e LED_ret _LED_ret c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -