📄 pro.lst
字号:
0501 E010 LDI R17,0
0502 940E00F2 CALL _delay_nus
0504 5041 SUBI R20,1
0505 4050 SBCI R21,0
0506 3040 CPI R20,0
0507 0745 CPC R20,R21
0508 F7B1 BNE 0x04FF
(0317) }
(0318) if(KeyScan()==15)
0509 DD26 RCALL _KeyScan
050A 300F CPI R16,0xF
050B E0E0 LDI R30,0
050C 071E CPC R17,R30
050D F419 BNE 0x0511
(0319) auto_flag=0;
050E 2422 CLR R2
050F 922000B8 STS auto_flag,R2
0511 918000B8 LDS R24,auto_flag
0513 3084 CPI R24,4
0514 F339 BEQ 0x04FC
(0320) }
(0321) break;
0515 940E08C1 CALL pop_gset1
0517 9508 RET
_function_DAC:
i --> R20
0518 940E08BE CALL push_gset1
(0322) /* case 4:
(0323) Write_Position(1,12);
(0324) Write_String("sin");
(0325) for(;auto_flag == 4;)
(0326) {
(0327)
(0328) uint i;
(0329) for(i=0;i<=200;i++)
(0330) {
(0331) DAC_DATA=Sin[i];
(0332) delay_nus(10);
(0333)
(0334) if(KeyScan()==15)
(0335) auto_flag=5;
(0336) }
(0337) break;*/
(0338) }
(0339)
(0340) }
(0341) void function_DAC()
(0342) {
(0343) if(ENTER==1)
051A 91800085 LDS R24,ENTER
051C 3081 CPI R24,1
051D F449 BNE 0x0527
(0344) {
(0345) ENTER=0;
051E 2422 CLR R2
051F 92200085 STS ENTER,R2
(0346) DAC_DATA=Set_Value;
0521 90200076 LDS R2,Set_Value
0523 90300077 LDS R3,Set_Value+1
0525 BA28 OUT 0x18,R2
(0347) control();
0526 D07B RCALL _control
(0348) }
(0349) if(ahead_flag)
0527 90200083 LDS R2,ahead_flag
0529 2022 TST R2
052A F091 BEQ 0x053D
(0350) {
(0351) ahead_flag=0;
052B 2422 CLR R2
052C 92200083 STS ahead_flag,R2
(0352) if(Set_Value<99)
052E 91800076 LDS R24,Set_Value
0530 91900077 LDS R25,Set_Value+1
0532 3683 CPI R24,0x63
0533 E0E0 LDI R30,0
0534 079E CPC R25,R30
0535 F438 BCC 0x053D
(0353) {
(0354) Set_Value++;
0536 9601 ADIW R24,1
0537 93900077 STS Set_Value+1,R25
0539 93800076 STS Set_Value,R24
(0355) DAC_DATA=Set_Value;
053B BB88 OUT 0x18,R24
(0356) control();
053C D065 RCALL _control
(0357) }
(0358) }
(0359)
(0360) if(back_flag)
053D 90200084 LDS R2,back_flag
053F 2022 TST R2
0540 F0B1 BEQ 0x0557
(0361) {
(0362) back_flag=0;
0541 2422 CLR R2
0542 92200084 STS back_flag,R2
(0363) if(Set_Value>0)
0544 90200076 LDS R2,Set_Value
0546 90300077 LDS R3,Set_Value+1
0548 2022 TST R2
0549 F411 BNE 0x054C
054A 2033 TST R3
054B F059 BEQ 0x0557
(0364) {
(0365) Set_Value--;
054C 91800076 LDS R24,Set_Value
054E 91900077 LDS R25,Set_Value+1
0550 9701 SBIW R24,1
0551 93900077 STS Set_Value+1,R25
0553 93800076 STS Set_Value,R24
(0366) DAC_DATA=Set_Value;
0555 BB88 OUT 0x18,R24
(0367) control();
0556 D04B RCALL _control
(0368) }
(0369) }
(0370)
(0371) if(clear_flag)
0557 90200082 LDS R2,clear_flag
0559 2022 TST R2
055A F149 BEQ 0x0584
(0372) {
(0373) uint i=0;
055B 2744 CLR R20
055C 2755 CLR R21
(0374) clear_flag=0;
055D 2422 CLR R2
055E 92200082 STS clear_flag,R2
(0375) auto_flag=0;
0560 922000B8 STS auto_flag,R2
(0376) cn=0;
0562 92200087 STS cn,R2
(0377) Clear_Screen;
0564 E001 LDI R16,1
0565 940E072E CALL _Write_Command
(0378) for(i=0;i<4;i++)
0567 C010 RJMP 0x0578
(0379) {
(0380) SET_VALUE[i]=0;
0568 E002 LDI R16,2
0569 E010 LDI R17,0
056A 019A MOVW R18,R20
056B 940E086D CALL empy16s
056D 01F8 MOVW R30,R16
056E EE85 LDI R24,0xE5
056F E090 LDI R25,0
0570 0FE8 ADD R30,R24
0571 1FF9 ADC R31,R25
0572 2422 CLR R2
0573 2433 CLR R3
0574 8231 STD Z+1,R3
0575 8220 STD Z+0,R2
0576 5F4F SUBI R20,0xFF
0577 4F5F SBCI R21,0xFF
0578 3044 CPI R20,4
0579 E0E0 LDI R30,0
057A 075E CPC R21,R30
057B F360 BCS 0x0568
(0381) }
(0382) Set_Value=0;
057C 2422 CLR R2
057D 2433 CLR R3
057E 92300077 STS Set_Value+1,R3
0580 92200076 STS Set_Value,R2
(0383) DAC_DATA=Set_Value;
0582 BA28 OUT 0x18,R2
(0384) control();
0583 D01E RCALL _control
(0385) }
0584 940E08C1 CALL pop_gset1
0586 9508 RET
_adc_isr:
voltage --> Y+0
0587 940E08FA CALL push_lset
0589 9724 SBIW R28,4
(0386) }
(0387)
(0388) uint temp_vol=0;
(0389) uint temp_value=0;
(0390) uchar temp_H,temp_L;
(0391) #pragma interrupt_handler adc_isr:15
(0392) void adc_isr(void)
(0393) {
(0394) unsigned long int voltage;
(0395) voltage=adc_calc();
058A 940E0796 CALL _adc_calc
058C 0118 MOVW R2,R16
058D 2444 CLR R4
058E 2455 CLR R5
058F 01FE MOVW R30,R28
0590 8220 STD Z+0,R2
0591 8231 STD Z+1,R3
0592 8242 STD Z+2,R4
0593 8253 STD Z+3,R5
(0396) Adverage_vol=voltage;
0594 01FE MOVW R30,R28
0595 8020 LDD R2,Z+0
0596 8031 LDD R3,Z+1
0597 923000F2 STS Adverage_vol+1,R3
0599 922000F1 STS Adverage_vol,R2
(0397) ad_flag=1;
059B E081 LDI R24,1
059C 93800069 STS ad_flag,R24
059E 9624 ADIW R28,4
059F 940E0911 CALL pop_lset
05A1 9518 RETI
(0398) }
(0399)
(0400) void control(void)
(0401) {
(0402) temp_vol=2*Adverage_vol+45;
_control:
05A2 912000F1 LDS R18,Adverage_vol
05A4 913000F2 LDS R19,Adverage_vol+1
05A6 E002 LDI R16,2
05A7 E010 LDI R17,0
05A8 940E086D CALL empy16s
05AA 01C8 MOVW R24,R16
05AB 968D ADIW R24,0x2D
05AC 939000BA STS temp_vol+1,R25
05AE 938000B9 STS temp_vol,R24
(0403) temp_vol=temp_vol/100;
05B0 E624 LDI R18,0x64
05B1 E030 LDI R19,0
05B2 018C MOVW R16,R24
05B3 940E07E2 CALL div16u
05B5 931000BA STS temp_vol+1,R17
05B7 930000B9 STS temp_vol,R16
(0404) temp_value=Set_Value;
05B9 90200076 LDS R2,Set_Value
05BB 90300077 LDS R3,Set_Value+1
05BD 923000BC STS temp_value+1,R3
05BF 922000BB STS temp_value,R2
(0405) if(cn ==0)
05C1 90200087 LDS R2,cn
05C3 2022 TST R2
05C4 F009 BEQ 0x05C6
05C5 C086 RJMP 0x064C
(0406) {
05C6 C036 RJMP 0x05FD
(0407) while(temp_vol < Set_Value)
(0408) {
(0409) if(temp_value>=255);
05C7 918000BB LDS R24,temp_value
05C9 919000BC LDS R25,temp_value+1
05CB 3F8F CPI R24,0xFF
05CC E0E0 LDI R30,0
05CD 079E CPC R25,R30
05CE F008 BCS 0x05D0
05CF C009 RJMP 0x05D9
(0410) else
(0411) temp_value++;
05D0 918000BB LDS R24,temp_value
05D2 919000BC LDS R25,temp_value+1
05D4 9601 ADIW R24,1
05D5 939000BC STS temp_value+1,R25
05D7 938000BB STS temp_value,R24
(0412) DAC_DATA=temp_value;
05D9 902000BB LDS R2,temp_value
05DB 903000BC LDS R3,temp_value+1
05DD BA28 OUT 0x18,R2
(0413) ADCSRA|=BIT(ADSC);
05DE 9A36 SBI 0x06,6
(0414) while(!ad_flag);
05DF 90200069 LDS R2,ad_flag
05E1 2022 TST R2
05E2 F3E1 BEQ 0x05DF
(0415) ad_flag=0;
05E3 2422 CLR R2
05E4 92200069 STS ad_flag,R2
(0416) temp_vol=(unsigned int)2*Adverage_vol+40;
05E6 912000F1 LDS R18,Adverage_vol
05E8 913000F2 LDS R19,Adverage_vol+1
05EA E002 LDI R16,2
05EB E010 LDI R17,0
05EC 940E086D CALL empy16s
05EE 01C8 MOVW R24,R16
05EF 9688 ADIW R24,0x28
05F0 939000BA STS temp_vol+1,R25
05F2 938000B9 STS temp_vol,R24
(0417) temp_vol=(unsigned int)temp_vol/100;
05F4 E624 LDI R18,0x64
05F5 E030 LDI R19,0
05F6 018C MOVW R16,R24
05F7 940E07E2 CALL div16u
05F9 931000BA STS temp_vol+1,R17
05FB 930000B9 STS temp_vol,R16
05FD 90200076 LDS R2,Set_Value
05FF 90300077 LDS R3,Set_Value+1
0601 904000B9 LDS R4,temp_vol
0603 905000BA LDS R5,temp_vol+1
0605 1442 CP R4,R2
0606 0453 CPC R5,R3
0607 F408 BCC 0x0609
0608 CFBE RJMP 0x05C7
0609 C036 RJMP 0x0640
(0418) }
(0419)
(0420) while(temp_vol> Set_Value)
(0421) {
(0422) if(temp_value <=0) ;
060A 902000BB LDS R2,temp_value
060C 903000BC LDS R3,temp_value+1
060E 2022 TST R2
060F F419 BNE 0x0613
0610 2033 TST R3
0611 F409 BNE 0x0613
0612 C009 RJMP 0x061C
(0423) else
(0424) temp_value--;
0613 918000BB LDS R24,temp_value
0615 919000BC LDS R25,temp_value+1
0617 9701 SBIW R24,1
0618 939000BC STS temp_value+1,R25
061A 938000BB STS temp_value,R24
(0425) DAC_DATA=temp_value;
061C 902000BB LDS R2,temp_value
061E 903000BC LDS R3,temp_value+1
0620 BA28 OUT 0x18,R2
(0426) ADCSRA|=BIT(ADSC);
0621 9A36 SBI 0x06,6
(0427) while(!ad_flag);
0622 90200069 LDS R2,ad_flag
0624 2022 TST R2
0625 F3E1 BEQ 0x0622
(0428) ad_flag=0;
0626 2422 CLR R2
0627 92200069 STS ad_flag,R2
(0429) temp_vol=(unsigned int)2*Adverage_vol+40;
0629 912000F1 LDS R18,Adverage_vol
062B 913000F2 LDS R19,Adverage_vol+1
062D E002 LDI R16,2
062E E010 LDI R17,0
062F 940E086D CALL empy16s
0631 01C8 MOVW R24,R16
0632 9688 ADIW R24,0x28
0633 939000BA STS temp_vol+1,R25
0635 938000B9 STS temp_vol,R24
(0430) temp_vol=(unsigned int)temp_vol/100;
0637 E624 LDI R18,0x64
0638 E030 LDI R19,0
0639 018C MOVW R16,R24
063A 940E07E2 CALL div16u
063C 931000BA STS temp_vol+1,R17
063E 930000B9 STS temp_vol,R16
0640 90200076 LDS R2,Set_Value
0642 90300077 LDS R3,Set_Value+1
0644 904000B9 LDS R4,temp_vol
0646 905000BA LDS R5,temp_vol+1
0648 1424 CP R2,R4
0649 0435 CPC R3,R5
064A F408 BCC 0x064C
064B CFBE RJMP 0x060A
(0431) }
(0432) }
064C 9508 RET
(0433) }
(0434)
(0435)
(0436) //端口初始化
(0437) void port_init(void)
(0438) {
(0439) PORTA = 0x00;//低三位作为1602控制端
_port_init:
064D 2422 CLR R2
064E BA2B OUT 0x1B,R2
(0440) DDRA = 0x07;//低三位作为1602控制端
064F E087 LDI R24,7
0650 BB8A OUT 0x1A,R24
(0441) PORTD = 0x0F;//矩阵键盘的接口
0651 E08F LDI R24,0xF
0652 BB82 OUT 0x12,R24
(0442) DDRD = 0xF0;
0653 EF80 LDI R24,0xF0
0654 BB81 OUT 0x11,R24
(0443) PORTB = 0x00;//DAC0832的数据控制端
0655 BA28 OUT 0x18,R2
(0444) DDRB = 0xFF;//DAC0832的数据控制端
0656 EF8F LDI R24,0xFF
0657 BB87 OUT 0x17,R24
(0445) PORTC = 0x00;//PC口作为1602的数据端
0658 BA25 OUT 0x15,R2
(0446) DDRC = 0xFF;//PC口作为1602的数据端
0659 BB84 OUT 0x14,R24
065A 9508 RET
(0447) }
(0448)
(0449) //定时器T0初始化
(0450) void timer0_init(void)
(0451) {
(0452) TCCR0 = 0x00;//停止定时器
_timer0_init:
065B 2422 CLR R2
065C BE23 OUT 0x33,R2
(0453) TCNT0 = 0x25;//初始值
065D E285 LDI R24,0x25
065E BF82 OUT 0x32,R24
(0454) OCR0 = 0xC0;//匹配值
065F EC80 LDI R24,0xC0
0660 BF8C OUT 0x3C,R24
(0455) TIMSK |= 0x02;//中断允许
0661 B789 IN R24,0x39
0662 6082 ORI R24,2
0663 BF89 OUT 0x39,R24
(0456) TCCR0 = 0x04;//启动定时器
0664 E084 LDI R24,4
0665 BF83 OUT 0x33,R24
0666 9508 RET
_timer0_comp_isr:
0667 922A ST R2,-Y
0668 923A ST R3,-Y
0669 938A ST R24,-Y
066A 939A ST R25,-Y
066B 93EA ST R30,-Y
066C B62F IN R2,0x3F
066D 922A ST R2,-Y
(0457) }
(0458)
(0459)
(0460) //T0比较中断服务程序
(0461) #pragma interrupt_handler timer0_comp_isr:20
(0462) void timer0_comp_isr(void)
(0463) {
(0464) //中断发生时刻在TCNT0=OCR0
(0465)
(0466) if(++counter>=4)
066E 9180006C LDS R24,counter
0670 9190006D LDS R25,counter+1
0672 9601 ADIW R24,1
0673 9390006D STS counter+1,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -