📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.dbfunc e Delay_MS _Delay_MS fV
; i -> R20
; iTime -> R16,R17
.even
_Delay_MS::
st -y,R20
.dbline -1
.dbline 7
; //#IFDEF F_CPU
; #define F_CPU 8000000
; //#ENDIF
;
; //延时,对应主频为8MHz
; void Delay_MS(unsigned int iTime)
; { unsigned char i;
rjmp L3
L2:
.dbline 9
; while(iTime>0)
; {
.dbline 10
; for (i=1;i<187;i++)
ldi R20,1
rjmp L8
L5:
.dbline 11
; asm("nop");
nop
L6:
.dbline 10
inc R20
L8:
.dbline 10
cpi R20,187
brlo L5
X0:
.dbline 13
;
; iTime--;
subi R16,1
sbci R17,0
.dbline 14
; }
L3:
.dbline 8
cpi R16,0
cpc R16,R17
brne L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r i 20 c
.dbsym r iTime 16 i
.dbend
.dbfunc e Delay_US _Delay_US fV
; j -> R10,R11
; i -> R20,R21
; iTime -> R16,R17
.even
_Delay_US::
rcall push_xgset300C
.dbline -1
.dbline 19
; }
;
; //主频8MHz
; void Delay_US(unsigned int iTime)
; {
.dbline 21
; unsigned int i,j;
; j = iTime * 8;
movw R10,R16
lsl R10
rol R11
lsl R10
rol R11
lsl R10
rol R11
.dbline 22
; for(i=0;i<j;i++);
clr R20
clr R21
rjmp L13
L10:
.dbline 22
L11:
.dbline 22
subi R20,255 ; offset = 1
sbci R21,255
L13:
.dbline 22
cp R20,R10
cpc R21,R11
brlo L10
X2:
.dbline -2
L9:
.dbline 0 ; func end
rjmp pop_xgset300C
.dbsym r j 10 i
.dbsym r i 20 i
.dbsym r iTime 16 i
.dbend
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
_SEG7::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 136,131
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 198,161
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.blkb 2
.area idata
.byte 134,142
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\delay.h
.dbfile f:\MYDOCU~1\AVR\test\main.c
.dbsym e SEG7 _SEG7 A[16:16]c
_PADV::
.blkb 1
.area idata
.byte 255
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.blkb 15
.area idata
.word 0,0,0,0,0
.byte 0,0,0,0,0
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.dbsym e PADV _PADV A[16:16]c
_CADV::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.blkb 15
.area idata
.word 0,0,0,0,0
.byte 0,0,0,0,0
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.dbsym e CADV _CADV A[16:16]c
_ScaleCHindex::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.dbsym e ScaleCHindex _ScaleCHindex c
.area vector(rom, abs)
.org 18
rjmp _OnTimer0
.area data(ram, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.area text(rom, con, rel)
.dbfile f:\MYDOCU~1\AVR\test\main.c
.dbfunc e OnTimer0 _OnTimer0 fV
; adv -> R20
.even
_OnTimer0::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
st -y,R20
st -y,R21
.dbline -1
.dbline 22
; #include <iom8v.h>
; #include <macros.h>
;
; #define F_CPU 8000000 //主频
; #include "delay.h"
;
; #define MAXCH 16 //总通道数
; #define MAXSCALECH 6 //比例通道数
;
; //数码管显示值
; unsigned char SEG7[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
;
; //通道值
; unsigned char PADV[MAXCH] = {-1};
; unsigned char CADV[MAXCH] = {0};
;
; unsigned char ScaleCHindex = 0;
;
; //以下定义中断处理程序
; #pragma interrupt_handler OnTimer0:iv_TIMER0_OVF
; void OnTimer0(void)
; { unsigned char adv;
.dbline 23
; ADMUX = 0x20 + ScaleCHindex; //左对齐,只取高位
lds R24,_ScaleCHindex
subi R24,224 ; addi 32
out 0x7,R24
.dbline 25
;
; ADCSRA|=(1<<ADSC); //启动ADC
sbi 0x6,6
.dbline 26
; Delay_US(60); //第一次结果抛弃
ldi R16,60
ldi R17,0
rcall _Delay_US
.dbline 27
; ADCSRA|=(1<<ADSC); //启动ADC
sbi 0x6,6
.dbline 28
; Delay_US(60);
ldi R16,60
ldi R17,0
rcall _Delay_US
.dbline 29
; adv = ADCH;
in R20,0x5
.dbline 31
;
; if(adv == 0xFF) adv = 0xFE;
cpi R20,255
brne L15
X3:
.dbline 31
ldi R20,254
rjmp L16
L15:
.dbline 32
; else if(ADCH == 0x00) adv = 0x01;
in R2,0x5
tst R2
brne L17
X4:
.dbline 32
ldi R20,1
L17:
L16:
.dbline 34
;
; CADV[ScaleCHindex] = adv;
ldi R24,<_CADV
ldi R25,>_CADV
lds R30,_ScaleCHindex
clr R31
add R30,R24
adc R31,R25
std z+0,R20
.dbline 36
;
; ScaleCHindex++;
lds R24,_ScaleCHindex
subi R24,255 ; addi 1
sts _ScaleCHindex,R24
.dbline 37
; if(ScaleCHindex >= MAXSCALECH) ScaleCHindex = 0;
cpi R24,6
brlo L19
X5:
.dbline 37
clr R2
sts _ScaleCHindex,R2
L19:
.dbline 40
;
; //去抖
; adv = PIND;
in R20,0x10
.dbline 41
; Delay_US(50);
ldi R16,50
ldi R17,0
rcall _Delay_US
.dbline 42
; if(adv != PIND) return;
in R2,0x10
cp R20,R2
breq L21
X6:
.dbline 42
rjmp L14
L21:
.dbline 44
;
; CADV[MAXSCALECH] = (PIND & 0x10) ? 0xFF : 0x00;
sbis 0x10,4
rjmp L24
X7:
ldi R20,255
ldi R21,0
rjmp L25
L24:
clr R20
clr R21
L25:
sts _CADV+6,R20
.dbline 45
; CADV[MAXSCALECH+1] = (PIND & 0x20) ? 0xFF : 0x00;
sbis 0x10,5
rjmp L27
X8:
ldi R20,255
ldi R21,0
rjmp L28
L27:
clr R20
clr R21
L28:
sts _CADV+7,R20
.dbline 46
; CADV[MAXSCALECH+2] = (PIND & 0x40) ? 0xFF : 0x00;
sbis 0x10,6
rjmp L30
X9:
ldi R20,255
ldi R21,0
rjmp L31
L30:
clr R20
clr R21
L31:
sts _CADV+8,R20
.dbline 47
; CADV[MAXSCALECH+3] = (PIND & 0x80) ? 0xFF : 0x00;
sbis 0x10,7
rjmp L33
X10:
ldi R20,255
ldi R21,0
rjmp L34
L33:
clr R20
clr R21
L34:
sts _CADV+9,R20
.dbline -2
L14:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r adv 20 c
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fI
.even
_main::
.dbline 0 ; func end
ret
.dbend
;
; //TCNT0 = 0xFF;
; }
;
; //初始化
; void init_devices(void)
; {
; //内部RC校准
; //OSCCAL = 0x7D;
; unsigned int baud = 9600;
;
; CLI();
;
; //端口初始化
; PORTB = 0xFF;
; DDRB = 0xFF;
;
; //比例通道
; PORTC = 0x00;
; DDRC = 0x00;
;
; //开关通道
; PORTD = 0xF0;
; DDRD = 0x0F;
;
; //定时器初始化
; TCCR0 = 0x00; //禁止计时
; TCNT0 = 0x0F; //定时器时长
; TCCR0 = 0x05; //启动定时器 CLK/1024
;
; //ADC初始化
; ADCSR = 0x00; //禁止转换
; ADMUX = 0x20; //多路复用选择寄存器 E0 内部参考源,左对齐(只需高八位),通道0
; // REFS1 RESF0(参考源) ADLAR(左对齐) 保留 MUX3 MUX2 MUX1 MUX0
; ACSR = 0x80; //模拟比较器控制与状态寄存器
; ADCSR = 0x83; //10001011 83 禁止中断,使用查询方式
; //ADEN(AD允许) ADSC(AD开始) ADFR(连续) ADIF(中断标志) ADIE(中断允许) ADPS(预分频,三位)
;
; //UART初始化
; UBRRH = (unsigned char)(baud>>8);
; UBRRL = (unsigned char)(baud);
; UCSRB = (1<<TXEN);
; UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ8);
;
; //控制寄存器
; MCUCR = 0x00;
; GICR = 0x00;
; TIMSK = 0x01; //充许Timer0中断
;
; SEI();
; }
;
; main()
; {
; int i = 0,j = 0;
;
; init_devices();
;
; while(1)
; {
; for(j=0;j<MAXCH;j++)
; if(PADV[j] != CADV[j])
; { i = j;
; PADV[j] = CADV[j];
; }
;
; //显示低位
; PORTD = 0x01;
; PORTB = SEG7[CADV[i] & 0x0F];
; Delay_MS(20);
;
; //显示高位
; PORTD = 0x02;
; PORTB = SEG7[CADV[i] >> 4];
; Delay_MS(20);
;
; //通道值
; PORTD = 0x08;
; PORTB = SEG7[i];
; Delay_MS(20);
; }
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -