📄 led+ad.s
字号:
.module LED+AD.C
.area lit(rom, con, rel)
_tabel::
.byte 63,6
.byte 91,'O
.byte 'f,'m
.byte 125,7
.byte 127,'o
.byte 'w,124
.byte 57,94
.byte 'y,'q
.dbfile F:\李鹏飞\sl-avrad-m16\LED+AD\LED+AD.C
.dbsym e tabel _tabel A[16:16]kc
.area text(rom, con, rel)
.dbfile F:\李鹏飞\sl-avrad-m16\LED+AD\LED+AD.C
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 23
; /******************************************************
; 双龙电子公司http://www.sl.com.cn
; AT90S8535--AD转换演示程序(ICCAVR)
; 作者:詹卫前
; 使用注意:1、应包含头文件slavr.h
; 2、在工程选项中的Additional Lib中填入slavr
; 使用编译器使用附加库文件libslavr.a
; 3、使用SL-AVRAD实验设备
; 接线说明:1、PA.0(PIN40)处接电平指示LED的短路块断开
; 2、A/D和VX之间的短路块闭合
; 3、AREF(PIN32)和AVCC(PIN30)接VCC
; 4、AGND(PIN31)接GND
; *******************************************************/
; #include<iom16v.h>
; #include<slavr.h>
; #include<macros.h>
; /* 七段译码字形表 */
; const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
; 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
; /* 显示缓冲区 */
; unsigned char ledbuff[6];
; void port_init(void)//端口初始化
; {
.dbline 24
; DDRD=0x3f;
ldi R24,63
out 0x11,R24
.dbline 25
; DDRB=0xff;
ldi R24,255
out 0x17,R24
.dbline 26
; PORTD=0xff;
out 0x12,R24
.dbline 27
; PORTB=0xff;
out 0x18,R24
.dbline -2
.dbline 28
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e display _display fV
; i -> R10
.even
_display::
xcall push_gset3x
.dbline -1
.dbline 30
; void display(void)//六路动态扫描显示电路
; {
.dbline 32
; unsigned char i;
; for (i=0;i<6;i++)
clr R10
xjmp L6
L3:
.dbline 33
.dbline 34
ldi R24,<_ledbuff
ldi R25,>_ledbuff
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 35
ldi R16,1
mov R17,R10
xcall lsl8
mov R2,R16
com R2
out 0x12,R2
.dbline 36
xcall _delay_1ms
.dbline 37
ldi R16,1
mov R17,R10
xcall lsl8
in R2,0x12
or R2,R16
out 0x12,R2
.dbline 38
L4:
.dbline 32
inc R10
L6:
.dbline 32
mov R24,R10
cpi R24,6
brlo L3
.dbline -2
.dbline 39
; {
; PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
; PORTD=~(1<<i); //开始显示
; delay_1ms(); //每一位显示保持一定时间
; PORTD|=(1<<i); //关闭显示
; }
; }
L2:
xcall pop_gset3x
.dbline 0 ; func end
ret
.dbsym r i 10 c
.dbend
.dbfunc e adctovol _adctovol fV
; char_p -> <dead>
; i -> R10
; temp -> R12,R13
; adc -> R10,R11
.even
_adctovol::
xcall push_gset4x
movw R10,R16
.dbline -1
.dbline 44
; unsigned int ad_con;//存放PA0的AD转换结果
; /* 将AD结果转换成电压 */
; #define vref 497
; void adctovol(unsigned int adc)
; {
.dbline 48
; unsigned int temp;
; unsigned char i;
; unsigned char *char_p;
; temp=(unsigned int)(((unsigned long)((unsigned long)adc*vref))/1024);
movw R2,R10
clr R4
clr R5
ldi R24,241
ldi R25,1
ldi R26,0
ldi R27,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R24
movw R18,R26
xcall empy32u
ldi R24,10
ldi R25,0
st -y,R24
xcall lsr32
movw R12,R16
.dbline 49
; for(i=0;i<3;i++)
clr R10
xjmp L11
L8:
.dbline 50
.dbline 51
ldi R18,10
ldi R19,0
movw R16,R12
xcall mod16u
movw R30,R16
ldi R24,<_tabel
ldi R25,>_tabel
add R30,R24
adc R31,R25
lpm R30,Z
ldi R24,<_ledbuff
ldi R25,>_ledbuff
mov R26,R10
clr R27
add R26,R24
adc R27,R25
st x,R30
.dbline 52
ldi R18,10
ldi R19,0
movw R16,R12
xcall div16u
movw R12,R16
.dbline 53
L9:
.dbline 49
inc R10
L11:
.dbline 49
mov R24,R10
cpi R24,3
brlo L8
.dbline 54
; {
; ledbuff[i]=tabel[temp%10];
; temp=temp/10;
; }
; ledbuff[5]=tabel[0x0a];
ldi R30,<_tabel+10
ldi R31,>_tabel+10
lpm R30,Z
sts _ledbuff+5,R30
.dbline 55
; ledbuff[4]=tabel[0x0d];
ldi R30,<_tabel+13
ldi R31,>_tabel+13
lpm R30,Z
sts _ledbuff+4,R30
.dbline 56
; ledbuff[3]=0x40;
ldi R24,64
sts _ledbuff+3,R24
.dbline 57
; ledbuff[2]|=0x80;
lds R24,_ledbuff+2
ori R24,128
sts _ledbuff+2,R24
.dbline -2
.dbline 58
; }
L7:
xcall pop_gset4x
.dbline 0 ; func end
ret
.dbsym l char_p 1 pc
.dbsym r i 10 c
.dbsym r temp 12 i
.dbsym r adc 10 i
.dbend
.area vector(rom, abs)
.org 56
jmp _adc_isr
.area text(rom, con, rel)
.dbfile F:\李鹏飞\sl-avrad-m16\LED+AD\LED+AD.C
.dbfunc e adc_isr _adc_isr fV
; temp -> R16,R17
.even
_adc_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 62
; /* AD转换程序 */
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
.dbline 63
; unsigned int temp=0;
clr R16
clr R17
xjmp L20
L19:
.dbline 65
subi R16,255 ; offset = 1
sbci R17,255
L20:
.dbline 64
; while(temp<6)
cpi R16,6
ldi R30,0
cpc R17,R30
brlo L19
.dbline 66
; temp++;
; ad_con=ADC;
in R2,0x4
in R3,0x5
sts _ad_con+1,R3
sts _ad_con,R2
.dbline 67
; ADCSR|=(1<<ADSC);//启动转换
sbi 0x6,6
.dbline -2
.dbline 68
; }
L18:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r temp 16 i
.dbend
.dbfunc e main _main fV
; i -> R10
.even
_main::
.dbline -1
.dbline 71
; //将AD转换结果转换成电压数值,然后在LCD上显示
; void main(void)
; {
.dbline 73
; unsigned char i;
; port_init();
xcall _port_init
.dbline 74
; MCUCSR=0;
clr R2
out 0x34,R2
.dbline 75
; ADMUX=0x00;//0通道
out 0x7,R2
.dbline 76
; ADCSR=(1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|0x06;
ldi R24,222
out 0x6,R24
.dbline 77
; SEI();
sei
.dbline 78
; for(i=0;i<6;i++)
clr R10
xjmp L26
L23:
.dbline 79
ldi R24,<_ledbuff
ldi R25,>_ledbuff
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldi R26,<_tabel
ldi R27,>_tabel
st -y,R31
st -y,R30
movw R30,R26
lpm R26,Z
ld R30,y+
ld R31,y+
std z+0,R26
L24:
.dbline 78
inc R10
L26:
.dbline 78
mov R24,R10
cpi R24,6
brlo L23
.dbline 80
; ledbuff[i]=tabel[0];
; i=0;
clr R10
xjmp L28
L27:
.dbline 82
; while(1)
; {
.dbline 83
; if((i==127)|(i==0))
mov R24,R10
cpi R24,127
brne L32
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L33
L32:
clr R14
clr R15
L33:
tst R10
brne L34
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L35
L34:
clr R12
clr R13
L35:
movw R2,R14
or R2,R12
or R3,R13
tst R2
brne X0
tst R3
breq L30
X0:
.dbline 84
; adctovol(ad_con);//降低AD结果刷新速率
lds R16,_ad_con
lds R17,_ad_con+1
xcall _adctovol
L30:
.dbline 85
xcall _display
.dbline 86
inc R10
.dbline 87
L28:
.dbline 81
xjmp L27
X1:
.dbline -2
.dbline 88
; display(); //使末位闪烁不太明显
; i++;
; }
; }
L22:
.dbline 0 ; func end
ret
.dbsym r i 10 c
.dbend
.area bss(ram, con, rel)
.dbfile F:\李鹏飞\sl-avrad-m16\LED+AD\LED+AD.C
_ad_con::
.blkb 2
.dbsym e ad_con _ad_con i
_ledbuff::
.blkb 6
.dbsym e ledbuff _ledbuff A[6:6]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -