📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; a -> R20
0000 ; b -> R22
0000 ; i -> R16
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 22
0004 ; /*
0004 ; 实验六:
0004 ; 外部中断实验。
0004 ; 1、按键中断实验。INT4-INT7 4路中断触发方式,并以PB4-PB7电平
0004 ; 翻转显示其状态。
0004 ; 2、内部1 M晶振,程序采用全中断触发方式工作。
0004 ; 3、进行此实验请插上LED短路块。
0004 ; 4、此实验以简单的方式对中断的4种触发方式进行了实验,
0004 ; 让大家对中断有个全面的认识。
0004 ;
0004 ; AVR mega128学习板
0004 ; www.iccavr.com 阿发
0004 ; 1:15 2007-10-11
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ; #include <macros.h>
0004 ;
0004 ; void int_init(void);
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 25
0004 4427 clr R20
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 25
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 0; a < i; a++) {
0008 .dbline 26
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 26
000C L7:
000C .dbline 26
000C 6395 inc R22
000E L9:
000E .dbline 26
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 27
0012 L3:
0012 .dbline 25
0012 4395 inc R20
0014 L5:
0014 .dbline 25
0014 4017 cp R20,R16
0016 C0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 0E940000 xcall pop_gset2
001C .dbline 0 ; func end
001C 0895 ret
001E .dbsym r a 20 c
001E .dbsym r b 22 c
001E .dbsym r i 16 c
001E .dbend
001E .dbfunc e io_init _io_init fV
.even
001E _io_init::
001E .dbline -1
001E .dbline 31
001E ; for (b = 1; b; b++);
001E ; }
001E ; }
001E ;
001E ; /*IO口初始化函数*/
001E ; void io_init(void) {
001E .dbline 33
001E ;
001E ; DDRA = 0x00; /*方向输入*/
001E 2224 clr R2
0020 2ABA out 0x1a,R2
0022 .dbline 34
0022 ; PORTA = 0xFF; /*打开上拉*/
0022 8FEF ldi R24,255
0024 8BBB out 0x1b,R24
0026 .dbline 35
0026 ; DDRB = 0xFF; /*方向输出*/
0026 87BB out 0x17,R24
0028 .dbline 36
0028 ; PORTB = 0xFF; /*输出高电平*/
0028 88BB out 0x18,R24
002A .dbline 37
002A ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
002A 24BA out 0x14,R2
002C .dbline 38
002C ; PORTC = 0xFF;
002C 85BB out 0x15,R24
002E .dbline 39
002E ; DDRD = 0x00;
002E 21BA out 0x11,R2
0030 .dbline 40
0030 ; PORTD = 0xFF;
0030 82BB out 0x12,R24
0032 .dbline 41
0032 ; DDRE = 0x00;
0032 22B8 out 0x2,R2
0034 .dbline 42
0034 ; PORTE = 0xFF;
0034 83B9 out 0x3,R24
0036 .dbline 43
0036 ; DDRF = 0x00;
0036 20926100 sts 97,R2
003A .dbline 44
003A ; PORTF = 0xFF;
003A 80936200 sts 98,R24
003E .dbline 45
003E ; DDRG = 0x00;
003E 20926400 sts 100,R2
0042 .dbline 46
0042 ; PORTG = 0xFF;
0042 80936500 sts 101,R24
0046 .dbline -2
0046 L10:
0046 .dbline 0 ; func end
0046 0895 ret
0048 .dbend
0048 .dbfunc e main _main fV
.even
0048 _main::
0048 .dbline -1
0048 .dbline 49
0048 ; }
0048 ;
0048 ; void main(void) {
0048 .dbline 51
0048 ;
0048 ; io_init(); /*IO口状态初始化*/
0048 EADF xcall _io_init
004A .dbline 52
004A ; int_init(); /*中断初始化*/
004A 09D0 xcall _int_init
004C 06C0 xjmp L13
004E L12:
004E .dbline 54
004E .dbline 55
004E 08EC ldi R16,200
0050 D7DF xcall _delay_ms
0052 .dbline 56
0052 81E0 ldi R24,1
0054 28B2 in R2,0x18
0056 2826 eor R2,R24
0058 28BA out 0x18,R2
005A .dbline 57
005A L13:
005A .dbline 54
005A F9CF xjmp L12
005C X0:
005C .dbline -2
005C L11:
005C .dbline 0 ; func end
005C 0895 ret
005E .dbend
005E .dbfunc e int_init _int_init fV
.even
005E _int_init::
005E .dbline -1
005E .dbline 61
005E ;
005E ; while (1) {
005E ; delay_ms(200);
005E ; PORTB ^= (1 << 0); /*PB0电平取反,闲着没事干,意思意思*/
005E ; }
005E ; }
005E ;
005E ; /*中断初始化函数*/
005E ; void int_init(void) {
005E .dbline 62
005E ; CLI(); /*关全局中断*/
005E F894 cli
0060 .dbline 63
0060 ; EIMSK = 0x00; /*屏蔽所有外部中断*/
0060 2224 clr R2
0062 29BE out 0x39,R2
0064 .dbline 64
0064 ; EICRA = 0x00; /*INT0-INT3设置为低电平触发*/
0064 20926A00 sts 106,R2
0068 .dbline 65
0068 ; EICRB = 0x00; /*INT4-INT7设置为低电平触发*/
0068 2ABE out 0x3a,R2
006A .dbline 66
006A ; EICRB |= (1 << ISC50); /*INT5设置为任意电平变化触发*/
006A 8AB7 in R24,0x3a
006C 8460 ori R24,4
006E 8ABF out 0x3a,R24
0070 .dbline 67
0070 ; EICRB |= (1 << ISC61); /*INT6设置为下降沿触发*/
0070 8AB7 in R24,0x3a
0072 8062 ori R24,32
0074 8ABF out 0x3a,R24
0076 .dbline 68
0076 ; EICRB |= (1 << ISC71) | (1 << ISC70); /*INT6设置为下降沿触发*/
0076 8AB7 in R24,0x3a
0078 806C ori R24,192
007A 8ABF out 0x3a,R24
007C .dbline 69
007C ; EIFR = 0xFF; /*清除中断标志,请见中文手册P84*/
007C 8FEF ldi R24,255
007E 88BF out 0x38,R24
0080 .dbline 70
0080 ; EIMSK = 0xF0; /*INT4-INT7中断允许*/
0080 80EF ldi R24,240
0082 89BF out 0x39,R24
0084 .dbline 71
0084 ; SEI(); /*全局中断允许*/
0084 7894 sei
0086 .dbline -2
0086 L15:
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbend
.area vector(rom, abs)
.org 20
0014 0C944400 jmp _Int4
.area text(rom, con, rel)
0088 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
0088 .dbfunc e Int4 _Int4 fV
0088 ; i -> R16,R17
.even
0088 _Int4::
0088 2A92 st -y,R2
008A 3A92 st -y,R3
008C 0A93 st -y,R16
008E 1A93 st -y,R17
0090 8A93 st -y,R24
0092 2FB6 in R2,0x3f
0094 2A92 st -y,R2
0096 .dbline -1
0096 .dbline 76
0096 ; }
0096 ;
0096 ; /*外部中断INT4,低电平触发*/
0096 ; #pragma interrupt_handler Int4: 6
0096 ; void Int4(void) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -