📄 fjv14.lst
字号:
010E 9508 RET
_USART_Recive:
y --> R20
010F D1D9 RCALL push_gset1
(0186) break;
(0187) default:break;
(0188) }
(0189) }
(0190)
(0191) }
(0192) }
(0193) /**************************************************************************/
(0194) //串口接收数据
(0195) unsigned char USART_Recive(void)
(0196) {
(0197) unsigned char y;
(0198) //等待接收数据
(0199) while(!(UCSRA&(1<<RXC)));
0110 9B5F SBIS 0x0B,7
0111 CFFE RJMP 0x0110
(0200) y=getchar(); //接收数据
0112 D1ED RCALL _getchar
0113 2F40 MOV R20,R16
(0201)
(0202) return y;
0114 D1D7 RCALL pop_gset1
0115 9508 RET
(0203) }
(0204) /*******************************************************************/
(0205) //串口发送数据
(0206) void USART_Transmit(unsigned char tdata)
(0207) {
(0208) //等待数据寄存器空
(0209) UDR=tdata;
_USART_Transmit:
tdata --> R16
0116 B90C OUT 0x0C,R16
(0210) while(!(UCSRA&(1<<UDRE)))
0117 9B5D SBIS 0x0B,5
0118 CFFE RJMP 0x0117
0119 9508 RET
_ADC_Value:
temp --> R20
adc_channel --> R22
011A D1CC RCALL push_gset2
011B 2F60 MOV R22,R16
(0211) ;
(0212)
(0213)
(0214) }
(0215) /******************************************************************/
(0216) /*******************************************************************
(0217) 函数功能:AD数据、通道采集,10位精度。
(0218) 入口参数:adc_channel通道选择。
(0219) 出口参数:AD采集的数据
(0220) 说明:此处可以加入中值滤波程序。使用ADC降噪中断方式
(0221) *******************************************************/
(0222) unsigned int ADC_Value (unsigned char adc_channel)
(0223) {
(0224) unsigned int temp;
(0225) temp=0;
011C 2744 CLR R20
011D 2755 CLR R21
(0226) switch (adc_channel)
011E 2777 CLR R23
011F 3061 CPI R22,1
0120 E0E0 LDI R30,0
0121 077E CPC R23,R30
0122 F069 BEQ 0x0130
0123 3062 CPI R22,2
0124 E0E0 LDI R30,0
0125 077E CPC R23,R30
0126 F071 BEQ 0x0135
0127 3063 CPI R22,3
0128 E0E0 LDI R30,0
0129 077E CPC R23,R30
012A F079 BEQ 0x013A
012B 3064 CPI R22,4
012C E0E0 LDI R30,0
012D 077E CPC R23,R30
012E F081 BEQ 0x013F
012F C013 RJMP 0x0143
(0227) {
(0228) case 0x01: //如果为00则启动CH1通道
(0229) ADMUX=0x00;//寄存器后4位对应通道。0代表CH1通道。
0130 2422 CLR R2
0131 B827 OUT 0x07,R2
(0230) temp=ADC_filter();
0132 D013 RCALL _ADC_filter
0133 01A8 MOVW R20,R16
(0231) break;
0134 C00E RJMP 0x0143
(0232) case 0x02: //如果为01则启动CH2通道
(0233) ADMUX=0x01;//寄存器后4位对应通道。1代表CH2通道。
0135 E081 LDI R24,1
0136 B987 OUT 0x07,R24
(0234) temp=ADC_filter();
0137 D00E RCALL _ADC_filter
0138 01A8 MOVW R20,R16
(0235) break;
0139 C009 RJMP 0x0143
(0236) case 0x03: //如果为10则启动CH2通道
(0237) ADMUX=0x02;//寄存器后4位对应通道。2代表CH3通道。
013A E082 LDI R24,2
013B B987 OUT 0x07,R24
(0238) temp=ADC_filter();
013C D009 RCALL _ADC_filter
013D 01A8 MOVW R20,R16
(0239) break;
013E C004 RJMP 0x0143
(0240) case 0x04: //如果为00则启动CH1通道
(0241) ADMUX=0x03;//寄存器后4位对应通道。3代表CH4通道。
013F E083 LDI R24,3
0140 B987 OUT 0x07,R24
(0242) temp=ADC_filter();
0141 D004 RCALL _ADC_filter
0142 01A8 MOVW R20,R16
(0243) break;
(0244) default:break;
(0245) }
(0246) return temp;
0143 018A MOVW R16,R20
0144 D198 RCALL pop_gset2
0145 9508 RET
_ADC_filter:
outdata --> R20
a --> R20
temp --> Y+0
0146 D1A2 RCALL push_gset1
0147 9724 SBIW R28,4
(0247) }
(0248) /*******************************************************************
(0249) 函数功能:首先采集数据,然后三点中值滤波。同时解决第一次采集不准问题。
(0250) 入口参数:无
(0251) 出口参数:outdata,滤波后的结果
(0252) 说明:
(0253) *******************************************************/
(0254) unsigned int ADC_filter(void)
(0255) {
(0256) unsigned int a;
(0257) unsigned int outdata;
(0258) unsigned int temp[2];
(0259) temp[0]=0;
0148 2422 CLR R2
0149 2433 CLR R3
014A 8239 STD Y+1,R3
014B 8228 STD Y+0,R2
(0260) temp[1]=0;
014C 823B STD Y+3,R3
014D 822A STD Y+2,R2
(0261) temp[2]=0;
014E 823D STD Y+5,R3
014F 822C STD Y+4,R2
(0262) ADC_Start();//丢弃第一次结果。
0150 D048 RCALL _ADC_Start
(0263) AD_value10=0;//采集数据前先将变量清零。避免上一次的干扰。
0151 2422 CLR R2
0152 2433 CLR R3
0153 92300061 STS AD_value10+1,R3
0155 92200060 STS AD_value10,R2
(0264) ADC_Start();
0157 D041 RCALL _ADC_Start
(0265) temp[0]=AD_value10;//AD转换结果
0158 90200060 LDS R2,AD_value10
015A 90300061 LDS R3,AD_value10+1
015C 8239 STD Y+1,R3
015D 8228 STD Y+0,R2
(0266) ADC_Start();
015E D03A RCALL _ADC_Start
(0267) temp[1]=AD_value10;//AD转换结果
015F 90200060 LDS R2,AD_value10
0161 90300061 LDS R3,AD_value10+1
0163 823B STD Y+3,R3
0164 822A STD Y+2,R2
(0268) ADC_Start();
0165 D033 RCALL _ADC_Start
(0269) temp[2]=AD_value10;//AD转换结果
0166 90200060 LDS R2,AD_value10
0168 90300061 LDS R3,AD_value10+1
016A 823D STD Y+5,R3
016B 822C STD Y+4,R2
(0270) //下面的程序让数组从小到大排列
(0271) if (temp[0]>temp[1])
016C 802A LDD R2,Y+2
016D 803B LDD R3,Y+3
016E 8048 LDD R4,Y+0
016F 8059 LDD R5,Y+1
0170 1424 CP R2,R4
0171 0435 CPC R3,R5
0172 F430 BCC 0x0179
(0272) {
(0273) a=temp[1];
0173 01A1 MOVW R20,R2
(0274) temp[1]=temp[0];
0174 0112 MOVW R2,R4
0175 823B STD Y+3,R3
0176 822A STD Y+2,R2
(0275) temp[0]=a;
0177 8359 STD Y+1,R21
0178 8348 STD Y+0,R20
(0276) }
(0277) if (temp[0]>temp[2])
0179 802C LDD R2,Y+4
017A 803D LDD R3,Y+5
017B 8048 LDD R4,Y+0
017C 8059 LDD R5,Y+1
017D 1424 CP R2,R4
017E 0435 CPC R3,R5
017F F430 BCC 0x0186
(0278) {
(0279) a=temp[2];
0180 01A1 MOVW R20,R2
(0280) temp[2]=temp[0];
0181 0112 MOVW R2,R4
0182 823D STD Y+5,R3
0183 822C STD Y+4,R2
(0281) temp[0]=a;
0184 8359 STD Y+1,R21
0185 8348 STD Y+0,R20
(0282) }
(0283) if (temp[1]>temp[2])
0186 802C LDD R2,Y+4
0187 803D LDD R3,Y+5
0188 804A LDD R4,Y+2
0189 805B LDD R5,Y+3
018A 1424 CP R2,R4
018B 0435 CPC R3,R5
018C F430 BCC 0x0193
(0284) {
(0285) a=temp[2];
018D 01A1 MOVW R20,R2
(0286) temp[2]=temp[1];
018E 0112 MOVW R2,R4
018F 823D STD Y+5,R3
0190 822C STD Y+4,R2
(0287) temp[1]=a;
0191 835B STD Y+3,R21
0192 834A STD Y+2,R20
(0288) }
(0289) outdata=temp[1];
0193 814A LDD R20,Y+2
0194 815B LDD R21,Y+3
(0290) return outdata;
0195 018A MOVW R16,R20
0196 9624 ADIW R28,4
0197 D154 RCALL pop_gset1
0198 9508 RET
(0291) }
(0292) /*******************************************************************
(0293) 函数功能:AD采集,10位精度。
(0294) 入口参数:无
(0295) 出口参数:无
(0296) 说明:
(0297) *******************************************************/
(0298) void ADC_Start(void)
(0299) {
(0300) asm("NOP");//给通道切换留一点时间。
_ADC_Start:
0199 0000 NOP
(0301) asm("NOP");
019A 0000 NOP
(0302) MCUCR =(1<<SE);//开启ADC休眠模式
019B E880 LDI R24,0x80
019C BF85 OUT 0x35,R24
(0303) asm("SLEEP");
019D 9588 SLEEP
(0304) MCUCR =(0<<SE);//关闭ADC休眠模式,关闭SE位
019E 2422 CLR R2
019F BE25 OUT 0x35,R2
01A0 9508 RET
_DAC_5617_10:
TempH --> R22
TempL --> R20
dac_channel --> Y+8
dac_dataL --> R10
dac_dataH --> R12
01A1 D141 RCALL push_gset4
01A2 2EA2 MOV R10,R18
01A3 2EC0 MOV R12,R16
(0305)
(0306) }
(0307)
(0308) /*******************************************************************
(0309) 函数功能:DA传送数据,10位精度。固定通道A。
(0310) 入口参数:dac_data8位数据。
(0311) 出口参数:无
(0312) 说明:
(0313) *******************************************************/
(0314)
(0315) void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel)
(0316) {
(0317) unsigned char TempL,TempH;
(0318) if(dac_channel==0x01) //使用通道A。(即out1)
01A4 8588 LDD R24,Y+8
01A5 3081 CPI R24,1
01A6 F4E1 BNE 0x01C3
(0319) {
(0320) set_cs;
01A7 9AC2 SBI 0x18,2
(0321) TempH=0xc0;
01A8 EC60 LDI R22,0xC0
(0322) TempL=0x00;
01A9 2744 CLR R20
(0323) TempH|=(dac_dataH<<2)|(dac_dataL>>6);
01AA 2C2A MOV R2,R10
01AB 9426 LSR R2
01AC 9426 LSR R2
01AD 9426 LSR R2
01AE 9426 LSR R2
01AF 9426 LSR R2
01B0 9426 LSR R2
01B1 2C3C MOV R3,R12
01B2 0C33 LSL R3
01B3 0C33 LSL R3
01B4 2832 OR R3,R2
01B5 2963 OR R22,R3
(0324) TempL|=(dac_dataL<<2);
01B6 2C2A MOV R2,R10
01B7 0C22 LSL R2
01B8 0C22 LSL R2
01B9 2942 OR R20,R2
(0325) clr_cs;
01BA B388 IN R24,0x18
01BB 7F8B ANDI R24,0xFB
01BC BB88 OUT 0x18,R24
(0326) SPI_Transmit(TempH);
01BD 2F06 MOV R16,R22
01BE D026 RCALL _SPI_Transmit
(0327) SPI_Transmit(TempL);
01BF 2F04 MOV R16,R20
01C0 D024 RCALL _SPI_Transmit
(0328) set_cs;
01C1 9AC2 SBI 0x18,2
(0329) }
01C2 C020 RJMP 0x01E3
(0330) else if (dac_channel==0x02) //使用通道B。(即out2)
01C3 8588 LDD R24,Y+8
01C4 3082 CPI R24,2
01C5 F4E1 BNE 0x01E2
(0331) {
(0332) set_cs;
01C6 9AC2 SBI 0x18,2
(0333) TempH=0x40;
01C7 E460 LDI R22,0x40
(0334) TempL=0x00;
01C8 2744 CLR R20
(0335) TempH|=(dac_dataH<<2)|(dac_dataL>>6);
01C9 2C2A MOV R2,R10
01CA 9426 LSR R2
01CB 9426 LSR R2
01CC 9426 LSR R2
01CD 9426 LSR R2
01CE 9426 LSR R2
01CF 9426 LSR R2
01D0 2C3C MOV R3,R12
01D1 0C33 LSL R3
01D2 0C33 LSL R3
01D3 2832 OR R3,R2
01D4 2963 OR R22,R3
(0336) TempL|=(dac_dataL<<2);
01D5 2C2A MOV R2,R10
01D6 0C22 LSL R2
01D7 0C22 LSL R2
01D8 2942 OR R20,R2
(0337) clr_cs;
01D9 B388 IN R24,0x18
01DA 7F8B ANDI R24,0xFB
01DB BB88 OUT 0x18,R24
(0338) SPI_Transmit(TempH);
01DC 2F06 MOV R16,R22
01DD D007 RCALL _SPI_Transmit
(0339) SPI_Transmit(TempL);
01DE 2F04 MOV R16,R20
01DF D005 RCALL _SPI_Transmit
(0340) set_cs;
01E0 9AC2 SBI 0x18,2
(0341) }
01E1 C001 RJMP 0x01E3
(0342)
(0343) else
(0344) {
(0345) asm("NOP");
01E2 0000 NOP
(0346) }
01E3 D0FB RCALL pop_gset4
01E4 9508 RET
_SPI_Transmit:
i --> R20
dac_data --> R16
01E5 D101 RCALL push_gset2
(0347) }
(0348) /*****************************************************************/
(0349) //初始化spi
(0350) void SPI_Transmit(unsigned char dac_data)
(0351) {
(0352) unsigned char i;
(0353) SPCR=0x58; //SPI使能?此句是不是必须的?
01E6 E588 LDI R24,0x58
01E7 B98D OUT 0x0D,R24
(0354) SPDR=dac_data; //送值到SPDR
01E8 B90F OUT 0x0F,R16
(0355) while(!SPSR&(1<<SPIF))
01E9 B02E IN R2,0x0E
01EA 2022 TST R2
01EB F419 BNE 0x01EF
01EC E061 LDI R22,1
01ED E070 LDI R23,0
01EE C002 RJMP 0x01F1
01EF 2766 CLR R22
01F0 2777 CLR R23
01F1 FD67 SBRC R22,7
01F2 CFF6 RJMP 0x01E9
(0356) ;
(0357) for (i=0;i<3;i++)//保留足够的发送时间!!!
01F3 2744 CLR R20
01F4 C001 RJMP 0x01F6
01F5 9543 INC R20
01F6 3043 CPI R20,3
01F7 F3E8 BCS 0x01F5
01F8 D0E4 RCALL pop_gset2
01F9 9508 RET
_IO_out:
IO_channel --> R18
IO_data --> R16
01FA D0EE RCALL push_gset1
(0358) {;}
(0359) }
(0360) /******************************************************************
(0361) 函数功能:IO输出数据。首先确定输出数据。然后给定输出通道。
(0362) 入口参数:IO_data输出数据。IO_channel输出通道。
(0363) 出口参数:无
(0364) 说明:
(0365) *******************************************************/
(0366)
(0367) void IO_out(unsigned char IO_data,unsigned char IO_channel)
(0368) {
(0369)
(0370) switch (IO_channel)
01FB 2F42 MOV R20,R18
01FC 2755 CLR R21
01FD 3040 CPI R20,0
01FE 0745 CPC R20,R21
01FF F0C1 BEQ 0x0218
0200 3041 CPI R20,1
0201 E0E0 LDI R30,0
0202 075E CPC R21,R30
0203 F111 BEQ 0x0226
0204 3044 CPI R20,4
0205 E0E0 LDI R30,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -