📄 adc-led.s
字号:
.module adc-led.c
.area data(ram, con, rel)
_lednum::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbsym e lednum _lednum c
_lednum1::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbsym e lednum1 _lednum1 c
_lednum2::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbsym e lednum2 _lednum2 c
_lednum3::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbsym e lednum3 _lednum3 c
_lednum4::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbsym e lednum4 _lednum4 c
_num::
.blkb 2
.area idata
.byte 63,6
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.blkb 2
.area idata
.byte 91,'O
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.blkb 2
.area idata
.byte 'f,'m
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.blkb 2
.area idata
.byte 125,7
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.blkb 2
.area idata
.byte 127,'o
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbsym e num _num A[10:10]c
.area text(rom, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 22
; //Designed by Alf
; //用于实现AD转换,转换结果由数码管显示,需要闭合SW5、SW6;以及SW8的1脚(AD0),而后旋转AD1电位器即可看到;
; //AD将电位器分得的0~5V电压转换成了0~1023;
; //ICC-AVR application builder : 2005-3-8 下午 04:53:49
; // Target : M8
; // Crystal: 11.059Mhz
;
; #include <iom8v.h>
; #include <macros.h>
;
; //lednum全局变量
; char lednum = 0;
; char lednum1 = 0;
; char lednum2 = 0;
; char lednum3 = 0;
; char lednum4 = 0;
; //码表
; char num[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
;
;
; void port_init(void)
; {
.dbline 23
; PORTB = 0xFF;
ldi R24,255
out 0x18,R24
.dbline 24
; DDRB = 0xFF;
out 0x17,R24
.dbline 25
; PORTC = 0x00; //m103 output only
clr R2
out 0x15,R2
.dbline 26
; DDRC = 0x7E;
ldi R24,126
out 0x14,R24
.dbline 27
; PORTD = 0x00;
out 0x12,R2
.dbline 28
; DDRD = 0xFF;
ldi R24,255
out 0x11,R24
.dbline -2
.dbline 29
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 36
;
; //TIMER0 initialisation - prescale:1024
; // WGM: Normal
; // desired value: 20mSec
; // actual value: 19.908mSec (0.5%)
; void timer0_init(void)
; {
.dbline 37
; TCCR0 = 0x00; //stop
clr R2
out 0x33,R2
.dbline 38
; TCNT0 = 0x29; //set count
ldi R24,41
out 0x32,R24
.dbline 39
; TCCR0 = 0x04; //start timer
ldi R24,4
out 0x33,R24
.dbline -2
.dbline 40
; }
L2:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 18
rjmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile F:\单片机教学\调试程序\ADC\adc-led.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
_timer0_ovf_isr::
st -y,R2
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 44
;
; #pragma interrupt_handler timer0_ovf_isr:10
; void timer0_ovf_isr(void)
; {
.dbline 45
; TCNT0 = 0x29; //reload counter value
ldi R24,41
out 0x32,R24
.dbline 46
; TCCR0 = 0x04; //start timer
ldi R24,4
out 0x33,R24
.dbline 48
;
; PORTB |= 0x30;
in R24,0x18
ori R24,48
out 0x18,R24
.dbline 49
; PORTC |= 0x30;
in R24,0x15
ori R24,48
out 0x15,R24
.dbline 50
; if(lednum == 0) //更新PB4数码管;
lds R2,_lednum
tst R2
brne L4
.dbline 51
; { PORTB &= ~0x10;
.dbline 51
cbi 0x18,4
.dbline 52
; PORTD = lednum4;
lds R2,_lednum4
out 0x12,R2
.dbline 53
; }
rjmp L5
L4:
.dbline 54
; else if(lednum ==1) //更新PB5数码管;
lds R24,_lednum
cpi R24,1
brne L6
.dbline 55
; { PORTB &= ~0x20;
.dbline 55
cbi 0x18,5
.dbline 56
; PORTD = lednum3;
lds R2,_lednum3
out 0x12,R2
.dbline 57
; }
rjmp L7
L6:
.dbline 58
; else if(lednum ==2) //更新PC4数码管;
lds R24,_lednum
cpi R24,2
brne L8
.dbline 59
; { PORTC &= ~0x10;
.dbline 59
cbi 0x15,4
.dbline 60
; PORTD = lednum2;
lds R2,_lednum2
out 0x12,R2
.dbline 61
; }
rjmp L9
L8:
.dbline 63
; else //更新PC5数码管;
; { PORTC &= ~0x20;
.dbline 63
cbi 0x15,5
.dbline 64
; PORTD = lednum1;
lds R2,_lednum1
out 0x12,R2
.dbline 65
; }
L9:
L7:
L5:
.dbline 67
;
; lednum++;
lds R24,_lednum
subi R24,255 ; addi 1
sts _lednum,R24
rjmp L11
L10:
.dbline 68
lds R24,_lednum
subi R24,4
sts _lednum,R24
L11:
.dbline 68
; while(lednum >= 4) lednum = lednum - 4;
lds R24,_lednum
cpi R24,4
brsh L10
.dbline -2
.dbline 70
;
; }
L3:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 74
;
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
.dbline 76
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 77
; port_init();
rcall _port_init
.dbline 78
; timer0_init();
rcall _timer0_init
.dbline 80
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 81
; GICR = 0x00;
out 0x3b,R2
.dbline 82
; TIMSK = 0x01; //timer interrupt sources
ldi R24,1
out 0x39,R24
.dbline 83
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 85
; //all peripherals are now initialised
; }
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay _delay fV
; j -> R16,R17
; i -> R18,R19
; z -> R20,R21
.even
_delay::
rcall push_gset1
.dbline -1
.dbline 92
;
;
;
;
; //自定义函数
; void delay(void)
; {
.dbline 94
clr R18
clr R19
rjmp L18
L15:
.dbline 94
L16:
.dbline 94
subi R18,255 ; offset = 1
sbci R19,255
L18:
.dbline 94
; unsigned int i,j,z;
; for(i=0;i<10000;i++);
cpi R18,16
ldi R30,39
cpc R19,R30
brlo L15
.dbline 95
; { for(j=0;j<10000;j++)
.dbline 95
clr R16
clr R17
rjmp L22
L19:
.dbline 96
.dbline 96
clr R20
clr R21
rjmp L26
L23:
.dbline 96
L24:
.dbline 96
subi R20,255 ; offset = 1
sbci R21,255
L26:
.dbline 96
cpi R20,100
ldi R30,0
cpc R21,R30
brlo L23
.dbline 96
L20:
.dbline 95
subi R16,255 ; offset = 1
sbci R17,255
L22:
.dbline 95
cpi R16,16
ldi R30,39
cpc R17,R30
brlo L19
.dbline 97
; { for(z=0;z<100;z++);}
; }
.dbline -2
.dbline 98
; }
L14:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 16 i
.dbsym r i 18 i
.dbsym r z 20 i
.dbend
.dbfunc e main _main fV
; temp -> R14,R15
; num4 -> R22
; num3 -> R10
; num2 -> R20
; num1 -> y+2
; i -> R12
; data -> y+0
.even
_main::
sbiw R28,3
.dbline -1
.dbline 101
;
; void main(void)
; {
.dbline 103
; char i;
; unsigned int data=0,temp;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 104
; char num1=0,num2=0,num3=0,num4=0;
std y+2,R0
.dbline 104
clr R20
.dbline 104
clr R10
.dbline 104
clr R22
.dbline 105
; init_devices();
rcall _init_devices
.dbline 107
;
; for(i=0;i<=9;i++)
clr R12
rjmp L31
L28:
.dbline 108
.dbline 108
ldi R24,<_num
ldi R25,>_num
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _lednum1,R2
.dbline 109
rcall _delay
.dbline 110
L29:
.dbline 107
inc R12
L31:
.dbline 107
ldi R24,9
cp R24,R12
brsh L28
.dbline 112
; { lednum1 = num[i];
; delay();
; }
;
; lednum1 = num[0];
lds R2,_num
sts _lednum1,R2
.dbline 113
; lednum2 = num[0];
sts _lednum2,R2
.dbline 114
; lednum3 = num[0];
sts _lednum3,R2
.dbline 115
; lednum4 = num[0];
sts _lednum4,R2
.dbline 117
;
; delay();
rcall _delay
.dbline 118
; delay();
rcall _delay
rjmp L33
L32:
.dbline 120
; while(1)
; { ADMUX = 0x40; //选择通道零
.dbline 120
ldi R24,64
out 0x7,R24
.dbline 121
; ADCSRA = 0xC7;
ldi R24,199
out 0x6,R24
L35:
.dbline 123
L36:
.dbline 123
in R24,0x6
ori R24,16
breq L35
.dbline 124
cbi 0x6,4
.dbline 126
in R2,0x4
clr R3
std y+1,R3
std y+0,R2
.dbline 127
in R14,0x5
clr R15
mov R15,R14
clr R14
.dbline 128
movw R0,R2
add R0,R14
adc R1,R15
std y+1,R1
std y+0,R0
.dbline 130
ldi R18,1000
ldi R19,3
movw R16,R0
rcall div16u
mov R22,R16
.dbline 131
ldi R18,1000
ldi R19,3
ldd R16,y+0
ldd R17,y+1
rcall div16u
movw R18,R16
ldi R16,1000
ldi R17,3
rcall empy16s
movw R2,R16
ldd R16,y+0
ldd R17,y+1
sub R16,R2
sbc R17,R3
ldi R18,100
ldi R19,0
rcall div16u
mov R10,R16
.dbline 132
ldi R18,100
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
movw R18,R16
ldi R16,100
ldi R17,0
rcall empy16s
movw R2,R16
ldd R16,y+0
ldd R17,y+1
sub R16,R2
sbc R17,R3
ldi R18,10
ldi R19,0
rcall div16u
mov R20,R16
.dbline 133
ldi R18,10
ldi R19,0
ldd R16,y+0
ldd R17,y+1
rcall div16u
movw R18,R16
ldi R16,10
ldi R17,0
rcall empy16s
ldd R4,y+0
ldd R5,y+1
sub R4,R16
sbc R5,R17
std y+2,R4
.dbline 136
ldi R24,<_num
ldi R25,>_num
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _lednum4,R2
.dbline 137
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _lednum3,R2
.dbline 138
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _lednum2,R2
.dbline 139
mov R30,R4
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts _lednum1,R2
.dbline 141
sbi 0x6,6
.dbline 142
rcall _delay
.dbline 144
L33:
.dbline 119
rjmp L32
X0:
.dbline -2
.dbline 145
;
; while((ADCSRA | 0x10)==0);
; ADCSRA &=~0x10;
;
; data = ADCL;
; temp =ADCH<<8;
; data = data +temp;
;
; num4 = data/1000;
; num3 = (data- data/1000*1000)/100;
; num2 = (data-data/100*100)/10;
; num1= data-data/10*10;
;
;
; lednum4 = num[num4];
; lednum3 = num[num3];
; lednum2 = num[num2];
; lednum1 = num[num1];
;
; ADCSRA |= 0x40;
; delay();
;
; }
; }
L27:
adiw R28,3
.dbline 0 ; func end
ret
.dbsym r temp 14 i
.dbsym r num4 22 c
.dbsym r num3 10 c
.dbsym r num2 20 c
.dbsym l num1 2 c
.dbsym r i 12 c
.dbsym l data 0 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -