📄 中断按键.lst
字号:
__text_start:
__start:
002F E5CF LDI R28,0x5F
0030 E0D4 LDI R29,4
0031 BFCD OUT 0x3D,R28
0032 BFDE OUT 0x3E,R29
0033 51C0 SUBI R28,0x10
0034 40D0 SBCI R29,0
0035 EA0A LDI R16,0xAA
0036 8308 STD Y+0,R16
0037 2400 CLR R0
0038 E6EA LDI R30,0x6A
0039 E0F0 LDI R31,0
003A E010 LDI R17,0
003B 36EF CPI R30,0x6F
003C 07F1 CPC R31,R17
003D F011 BEQ 0x0040
003E 9201 ST R0,Z+
003F CFFB RJMP 0x003B
0040 8300 STD Z+0,R16
0041 E5E4 LDI R30,0x54
0042 E0F0 LDI R31,0
0043 E6A0 LDI R26,0x60
0044 E0B0 LDI R27,0
0045 E010 LDI R17,0
0046 35EE CPI R30,0x5E
0047 07F1 CPC R31,R17
0048 F021 BEQ 0x004D
0049 95C8 LPM
004A 9631 ADIW R30,1
004B 920D ST R0,X+
004C CFF9 RJMP 0x0046
004D 940E0124 CALL _main
_exit:
004F CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\数码管.h
(0001) //包含所需头文件
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004)
(0005)
(0006)
(0007)
(0008) /*------宏定义------*/
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011)
(0012) uchar LED_data[10]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,
(0013) /*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/};
(0014)
(0015)
(0016)
(0017) void LED_init(void)
(0018) {
(0019) DDRA=0xff;
_LED_init:
0050 EF8F LDI R24,0xFF
0051 BB8A OUT 0x1A,R24
(0020) DDRB|=0xff;
0052 B387 IN R24,0x17
0053 6F8F ORI R24,0xFF
0054 BB87 OUT 0x17,R24
(0021) PORTA=0x00;
0055 2422 CLR R2
0056 BA2B OUT 0x1B,R2
(0022) PORTB|=0x00;
0057 B228 IN R2,0x18
0058 BA28 OUT 0x18,R2
0059 9508 RET
_show_LED:
data4 --> Y+6
data3 --> Y+4
data2 --> R20
data1 --> R22
005A 940E0143 CALL push_gset2
005C 2F42 MOV R20,R18
005D 2F60 MOV R22,R16
(0023) }
(0024) void show_LED(uchar data1,uchar data2,uchar data3,uchar data4)
(0025) {
(0026) PORTA=LED_data[data1];
005E E680 LDI R24,0x60
005F E090 LDI R25,0
0060 2FE6 MOV R30,R22
0061 27FF CLR R31
0062 0FE8 ADD R30,R24
0063 1FF9 ADC R31,R25
0064 8020 LDD R2,Z+0
0065 BA2B OUT 0x1B,R2
(0027) PORTB=0xf7;
0066 EF87 LDI R24,0xF7
0067 BB88 OUT 0x18,R24
(0028) DelayMS(1);
0068 E001 LDI R16,1
0069 E010 LDI R17,0
006A D033 RCALL _DelayMS
(0029)
(0030) PORTA=LED_data[data2];
006B E680 LDI R24,0x60
006C E090 LDI R25,0
006D 2FE4 MOV R30,R20
006E 27FF CLR R31
006F 0FE8 ADD R30,R24
0070 1FF9 ADC R31,R25
0071 8020 LDD R2,Z+0
0072 BA2B OUT 0x1B,R2
(0031) PORTB=0xfb;
0073 EF8B LDI R24,0xFB
0074 BB88 OUT 0x18,R24
(0032) DelayMS(1);
0075 E001 LDI R16,1
0076 E010 LDI R17,0
0077 D026 RCALL _DelayMS
(0033)
(0034) PORTA=LED_data[data3];
0078 E680 LDI R24,0x60
0079 E090 LDI R25,0
007A 81EC LDD R30,Y+4
007B 27FF CLR R31
007C 0FE8 ADD R30,R24
007D 1FF9 ADC R31,R25
007E 8020 LDD R2,Z+0
007F BA2B OUT 0x1B,R2
(0035) PORTB=0xfd;
0080 EF8D LDI R24,0xFD
0081 BB88 OUT 0x18,R24
(0036) DelayMS(1);
0082 E001 LDI R16,1
0083 E010 LDI R17,0
0084 D019 RCALL _DelayMS
(0037)
(0038) PORTA=LED_data[data4];
0085 E680 LDI R24,0x60
0086 E090 LDI R25,0
0087 81EE LDD R30,Y+6
0088 27FF CLR R31
0089 0FE8 ADD R30,R24
008A 1FF9 ADC R31,R25
008B 8020 LDD R2,Z+0
008C BA2B OUT 0x1B,R2
(0039) PORTB=0xfe;
008D EF8E LDI R24,0xFE
008E BB88 OUT 0x18,R24
(0040) DelayMS(1);
008F E001 LDI R16,1
0090 E010 LDI R17,0
0091 D00C RCALL _DelayMS
0092 940E013A CALL pop_gset2
0094 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
0095 C002 RJMP 0x0098
(0010) while(time>1)
(0011) time--;
0096 5001 SUBI R16,1
0097 4010 SBCI R17,0
0098 E081 LDI R24,1
0099 E090 LDI R25,0
009A 1780 CP R24,R16
009B 0791 CPC R25,R17
009C F3C8 BCS 0x0096
009D 9508 RET
_DelayMS:
i --> R20
time --> R16
009E 940E0145 CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
00A0 C009 RJMP 0x00AA
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
00A1 E041 LDI R20,1
00A2 E050 LDI R21,0
00A3 C002 RJMP 0x00A6
00A4 5F4F SUBI R20,0xFF
00A5 4F5F SBCI R21,0xFF
00A6 3746 CPI R20,0x76
00A7 E0E4 LDI R30,4
00A8 075E CPC R21,R30
00A9 F3D0 BCS 0x00A4
00AA 0118 MOVW R2,R16
00AB 5001 SUBI R16,1
00AC 4010 SBCI R17,0
00AD 2022 TST R2
00AE F791 BNE 0x00A1
00AF 2033 TST R3
00B0 F781 BNE 0x00A1
00B1 940E0148 CALL pop_gset1
00B3 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\中断按键.c
(0001) //内部晶振 8M
(0002) //包含所需头文件
(0003) #include <ioM16v.h>
(0004) #include <macros.h>
(0005) #include"数码管.h"
(0006) #include"delay.h"
(0007)
(0008)
(0009)
(0010) /*------宏定义------*/
(0011) #define uchar unsigned char
(0012) #define uint unsigned int
(0013)
(0014) /*********标志位************************************************/
(0015) #define start 0x0;
(0016) #define stop 0x1;
(0017) //----------函数申明-------------------------
(0018) /***************************************************************/
(0019) //void LED_init(void); //LED初始化
(0020) //void show_LED(uchar data1,uchar data2,uchar data3,uchar data4); //LED显示
(0021) //void LED_run(void) ;
(0022) /****************************************************************/
(0023) /*********标志位************************************************/
(0024) uchar LED_ret;
(0025)
(0026) uchar a,b, c,d;//全局变量定义
(0027)
(0028) //端口初始化
(0029) void port_init(void)
(0030) {
(0031) PORTA = 0x00;//设置A口置1
_port_init:
00B4 2422 CLR R2
00B5 BA2B OUT 0x1B,R2
(0032) DDRA = 0x00;//设置A口输入
00B6 BA2A OUT 0x1A,R2
(0033) PORTB = 0x00;
00B7 BA28 OUT 0x18,R2
(0034) DDRB = 0x00;
00B8 BA27 OUT 0x17,R2
(0035) PORTC = 0x00;
00B9 BA25 OUT 0x15,R2
(0036) DDRC = 0x00;
00BA BA24 OUT 0x14,R2
(0037) PORTD = 0x0c;
00BB E08C LDI R24,0xC
00BC BB82 OUT 0x12,R24
(0038) DDRD = 0x00;
00BD BA21 OUT 0x11,R2
00BE 9508 RET
(0039) }
(0040)
(0041)
(0042) //外中断初始化
(0043) void int_init(void)
(0044) {
(0045) MCUCR |= 0x0a;//INT0、INT1下降沿触发中断
_int_init:
00BF B785 IN R24,0x35
00C0 608A ORI R24,0xA
00C1 BF85 OUT 0x35,R24
(0046) MCUCSR|= 0x00;//关闭INT2
00C2 B624 IN R2,0x34
00C3 BE24 OUT 0x34,R2
(0047) GICR |= 0xC0;//INT0、INT1中断使能
00C4 B78B IN R24,0x3B
00C5 6C80 ORI R24,0xC0
00C6 BF8B OUT 0x3B,R24
00C7 9508 RET
_int0_isr:
00C8 938A ST R24,-Y
00C9 B78F IN R24,0x3F
00CA 938A ST R24,-Y
(0048) }
(0049)
(0050)
(0051)
(0052)
(0053) //外中断0服务程序
(0054) #pragma interrupt_handler int0_isr:2
(0055) void int0_isr(void)
(0056) {
(0057) //外中断0
(0058) LED_ret=stop;
00CB E081 LDI R24,1
00CC 9380006E STS LED_ret,R24
00CE 9189 LD R24,Y+
00CF BF8F OUT 0x3F,R24
00D0 9189 LD R24,Y+
00D1 9518 RETI
_int1_isr:
00D2 922A ST R2,-Y
00D3 B62F IN R2,0x3F
00D4 922A ST R2,-Y
(0059) }
(0060)
(0061)
(0062) //外中断1服务程序
(0063) #pragma interrupt_handler int1_isr:3
(0064) void int1_isr(void)
(0065) {
(0066) //外中断1
(0067) LED_ret=start;
00D5 2422 CLR R2
00D6 9220006E STS LED_ret,R2
00D8 9029 LD R2,Y+
00D9 BE2F OUT 0x3F,R2
00DA 9029 LD R2,Y+
00DB 9518 RETI
(0068) }
(0069) void LED_run(void)
(0070) {
(0071) d++;//个位相加
_LED_run:
00DC 9180006A LDS R24,d
00DE 5F8F SUBI R24,0xFF
00DF 9380006A STS d,R24
(0072) DelayMS(1);
00E1 E001 LDI R16,1
00E2 E010 LDI R17,0
00E3 DFBA RCALL _DelayMS
(0073) if(d==10)
00E4 9180006A LDS R24,d
00E6 308A CPI R24,0xA
00E7 F581 BNE 0x0118
(0074) {
(0075) d=0;
00E8 2422 CLR R2
00E9 9220006A STS d,R2
(0076) c++;//十位相加
00EB 9180006B LDS R24,c
00ED 5F8F SUBI R24,0xFF
00EE 9380006B STS c,R24
(0077) DelayMS(1);
00F0 E001 LDI R16,1
00F1 E010 LDI R17,0
00F2 DFAB RCALL _DelayMS
(0078) if(c==10)
00F3 9180006B LDS R24,c
00F5 308A CPI R24,0xA
00F6 F509 BNE 0x0118
(0079) {
(0080) c=0;
00F7 2422 CLR R2
00F8 9220006B STS c,R2
(0081) b++;//百位相加
00FA 9180006C LDS R24,b
00FC 5F8F SUBI R24,0xFF
00FD 9380006C STS b,R24
(0082) DelayMS(1);
00FF E001 LDI R16,1
0100 E010 LDI R17,0
0101 DF9C RCALL _DelayMS
(0083) if(b==10)
0102 9180006C LDS R24,b
0104 308A CPI R24,0xA
0105 F491 BNE 0x0118
(0084) {
(0085) b=0;
0106 2422 CLR R2
0107 9220006C STS b,R2
(0086) a++;//千位相加
0109 9180006D LDS R24,a
010B 5F8F SUBI R24,0xFF
010C 9380006D STS a,R24
(0087) DelayMS(1);
010E E001 LDI R16,1
010F E010 LDI R17,0
0110 DF8D RCALL _DelayMS
(0088) if(a==10)
0111 9180006D LDS R24,a
0113 308A CPI R24,0xA
0114 F419 BNE 0x0118
(0089) a=0;
0115 2422 CLR R2
0116 9220006D STS a,R2
(0090) }
(0091) }
(0092) }
0118 9508 RET
(0093) }
(0094)
(0095) void init_devices(void)
(0096) {
(0097) CLI(); //禁止所有中断
_init_devices:
0119 94F8 BCLR 7
(0098) MCUCR = 0x00;///触发中断方式
011A 2422 CLR R2
011B BE25 OUT 0x35,R2
(0099) MCUCSR = 0x80;//禁止JTAG
011C E880 LDI R24,0x80
011D BF84 OUT 0x34,R24
(0100) GICR = 0x00;//中断使能
011E BE2B OUT 0x3B,R2
(0101) port_init();
011F DF94 RCALL _port_init
(0102) int_init();
0120 DF9E RCALL _int_init
(0103) LED_init();
0121 DF2E RCALL _LED_init
(0104) SEI();//开全局中断
0122 9478 BSET 7
0123 9508 RET
_main:
0124 9723 SBIW R28,3
(0105) }
(0106) //主函数
(0107) void main(void)
(0108) {
(0109) init_devices();//初始化端口、中断
0125 DFF3 RCALL _init_devices
0126 C010 RJMP 0x0137
(0110) //在这继续添加你的代码
(0111) while(1)
(0112) {
(0113) show_LED(d,c,b,a);//显示数字
0127 9020006D LDS R2,a
0129 822A STD Y+2,R2
012A 9020006C LDS R2,b
012C 8228 STD Y+0,R2
012D 9120006B LDS R18,c
012F 9100006A LDS R16,d
0131 DF28 RCALL _show_LED
(0114) if(LED_ret==0)//判断中断按键
0132 9020006E LDS R2,LED_ret
0134 2022 TST R2
0135 F409 BNE 0x0137
(0115) LED_run();//数字累加
FILE: <library>
0136 DFA5 RCALL _LED_run
0137 CFEF RJMP 0x0127
0138 9623 ADIW R28,3
0139 9508 RET
pop_gset2:
013A E0E2 LDI R30,2
013B 940C0149 JMP pop
push_gset5:
013D 92FA ST R15,-Y
013E 92EA ST R14,-Y
push_gset4:
013F 92DA ST R13,-Y
0140 92CA ST R12,-Y
push_gset3:
0141 92BA ST R11,-Y
0142 92AA ST R10,-Y
push_gset2:
0143 937A ST R23,-Y
0144 936A ST R22,-Y
push_gset1:
0145 935A ST R21,-Y
0146 934A ST R20,-Y
0147 9508 RET
pop_gset1:
0148 E0E1 LDI R30,1
pop:
0149 9149 LD R20,Y+
014A 9159 LD R21,Y+
014B FDE0 SBRC R30,0
014C 9508 RET
014D 9169 LD R22,Y+
014E 9179 LD R23,Y+
014F FDE1 SBRC R30,1
0150 9508 RET
0151 90A9 LD R10,Y+
0152 90B9 LD R11,Y+
0153 FDE2 SBRC R30,2
0154 9508 RET
0155 90C9 LD R12,Y+
0156 90D9 LD R13,Y+
0157 FDE3 SBRC R30,3
0158 9508 RET
0159 90E9 LD R14,Y+
015A 90F9 LD R15,Y+
015B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -