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

📄 main.s

📁 一个关于AVR单片机的例程
💻 S
字号:
	.module main.c
	.area code(ram, con, rel)
	.area lit(rom, con, rel)
_seg7_data::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.byte 'w,124
	.byte 57,94
	.byte 'y,'q
	.byte 0
	.dbfile E:\avr\2.10.5\main.c
	.dbsym e seg7_data _seg7_data A[17:17]kc
	.area data(ram, con, rel)
	.dbfile E:\avr\2.10.5\main.c
	.area text(rom, con, rel)
	.dbfile E:\avr\2.10.5\main.c
	.dbfunc e delay100us _delay100us fV
;              i -> R20
;              n -> R16
	.even
_delay100us::
	xcall push_gset1
	.dbline -1
	.dbline 32
; //ICC-AVR application builder : 2007-5-23 0:45:25
; // Target : M16
; // Crystal: 1.0000Mhz
; 
; #include <iom16v.h>
; #include <macros.h>
; typedef unsigned char uint8;//可移植的8位无符号变量
; typedef unsigned int uint16;//可移植的16位无符号变量
; #pragma data:code
; const uint8 seg7_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0~F and "shut"
; #pragma data:data
; volatile uint8 seg7_led_buff[4];//禁止编译器优化,保护数组内容
; 
; #define seg7_bitselect_port PORTD
; #define seg7_bitselect_ddr DDRD
; #define seg7_bit0 4
; #define seg7_bit1 5
; #define seg7_bit2 6
; #define seg7_bit3 7
; #define seg7_bit0_en() {seg7_bitselect_ddr|=(1<<seg7_bit0);seg7_bitselect_port|=(1<<seg7_bit0);}
; #define seg7_bit0_dis() {seg7_bitselect_ddr|=(1<<seg7_bit0);seg7_bitselect_port&=~(1<<seg7_bit0);}
; #define seg7_bit1_en() {seg7_bitselect_ddr|=(1<<seg7_bit1);seg7_bitselect_port|=(1<<seg7_bit1);}
; #define seg7_bit1_dis() {seg7_bitselect_ddr|=(1<<seg7_bit1);seg7_bitselect_port&=~(1<<seg7_bit1);}
; #define seg7_bit2_en() {seg7_bitselect_ddr|=(1<<seg7_bit2);seg7_bitselect_port|=(1<<seg7_bit2);}
; #define seg7_bit2_dis() {seg7_bitselect_ddr|=(1<<seg7_bit2);seg7_bitselect_port&=~(1<<seg7_bit2);}
; #define seg7_bit3_en() {seg7_bitselect_ddr|=(1<<seg7_bit3);seg7_bitselect_port|=(1<<seg7_bit3);}
; #define seg7_bit3_dis() {seg7_bitselect_ddr|=(1<<seg7_bit3);seg7_bitselect_port&=~(1<<seg7_bit3);}
; #define seg7_data_port PORTA
; #define seg7_data_ddr DDRA
; 
; void delay100us(uint8 n)
; {
	.dbline 34
; uint8 i;
; for(i=100*n;i!=0;i--)
	ldi R24,100
	mul R24,R16
	mov R20,R0
	xjmp L5
L2:
	.dbline 35
	nop
L3:
	.dbline 34
	dec R20
L5:
	.dbline 34
	tst R20
	brne L2
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r n 16 c
	.dbend
	.dbfunc e seg7_led_update _seg7_led_update fV
	.even
_seg7_led_update::
	.dbline -1
	.dbline 39
; NOP();
; }
; 
; void seg7_led_update(void)//数码管扫描
; {
	.dbline 40
; seg7_data_port=seg7_data[seg7_led_buff[0]];
	ldi R24,<_seg7_data
	ldi R25,>_seg7_data
	lds R30,_seg7_led_buff
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 41
; seg7_bit0_en();
	.dbline 41
	sbi 0x11,4
	.dbline 41
	sbi 0x12,4
	.dbline 41
	.dbline 41
	.dbline 42
; delay100us(1);
	ldi R16,1
	xcall _delay100us
	.dbline 43
; seg7_bit0_dis();
	.dbline 43
	sbi 0x11,4
	.dbline 43
	cbi 0x12,4
	.dbline 43
	.dbline 43
	.dbline 44
; seg7_data_port=seg7_data[seg7_led_buff[1]];
	ldi R24,<_seg7_data
	ldi R25,>_seg7_data
	lds R30,_seg7_led_buff+1
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 45
; seg7_bit1_en();
	.dbline 45
	sbi 0x11,5
	.dbline 45
	sbi 0x12,5
	.dbline 45
	.dbline 45
	.dbline 46
; delay100us(1);
	ldi R16,1
	xcall _delay100us
	.dbline 47
; seg7_bit1_dis();
	.dbline 47
	sbi 0x11,5
	.dbline 47
	cbi 0x12,5
	.dbline 47
	.dbline 47
	.dbline 48
; seg7_data_port=seg7_data[seg7_led_buff[2]];
	ldi R24,<_seg7_data
	ldi R25,>_seg7_data
	lds R30,_seg7_led_buff+2
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 49
; seg7_bit2_en();
	.dbline 49
	sbi 0x11,6
	.dbline 49
	sbi 0x12,6
	.dbline 49
	.dbline 49
	.dbline 50
; delay100us(1);
	ldi R16,1
	xcall _delay100us
	.dbline 51
; seg7_bit2_dis();
	.dbline 51
	sbi 0x11,6
	.dbline 51
	cbi 0x12,6
	.dbline 51
	.dbline 51
	.dbline 52
; seg7_data_port=seg7_data[seg7_led_buff[3]];
	ldi R24,<_seg7_data
	ldi R25,>_seg7_data
	lds R30,_seg7_led_buff+3
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 53
; seg7_bit3_en();
	.dbline 53
	sbi 0x11,7
	.dbline 53
	sbi 0x12,7
	.dbline 53
	.dbline 53
	.dbline 54
; delay100us(1);
	ldi R16,1
	xcall _delay100us
	.dbline 55
; seg7_bit3_dis();
	.dbline 55
	sbi 0x11,7
	.dbline 55
	cbi 0x12,7
	.dbline 55
	.dbline 55
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e seg7_led_init _seg7_led_init fV
	.even
_seg7_led_init::
	.dbline -1
	.dbline 59
; }
; 
; void seg7_led_init(void)//7段数码管显示初始化
; {
	.dbline 60
; seg7_data_ddr=0xff;
	ldi R24,255
	out 0x1a,R24
	.dbline 61
; seg7_data_port=0x00;
	clr R2
	out 0x1b,R2
	.dbline 62
; seg7_bitselect_ddr|=0xf0;
	in R24,0x11
	ori R24,240
	out 0x11,R24
	.dbline 63
; seg7_bitselect_port|=0xf0;
	in R24,0x12
	ori R24,240
	out 0x12,R24
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area text(rom, con, rel)
	.dbfile E:\avr\2.10.5\main.c
	.dbfunc e int0_isr _int0_isr fV
;           tmpi -> R22
;        key_buf -> R20
;              i -> R10
	.even
_int0_isr::
	xcall push_lset
	xcall push_gset3
	.dbline -1
	.dbline 68
; }
; #pragma interrupt_handler int0_isr:iv_INT0
; 
; void int0_isr(void)
; {
	.dbline 69
; uint8 key_buf=0,i=0,tmpi=0;
	clr R20
	.dbline 69
	clr R10
	.dbline 69
	clr R22
	.dbline 70
; GICR=0x00;//关闭中断使能
	clr R2
	out 0x3b,R2
	.dbline 71
; DDRB=0x0f;
	ldi R24,15
	out 0x17,R24
	.dbline 72
; PORTB&=0xf0;
	in R24,0x18
	andi R24,240
	out 0x18,R24
	.dbline 73
; _NOP();
	nop
	.dbline 74
; if((PINB&0x0F)!=0x0F)
	in R24,0x16
	andi R24,15
	cpi R24,15
	brne X0
	xjmp L12
X0:
	.dbline 75
; {  //#1
	.dbline 76
;  delay100us(10);
	ldi R16,10
	xcall _delay100us
	.dbline 77
; if((PINB&0x0F)!=0x0F)
	in R24,0x16
	andi R24,15
	cpi R24,15
	brne X1
	xjmp L14
X1:
	.dbline 78
; { //#2
	.dbline 79
;  if((~PINB)&0x10)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrs R2,4
	rjmp L16
	.dbline 80
;  key_buf=0;
	xjmp L17
L16:
	.dbline 81
;  else if((~PINB)&0x20)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrs R2,5
	rjmp L18
	.dbline 82
;     key_buf=1;
	ldi R20,1
	xjmp L19
L18:
	.dbline 83
;     else if((~PINB)&0x40)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrs R2,6
	rjmp L20
	.dbline 84
;       key_buf=2;
	ldi R20,2
	xjmp L21
L20:
	.dbline 85
;     else if((~PINB)&0x80)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrc R2,7
	.dbline 86
;         key_buf=3;
	ldi R20,3
L22:
L21:
L19:
L17:
	.dbline 87
;  DDRB=0xf0;
	ldi R24,240
	out 0x17,R24
	.dbline 88
;  PORTB=0x0f;
	ldi R24,15
	out 0x18,R24
	.dbline 89
;  delay100us(10);
	ldi R16,10
	xcall _delay100us
	.dbline 90
;  if((~PINB)&0x01)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrs R2,0
	rjmp L24
	.dbline 91
;   key_buf+=0;
	xjmp L25
L24:
	.dbline 92
;   else if((~PINB)&0x02)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrs R2,1
	rjmp L26
	.dbline 93
;     key_buf+=4;
	subi R20,252    ; addi 4
	xjmp L27
L26:
	.dbline 94
;     else if((~PINB)&0x04)
	in R2,0x16
	clr R3
	com R2
	com R3
	sbrs R2,2
	rjmp L28
	.dbline 95
;       key_buf+=8;
	subi R20,248    ; addi 8
	xjmp L29
L28:
	.dbline 97
;         else
;         key_buf=16;
	ldi R20,16
L29:
L27:
L25:
	.dbline 98
; 	tmpi=PINB;
	in R22,0x16
	.dbline 99
;  if((key_buf!=16)&&(key_buf!=10)&&(key_buf!=11))
	cpi R20,16
	breq L30
	cpi R20,10
	breq L30
	cpi R20,11
	breq L30
	.dbline 100
;   {
	.dbline 101
;     for(i=3;i!=0;i--)
	ldi R24,3
	mov R10,R24
	xjmp L35
L32:
	.dbline 102
	.dbline 103
	ldi R24,<_seg7_led_buff-1
	ldi R25,>_seg7_led_buff-1
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_seg7_led_buff
	ldi R25,>_seg7_led_buff
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 104
L33:
	.dbline 101
	dec R10
L35:
	.dbline 101
	tst R10
	brne L32
	.dbline 105
;     {
;     seg7_led_buff[i]=seg7_led_buff[i-1];//移位显示
;     }
;     seg7_led_buff[0]=key_buf;
	sts _seg7_led_buff,R20
	.dbline 106
; 	tmpi=PINB;
	in R22,0x16
L37:
	.dbline 108
L38:
	.dbline 107
;     while((~PINB)&0x07)//按键释放检测,如不释放就一直循环
	in R24,0x16
	com R24
	andi R24,7
	brne L37
	.dbline 109
;     ;
;   }
	xjmp L31
L30:
	.dbline 110
;  else if(key_buf==10)
	cpi R20,10
	brne L40
	.dbline 111
;   ;
	xjmp L41
L40:
	.dbline 112
;  else if(key_buf==11)
	cpi R20,11
	brne L42
	.dbline 113
;   ;
L42:
L41:
L31:
	.dbline 114
;  DDRB=0x0f;
	ldi R24,15
	out 0x17,R24
	.dbline 115
;  PORTB=0xf0;
	ldi R24,240
	out 0x18,R24
	.dbline 116
;  } //end of #2
L14:
	.dbline 117
; } //end of #1 
L12:
	.dbline 118
; GICR=0x40;//中断复位
	ldi R24,64
	out 0x3b,R24
	.dbline -2
L11:
	xcall pop_gset3
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r tmpi 22 c
	.dbsym r key_buf 20 c
	.dbsym r i 10 c
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 122
; }
; 
; void main(void)
; {
	.dbline 123
; DDRB=0x0f;//PB3 out
	ldi R24,15
	out 0x17,R24
	.dbline 124
; PORTB&=0xF8;
	in R24,0x18
	andi R24,248
	out 0x18,R24
	.dbline 125
; PORTB|=0xF0;//PORTB置1111x000
	in R24,0x18
	ori R24,240
	out 0x18,R24
	.dbline 126
; DDRD&=0xfb;
	in R24,0x11
	andi R24,251
	out 0x11,R24
	.dbline 127
; PORTD|=(~0xfb);
	in R24,0x12
	ori R24,4
	out 0x12,R24
	.dbline 128
; MCUCR&=(~0x03);
	in R24,0x35
	andi R24,252
	out 0x35,R24
	.dbline 129
; GICR=0x40;//使能中断INT0
	ldi R24,64
	out 0x3b,R24
	.dbline 130
; SEI();
	sei
	.dbline 131
; seg7_led_init();
	xcall _seg7_led_init
	xjmp L46
L45:
	.dbline 133
	.dbline 134
	xcall _seg7_led_update
	.dbline 135
L46:
	.dbline 132
	xjmp L45
X2:
	.dbline -2
L44:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\avr\2.10.5\main.c
_seg7_led_buff::
	.blkb 4
	.dbsym e seg7_led_buff _seg7_led_buff A[4:4]c

⌨️ 快捷键说明

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