📄 fjv14.s
字号:
; /**************************************************************************/
; //串口接收数据
; unsigned char USART_Recive(void)
; {
L43:
.dbline 199
L44:
.dbline 199
; unsigned char y;
; //等待接收数据
; while(!(UCSRA&(1<<RXC)));
sbis 0xb,7
rjmp L43
.dbline 200
; y=getchar(); //接收数据
rcall _getchar
mov R20,R16
.dbline 202
;
; return y;
.dbline -2
L42:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r y 20 c
.dbend
.dbfunc e USART_Transmit _USART_Transmit fV
; tdata -> R16
.even
_USART_Transmit::
.dbline -1
.dbline 207
; }
; /*******************************************************************/
; //串口发送数据
; void USART_Transmit(unsigned char tdata)
; {
.dbline 209
; //等待数据寄存器空
; UDR=tdata;
out 0xc,R16
L47:
.dbline 211
L48:
.dbline 210
; while(!(UCSRA&(1<<UDRE)))
sbis 0xb,5
rjmp L47
.dbline -2
L46:
.dbline 0 ; func end
ret
.dbsym r tdata 16 c
.dbend
.dbfunc e ADC_Value _ADC_Value fi
; temp -> R20,R21
; adc_channel -> R22
.even
_ADC_Value::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 223
; ;
;
;
; }
; /******************************************************************/
; /*******************************************************************
; 函数功能:AD数据、通道采集,10位精度。
; 入口参数:adc_channel通道选择。
; 出口参数:AD采集的数据
; 说明:此处可以加入中值滤波程序。使用ADC降噪中断方式
; *******************************************************/
; unsigned int ADC_Value (unsigned char adc_channel)
; {
.dbline 225
; unsigned int temp;
; temp=0;
clr R20
clr R21
.dbline 226
; switch (adc_channel)
clr R23
cpi R22,1
ldi R30,0
cpc R23,R30
breq L54
cpi R22,2
ldi R30,0
cpc R23,R30
breq L55
cpi R22,3
ldi R30,0
cpc R23,R30
breq L56
cpi R22,4
ldi R30,0
cpc R23,R30
breq L57
rjmp L52
X4:
.dbline 227
; {
L54:
.dbline 229
; case 0x01: //如果为00则启动CH1通道
; ADMUX=0x00;//寄存器后4位对应通道。0代表CH1通道。
clr R2
out 0x7,R2
.dbline 230
; temp=ADC_filter();
rcall _ADC_filter
movw R20,R16
.dbline 231
; break;
rjmp L52
L55:
.dbline 233
; case 0x02: //如果为01则启动CH2通道
; ADMUX=0x01;//寄存器后4位对应通道。1代表CH2通道。
ldi R24,1
out 0x7,R24
.dbline 234
; temp=ADC_filter();
rcall _ADC_filter
movw R20,R16
.dbline 235
; break;
rjmp L52
L56:
.dbline 237
; case 0x03: //如果为10则启动CH2通道
; ADMUX=0x02;//寄存器后4位对应通道。2代表CH3通道。
ldi R24,2
out 0x7,R24
.dbline 238
; temp=ADC_filter();
rcall _ADC_filter
movw R20,R16
.dbline 239
; break;
rjmp L52
L57:
.dbline 241
; case 0x04: //如果为00则启动CH1通道
; ADMUX=0x03;//寄存器后4位对应通道。3代表CH4通道。
ldi R24,3
out 0x7,R24
.dbline 242
; temp=ADC_filter();
rcall _ADC_filter
movw R20,R16
.dbline 243
; break;
.dbline 244
; default:break;
L52:
.dbline 246
; }
; return temp;
movw R16,R20
.dbline -2
L50:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 i
.dbsym r adc_channel 22 c
.dbend
.dbfunc e ADC_filter _ADC_filter fi
; outdata -> R20,R21
; a -> R20,R21
; temp -> y+0
.even
_ADC_filter::
rcall push_gset1
sbiw R28,4
.dbline -1
.dbline 255
; }
; /*******************************************************************
; 函数功能:首先采集数据,然后三点中值滤波。同时解决第一次采集不准问题。
; 入口参数:无
; 出口参数:outdata,滤波后的结果
; 说明:
; *******************************************************/
; unsigned int ADC_filter(void)
; {
.dbline 259
; unsigned int a;
; unsigned int outdata;
; unsigned int temp[2];
; temp[0]=0;
clr R2
clr R3
std y+1,R3
std y+0,R2
.dbline 260
; temp[1]=0;
std y+3,R3
std y+2,R2
.dbline 261
; temp[2]=0;
std y+5,R3
std y+4,R2
.dbline 262
; ADC_Start();//丢弃第一次结果。
rcall _ADC_Start
.dbline 263
; AD_value10=0;//采集数据前先将变量清零。避免上一次的干扰。
clr R2
clr R3
sts _AD_value10+1,R3
sts _AD_value10,R2
.dbline 264
; ADC_Start();
rcall _ADC_Start
.dbline 265
; temp[0]=AD_value10;//AD转换结果
lds R2,_AD_value10
lds R3,_AD_value10+1
std y+1,R3
std y+0,R2
.dbline 266
; ADC_Start();
rcall _ADC_Start
.dbline 267
; temp[1]=AD_value10;//AD转换结果
lds R2,_AD_value10
lds R3,_AD_value10+1
std y+3,R3
std y+2,R2
.dbline 268
; ADC_Start();
rcall _ADC_Start
.dbline 269
; temp[2]=AD_value10;//AD转换结果
lds R2,_AD_value10
lds R3,_AD_value10+1
std y+5,R3
std y+4,R2
.dbline 271
; //下面的程序让数组从小到大排列
; if (temp[0]>temp[1])
ldd R2,y+2
ldd R3,y+3
ldd R4,y+0
ldd R5,y+1
cp R2,R4
cpc R3,R5
brsh L63
.dbline 272
; {
.dbline 273
; a=temp[1];
movw R20,R2
.dbline 274
; temp[1]=temp[0];
movw R2,R4
std y+3,R3
std y+2,R2
.dbline 275
; temp[0]=a;
std y+1,R21
std y+0,R20
.dbline 276
; }
L63:
.dbline 277
; if (temp[0]>temp[2])
ldd R2,y+4
ldd R3,y+5
ldd R4,y+0
ldd R5,y+1
cp R2,R4
cpc R3,R5
brsh L68
.dbline 278
; {
.dbline 279
; a=temp[2];
movw R20,R2
.dbline 280
; temp[2]=temp[0];
movw R2,R4
std y+5,R3
std y+4,R2
.dbline 281
; temp[0]=a;
std y+1,R21
std y+0,R20
.dbline 282
; }
L68:
.dbline 283
; if (temp[1]>temp[2])
ldd R2,y+4
ldd R3,y+5
ldd R4,y+2
ldd R5,y+3
cp R2,R4
cpc R3,R5
brsh L73
.dbline 284
; {
.dbline 285
; a=temp[2];
movw R20,R2
.dbline 286
; temp[2]=temp[1];
movw R2,R4
std y+5,R3
std y+4,R2
.dbline 287
; temp[1]=a;
std y+3,R21
std y+2,R20
.dbline 288
; }
L73:
.dbline 289
; outdata=temp[1];
ldd R20,y+2
ldd R21,y+3
.dbline 290
; return outdata;
movw R16,R20
.dbline -2
L58:
adiw R28,4
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r outdata 20 i
.dbsym r a 20 i
.dbsym l temp 0 A[4:2]i
.dbend
.dbfunc e ADC_Start _ADC_Start fV
.even
_ADC_Start::
.dbline -1
.dbline 299
; }
; /*******************************************************************
; 函数功能:AD采集,10位精度。
; 入口参数:无
; 出口参数:无
; 说明:
; *******************************************************/
; void ADC_Start(void)
; {
.dbline 300
; asm("NOP");//给通道切换留一点时间。
NOP
.dbline 301
; asm("NOP");
NOP
.dbline 302
; MCUCR =(1<<SE);//开启ADC休眠模式
ldi R24,128
out 0x35,R24
.dbline 303
; asm("SLEEP");
SLEEP
.dbline 304
; MCUCR =(0<<SE);//关闭ADC休眠模式,关闭SE位
clr R2
out 0x35,R2
.dbline -2
L82:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DAC_5617_10 _DAC_5617_10 fV
; TempH -> R22
; TempL -> R20
; dac_channel -> y+8
; dac_dataL -> R10
; dac_dataH -> R12
.even
_DAC_5617_10::
rcall push_gset4
mov R10,R18
mov R12,R16
.dbline -1
.dbline 316
;
; }
;
; /*******************************************************************
; 函数功能:DA传送数据,10位精度。固定通道A。
; 入口参数:dac_data8位数据。
; 出口参数:无
; 说明:
; *******************************************************/
;
; void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel)
; {
.dbline 318
; unsigned char TempL,TempH;
; if(dac_channel==0x01) //使用通道A。(即out1)
ldd R24,y+8
cpi R24,1
brne L84
.dbline 319
; {
.dbline 320
; set_cs;
sbi 0x18,2
.dbline 321
; TempH=0xc0;
ldi R22,192
.dbline 322
; TempL=0x00;
clr R20
.dbline 323
; TempH|=(dac_dataH<<2)|(dac_dataL>>6);
mov R2,R10
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
mov R3,R12
lsl R3
lsl R3
or R3,R2
or R22,R3
.dbline 324
; TempL|=(dac_dataL<<2);
mov R2,R10
lsl R2
lsl R2
or R20,R2
.dbline 325
; clr_cs;
in R24,0x18
andi R24,251
out 0x18,R24
.dbline 326
; SPI_Transmit(TempH);
mov R16,R22
rcall _SPI_Transmit
.dbline 327
; SPI_Transmit(TempL);
mov R16,R20
rcall _SPI_Transmit
.dbline 328
; set_cs;
sbi 0x18,2
.dbline 329
; }
rjmp L85
L84:
.dbline 330
; else if (dac_channel==0x02) //使用通道B。(即out2)
ldd R24,y+8
cpi R24,2
brne L86
.dbline 331
; {
.dbline 332
; set_cs;
sbi 0x18,2
.dbline 333
; TempH=0x40;
ldi R22,64
.dbline 334
; TempL=0x00;
clr R20
.dbline 335
; TempH|=(dac_dataH<<2)|(dac_dataL>>6);
mov R2,R10
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
mov R3,R12
lsl R3
lsl R3
or R3,R2
or R22,R3
.dbline 336
; TempL|=(dac_dataL<<2);
mov R2,R10
lsl R2
lsl R2
or R20,R2
.dbline 337
; clr_cs;
in R24,0x18
andi R24,251
out 0x18,R24
.dbline 338
; SPI_Transmit(TempH);
mov R16,R22
rcall _SPI_Transmit
.dbline 339
; SPI_Transmit(TempL);
mov R16,R20
rcall _SPI_Transmit
.dbline 340
; set_cs;
sbi 0x18,2
.dbline 341
; }
rjmp L87
L86:
.dbline 344
;
; else
; {
.dbline 345
; asm("NOP");
NOP
.dbline 346
; }
L87:
L85:
.dbline -2
L83:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r TempH 22 c
.dbsym r TempL 20 c
.dbsym l dac_channel 8 c
.dbsym r dac_dataL 10 c
.dbsym r dac_dataH 12 c
.dbend
.dbfunc e SPI_Transmit _SPI_Transmit fV
; i -> R20
; dac_data -> R16
.even
_SPI_Transmit::
rcall push_gset2
.dbline -1
.dbline 351
; }
; /*****************************************************************/
; //初始化spi
; void SPI_Transmit(unsigned char dac_data)
; {
.dbline 353
; unsigned char i;
; SPCR=0x58; //SPI使能?此句是不是必须的?
ldi R24,88
out 0xd,R24
.dbline 354
; SPDR=dac_data; //送值到SPDR
out 0xf,R16
L89:
.dbline 356
L90:
.dbline 355
; while(!SPSR&(1<<SPIF))
in R2,0xe
tst R2
brne L92
ldi R22,1
ldi R23,0
rjmp L93
L92:
clr R22
clr R23
L93:
sbrc R22,7
rjmp L89
.dbline 357
; ;
; for (i=0;i<3;i++)//保留足够的发送时间!!!
clr R20
rjmp L97
L94:
.dbline 358
.dbline 358
.dbline 358
L95:
.dbline 357
inc R20
L97:
.dbline 357
cpi R20,3
brlo L94
.dbline -2
L88:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r dac_data 16 c
.dbend
.dbfunc e IO_out _IO_out fV
; IO_channel -> R18
; IO_data -> R16
.even
_IO_out::
rcall push_gset1
.dbline -1
.dbline 368
; {;}
; }
; /******************************************************************
; 函数功能:IO输出数据。首先确定输出数据。然后给定输出通道。
; 入口参数:IO_data输出数据。IO_channel输出通道。
; 出口参数:无
; 说明:
; *******************************************************/
;
; void IO_out(unsigned char IO_data,unsigned char IO_channel)
; {
.dbline 370
;
; switch (IO_channel)
mov R20,R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -