⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.s

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 S
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
	.dbfunc e delay_ms _delay_ms fV
;              a -> R20
;              b -> R22
;              i -> R16
	.even
_delay_ms::
	xcall push_gset2
	.dbline -1
	.dbline 22
; /*
; 实验六:
; 	外部中断实验。
; 	1、按键中断实验。INT4-INT7 4路中断触发方式,并以PB4-PB7电平
; 		翻转显示其状态。
; 	2、内部1 M晶振,程序采用全中断触发方式工作。
; 	3、进行此实验请插上LED短路块。
; 	4、此实验以简单的方式对中断的4种触发方式进行了实验,
; 		让大家对中断有个全面的认识。
; 
; 	AVR  mega128学习板
; 	www.iccavr.com 阿发
; 	1:15 2007-10-11
; */
; 
; #include "iom128v.h"
; #include <macros.h>
; 
; void int_init(void);
; 
; /*延时函数*/
; void delay_ms(unsigned char i) {
	.dbline 25
	clr R20
	xjmp L5
L2:
	.dbline 25
; 
; 	unsigned char a, b;
; 	for (a = 0; a < i; a++) {
	.dbline 26
	ldi R22,1
	xjmp L9
L6:
	.dbline 26
L7:
	.dbline 26
	inc R22
L9:
	.dbline 26
	tst R22
	brne L6
	.dbline 27
L3:
	.dbline 25
	inc R20
L5:
	.dbline 25
	cp R20,R16
	brlo L2
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r a 20 c
	.dbsym r b 22 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e io_init _io_init fV
	.even
_io_init::
	.dbline -1
	.dbline 31
; 		for (b = 1; b; b++);
; 		}
; }
; 
; /*IO口初始化函数*/
; void io_init(void) {
	.dbline 33
; 
; 	DDRA = 0x00;										/*方向输入*/
	clr R2
	out 0x1a,R2
	.dbline 34
; 	PORTA = 0xFF;										/*打开上拉*/
	ldi R24,255
	out 0x1b,R24
	.dbline 35
; 	DDRB = 0xFF;										/*方向输出*/
	out 0x17,R24
	.dbline 36
; 	PORTB = 0xFF;										/*输出高电平*/
	out 0x18,R24
	.dbline 37
; 	DDRC = 0x00;										/*不用的IO口建议设置为输入带上拉*/
	out 0x14,R2
	.dbline 38
; 	PORTC = 0xFF;
	out 0x15,R24
	.dbline 39
; 	DDRD = 0x00;
	out 0x11,R2
	.dbline 40
; 	PORTD = 0xFF;
	out 0x12,R24
	.dbline 41
; 	DDRE = 0x00;
	out 0x2,R2
	.dbline 42
; 	PORTE = 0xFF;
	out 0x3,R24
	.dbline 43
; 	DDRF = 0x00;
	sts 97,R2
	.dbline 44
; 	PORTF = 0xFF;
	sts 98,R24
	.dbline 45
; 	DDRG = 0x00;
	sts 100,R2
	.dbline 46
; 	PORTG = 0xFF;
	sts 101,R24
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 49
; }
; 
; void main(void) {
	.dbline 51
; 
; 	io_init();											/*IO口状态初始化*/
	xcall _io_init
	.dbline 52
; 	int_init();											/*中断初始化*/
	xcall _int_init
	xjmp L13
L12:
	.dbline 54
	.dbline 55
	ldi R16,200
	xcall _delay_ms
	.dbline 56
	ldi R24,1
	in R2,0x18
	eor R2,R24
	out 0x18,R2
	.dbline 57
L13:
	.dbline 54
	xjmp L12
X0:
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e int_init _int_init fV
	.even
_int_init::
	.dbline -1
	.dbline 61
; 
; 	while (1) {
; 		delay_ms(200);
; 		PORTB ^= (1 << 0);								/*PB0电平取反,闲着没事干,意思意思*/
; 		}
; }
; 
; /*中断初始化函数*/
; void int_init(void) {
	.dbline 62
; 	CLI();												/*关全局中断*/
	cli
	.dbline 63
; 	EIMSK = 0x00;										/*屏蔽所有外部中断*/
	clr R2
	out 0x39,R2
	.dbline 64
; 	EICRA = 0x00;										/*INT0-INT3设置为低电平触发*/
	sts 106,R2
	.dbline 65
; 	EICRB = 0x00;										/*INT4-INT7设置为低电平触发*/
	out 0x3a,R2
	.dbline 66
; 	EICRB |= (1 << ISC50);								/*INT5设置为任意电平变化触发*/
	in R24,0x3a
	ori R24,4
	out 0x3a,R24
	.dbline 67
; 	EICRB |= (1 << ISC61);								/*INT6设置为下降沿触发*/
	in R24,0x3a
	ori R24,32
	out 0x3a,R24
	.dbline 68
; 	EICRB |= (1 << ISC71) | (1 << ISC70);				/*INT6设置为下降沿触发*/
	in R24,0x3a
	ori R24,192
	out 0x3a,R24
	.dbline 69
; 	EIFR = 0xFF;										/*清除中断标志,请见中文手册P84*/
	ldi R24,255
	out 0x38,R24
	.dbline 70
; 	EIMSK = 0xF0;										/*INT4-INT7中断允许*/
	ldi R24,240
	out 0x39,R24
	.dbline 71
; 	SEI();												/*全局中断允许*/
	sei
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 20
	jmp _Int4
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
	.dbfunc e Int4 _Int4 fV
;              i -> R16,R17
	.even
_Int4::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 76
; }
; 
; /*外部中断INT4,低电平触发*/
; #pragma interrupt_handler Int4: 6
; void Int4(void) {
	.dbline 79
; 	unsigned int i;
; 
; 	i = 1000;											/*防按键颤动代码*/
	ldi R16,1000
	ldi R17,3
	xjmp L18
L17:
	.dbline 80
; 	while (i --) {
	.dbline 81
; 		if ((PINE & (1 << PE4)) != 0) {					/*按键是否为低电平*/
	sbis 0x1,4
	rjmp L20
	.dbline 81
	.dbline 82
; 			return ;
	xjmp L16
L20:
	.dbline 84
L18:
	.dbline 80
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L17
	tst R3
	brne L17
X1:
	.dbline 86
; 			}
; 		}
; 
; 	PORTB ^= (1 << PB4);								/*PB1电平取反*/
	ldi R24,16
	in R2,0x18
	eor R2,R24
	out 0x18,R2
L22:
	.dbline 87
L23:
	.dbline 87
; 	while ((PINE & (1 << PE4)) == 0);					/*等待按键松开*/
	sbis 0x1,4
	rjmp L22
	.dbline -2
L16:
	ld R2,y+
	out 0x3f,R2
	ld R24,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym r i 16 i
	.dbend
	.area vector(rom, abs)
	.org 24
	jmp _Int5
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
	.dbfunc e Int5 _Int5 fV
	.even
_Int5::
	st -y,R2
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 92
; }
; 
; /*外部中断INT5,任意电平变化触发*/
; #pragma interrupt_handler Int5: 7
; void Int5(void) {
	.dbline 93
; 	PORTB ^= (1 << PB5);								/*PB1电平取反*/
	ldi R24,32
	in R2,0x18
	eor R2,R24
	out 0x18,R2
	.dbline -2
L25:
	ld R2,y+
	out 0x3f,R2
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 28
	jmp _Int6
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
	.dbfunc e Int6 _Int6 fV
;              i -> R16,R17
	.even
_Int6::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 98
; }
; 
; /*外部中断INT4,下降沿触发*/
; #pragma interrupt_handler Int6: 8
; void Int6(void) {
	.dbline 101
; 	unsigned int i;
; 
; 	i = 1000;											/*防按键颤动代码*/
	ldi R16,1000
	ldi R17,3
	xjmp L28
L27:
	.dbline 102
; 	while (i --) {
	.dbline 103
; 		if ((PINE & (1 << PE6)) != 0) {					/*按键是否为低电平*/
	sbis 0x1,6
	rjmp L30
	.dbline 103
	.dbline 104
; 			return ;
	xjmp L26
L30:
	.dbline 106
L28:
	.dbline 102
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L27
	tst R3
	brne L27
X2:
	.dbline 108
; 			}
; 		}
; 
; 	PORTB ^= (1 << PB6);								/*PB1电平取反*/
	ldi R24,64
	in R2,0x18
	eor R2,R24
	out 0x18,R2
	.dbline -2
L26:
	ld R2,y+
	out 0x3f,R2
	ld R24,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym r i 16 i
	.dbend
	.area vector(rom, abs)
	.org 32
	jmp _Int7
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
	.dbfunc e Int7 _Int7 fV
;              i -> R16,R17
	.even
_Int7::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 113
; }
; 
; /*外部中断INT4,上升沿触发*/
; #pragma interrupt_handler Int7: 9
; void Int7(void) {
	.dbline 116
; 	unsigned int i;
; 
; 	i = 1000;											/*防按键颤动代码*/
	ldi R16,1000
	ldi R17,3
	xjmp L34
L33:
	.dbline 117
; 	while (i --) {
	.dbline 118
; 		if ((PINE & (1 << PE7)) == 0) {					/*按键是否为高电平*/
	sbic 0x1,7
	rjmp L36
	.dbline 118
	.dbline 119
; 			return ;
	xjmp L32
L36:
	.dbline 121
L34:
	.dbline 117
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L33
	tst R3
	brne L33
X3:
	.dbline 123
; 			}
; 		}
; 
; 	PORTB ^= (1 << PB7);								/*PB1电平取反*/
	ldi R24,128
	ldi R25,0
	in R2,0x18
	clr R3
	eor R2,R24
	eor R3,R25
	out 0x18,R2
	.dbline -2
L32:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym r i 16 i
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -