📄 main.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 + -