📄 电池放电器v2.lst
字号:
(0111) {delay_nus(1000);}
04A6 EE08 LDI R16,0xE8
04A7 E013 LDI R17,3
04A8 D007 RCALL _delay_nus
04A9 5F4F SUBI R20,0xFF
04AA 4F5F SBCI R21,0xFF
04AB 1746 CP R20,R22
04AC 0757 CPC R21,R23
04AD F3C0 BCS 0x04A6
04AE DA7E RCALL pop_gset2
04AF 9508 RET
_delay_nus:
i --> R20
n --> R16
04B0 DA8C RCALL push_gset1
(0112) }
(0113)
(0114) void delay_nus(unsigned int n)//延时N微秒,N>=5 晶振:8MHz
(0115) {
(0116) unsigned int i;
(0117) for (i=5;i<n;i++)
04B1 E045 LDI R20,5
04B2 E050 LDI R21,0
04B3 C004 RJMP 0x04B8
(0118) {
(0119) asm("nop");
04B4 0000 NOP
(0120) asm("nop");
04B5 0000 NOP
04B6 5F4F SUBI R20,0xFF
04B7 4F5F SBCI R21,0xFF
04B8 1740 CP R20,R16
04B9 0751 CPC R21,R17
04BA F3C8 BCS 0x04B4
04BB DA84 RCALL pop_gset1
04BC 9508 RET
_timer2_ovf_isr:
04BD DA96 RCALL push_lset
FILE: E:\刻录的\电子技术\项目\电池放电器\软件V2.0\discharger.c
(0001) //项目名称:电池容量测试器V2.0
(0002) //功能描述:通过对电池放电,测量出电池的容量
(0003) //外部模块:1602LCD
(0004) //开发人员:李卓生
(0005) //开发日期:2006年2月16日
(0006) //最后修正: 2006年2月27日
(0007) //*********************************************************
(0008) #include <iom8v.h>
(0009) #include <macros.h>
(0010) #include "discharge.h"
(0011) #include "LCD_1602.h"
(0012) #include "eeprom.h"
(0013)
(0014) #define key_delay 64
(0015) #define keyboard_scan 16
(0016) #define lcd_write 32
(0017) #define timer_dealy 125
(0018)
(0019) const char *Menu[]=//系统菜单
(0020) {"Menu","Discharging","D882","Record","Clear","USART","#"};
(0021)
(0022) unsigned char path_top,path;
(0023) //系统参数
(0024) unsigned char sec=0;
(0025) unsigned char min=0;
(0026) unsigned char hour=0;
(0027) unsigned char keyboard;
(0028) unsigned char RunTab=1;
(0029) unsigned char RunTab_old;
(0030)
(0031) unsigned char sc_timer_dealy,sc_keyboard_scan,sc_lcd_write,sc_key_delay;//定时小于255*31.25ms的
(0032) unsigned int sc_bt1,sc_bt_ctrl,sc_eeprom,sc_discharge,sc_bt1_record,sc_bt1_v_temp;
(0033) /*//LED灯控制参数
(0034) unsigned int G_led,G_led_cy,G_led_ht;
(0035) unsigned int sc_G_cy,sc_G_ht;
(0036)
(0037) unsigned int R_led,R_led_cy,R_led_ht;
(0038) unsigned int sc_R_cy,sc_R_ht;
(0039) */
(0040) // discharge
(0041) unsigned char BT1_state;
(0042) unsigned int BT1_V;
(0043) unsigned int BT1_I;
(0044) unsigned int BT1_T;
(0045) unsigned int BT1_V_num;
(0046) unsigned int BT1_V_num_temp;
(0047) unsigned int bt1_v_temp;
(0048) unsigned int bt1_v_temp_1;
(0049)
(0050) unsigned int BT1_I_SET;
(0051) unsigned int PWM;
(0052) unsigned long BT1_mAh;
(0053) unsigned long BT1_time;
(0054) unsigned int mAh;
(0055) unsigned int D882_P;
(0056)
(0057) unsigned int mAh_set=1000;
(0058) unsigned char speed=10;
(0059) unsigned int BT1_P;
(0060) //T2溢出中断服务程序 8ms
(0061) #pragma interrupt_handler timer2_ovf_isr:5
(0062) void timer2_ovf_isr(void)
(0063) {
(0064) TCNT2 = 0x06;//重装计时值0xFF=32us 0x00=8.192ms
04BE E086 LDI R24,6
04BF BD84 OUT 0x24,R24
(0065) system_clock();//系统定时器
04C0 D117 RCALL _system_clock
(0066) system();//系统后台服务程序
04C1 D00D RCALL _system
(0067) //Green_led(); Red_led();
(0068) if(RunTab_old!=RunTab)
04C2 90200074 LDS R2,RunTab
04C4 903000EC LDS R3,RunTab_old
04C6 1432 CP R3,R2
04C7 F029 BEQ 0x04CD
(0069) {LCD_clear();RunTab_old=RunTab;}
04C8 DC99 RCALL _LCD_clear
04C9 90200074 LDS R2,RunTab
04CB 922000EC STS RunTab_old,R2
04CD DA9D RCALL pop_lset
04CE 9518 RETI
_system:
04CF DA6B RCALL push_gset2
04D0 9722 SBIW R28,2
(0070) }
(0071) /*----------------------------------
(0072) 系统后台服务程序
(0073) -----------------------------------*/
(0074) void system(void)
(0075) {
(0076) if(sc_timer_dealy==0){timer(); sc_timer_dealy=timer_dealy;}
04D1 902000EB LDS R2,sc_timer_dealy
04D3 2022 TST R2
04D4 F421 BNE 0x04D9
04D5 D968 RCALL _timer
04D6 E78D LDI R24,0x7D
04D7 938000EB STS sc_timer_dealy,R24
(0077) if((sc_key_delay==0)&&(keyboard!=0)){sc_key_delay=key_delay;}
04D9 902000E8 LDS R2,sc_key_delay
04DB 2022 TST R2
04DC F439 BNE 0x04E4
04DD 902000ED LDS R2,keyboard
04DF 2022 TST R2
04E0 F019 BEQ 0x04E4
04E1 E480 LDI R24,0x40
04E2 938000E8 STS sc_key_delay,R24
(0078) if(sc_key_delay==1){keyboard=0;}
04E4 918000E8 LDS R24,sc_key_delay
04E6 3081 CPI R24,1
04E7 F419 BNE 0x04EB
04E8 2422 CLR R2
04E9 922000ED STS keyboard,R2
(0079) if(sc_keyboard_scan==0)
04EB 902000EA LDS R2,sc_keyboard_scan
04ED 2022 TST R2
04EE F441 BNE 0x04F7
(0080) {keyboard=key(keyboard);sc_keyboard_scan=keyboard_scan;}
04EF 910000ED LDS R16,keyboard
04F1 DB96 RCALL _key
04F2 930000ED STS keyboard,R16
04F4 E180 LDI R24,0x10
04F5 938000EA STS sc_keyboard_scan,R24
(0081) if(sc_lcd_write==0)
04F7 902000E9 LDS R2,sc_lcd_write
04F9 2022 TST R2
04FA F429 BNE 0x0500
(0082) {Run_Turn();LCD_write_new();sc_lcd_write=lcd_write;}
04FB D163 RCALL _Run_Turn
04FC DE6C RCALL _LCD_write_new
04FD E280 LDI R24,0x20
04FE 938000E9 STS sc_lcd_write,R24
(0083)
(0084) if((BT1_I_SET)/*&&(sc_bt1_record==0)*/)
0500 902000CB LDS R2,BT1_I_SET
0502 903000CC LDS R3,BT1_I_SET+1
0504 2022 TST R2
0505 F419 BNE 0x0509
0506 2033 TST R3
0507 F409 BNE 0x0509
0508 C0A2 RJMP 0x05AB
(0085) {
(0086) if(sc_bt1==0)
0509 902000E6 LDS R2,sc_bt1
050B 903000E7 LDS R3,sc_bt1+1
050D 2022 TST R2
050E F511 BNE 0x0531
050F 2033 TST R3
0510 F501 BNE 0x0531
(0087) {BT1_mAh+=BT1_I;sc_bt1=450;}//容量统计,每3.6秒计一次
0511 902000D7 LDS R2,BT1_I
0513 903000D8 LDS R3,BT1_I+1
0515 2444 CLR R4
0516 2455 CLR R5
0517 908000C7 LDS R8,BT1_mAh+2
0519 909000C8 LDS R9,BT1_mAh+3
051B 906000C5 LDS R6,BT1_mAh
051D 907000C6 LDS R7,BT1_mAh+1
051F 0C62 ADD R6,R2
0520 1C73 ADC R7,R3
0521 1C84 ADC R8,R4
0522 1C95 ADC R9,R5
0523 927000C6 STS BT1_mAh+1,R7
0525 926000C5 STS BT1_mAh,R6
0527 929000C8 STS BT1_mAh+3,R9
0529 928000C7 STS BT1_mAh+2,R8
052B EC82 LDI R24,0xC2
052C E091 LDI R25,1
052D 939000E7 STS sc_bt1+1,R25
052F 938000E6 STS sc_bt1,R24
(0088) if(sc_discharge==0)
0531 902000E0 LDS R2,sc_discharge
0533 903000E1 LDS R3,sc_discharge+1
0535 2022 TST R2
0536 F501 BNE 0x0557
0537 2033 TST R3
0538 F4F1 BNE 0x0557
(0089) {BT1_time++;sc_discharge=125;}//放电时间统计
0539 E041 LDI R20,1
053A E050 LDI R21,0
053B E060 LDI R22,0
053C E070 LDI R23,0
053D 904000C3 LDS R4,BT1_time+2
053F 905000C4 LDS R5,BT1_time+3
0541 902000C1 LDS R2,BT1_time
0543 903000C2 LDS R3,BT1_time+1
0545 0E24 ADD R2,R20
0546 1E35 ADC R3,R21
0547 1E46 ADC R4,R22
0548 1E57 ADC R5,R23
0549 923000C2 STS BT1_time+1,R3
054B 922000C1 STS BT1_time,R2
054D 925000C4 STS BT1_time+3,R5
054F 924000C3 STS BT1_time+2,R4
0551 E78D LDI R24,0x7D
0552 E090 LDI R25,0
0553 939000E1 STS sc_discharge+1,R25
0555 938000E0 STS sc_discharge,R24
(0090) if(sc_bt1_v_temp==0)
0557 902000DC LDS R2,sc_bt1_v_temp
0559 903000DD LDS R3,sc_bt1_v_temp+1
055B 2022 TST R2
055C F4B1 BNE 0x0573
055D 2033 TST R3
055E F4A1 BNE 0x0573
(0091) {bt1_v_temp+=BT1_V;sc_bt1_v_temp=500;}
055F 902000D9 LDS R2,BT1_V
0561 903000DA LDS R3,BT1_V+1
0563 904000CF LDS R4,bt1_v_temp
0565 905000D0 LDS R5,bt1_v_temp+1
0567 0C42 ADD R4,R2
0568 1C53 ADC R5,R3
0569 925000D0 STS bt1_v_temp+1,R5
056B 924000CF STS bt1_v_temp,R4
056D EF84 LDI R24,0xF4
056E E091 LDI R25,1
056F 939000DD STS sc_bt1_v_temp+1,R25
0571 938000DC STS sc_bt1_v_temp,R24
(0092) if(sc_bt1_record==0)
0573 902000DE LDS R2,sc_bt1_record
0575 903000DF LDS R3,sc_bt1_record+1
0577 2022 TST R2
0578 F449 BNE 0x0582
0579 2033 TST R3
057A F439 BNE 0x0582
(0093) {bt1_v_record();sc_bt1_record=7500;}//每分钟记录一次电压
057B D12A RCALL _bt1_v_record
057C E48C LDI R24,0x4C
057D E19D LDI R25,0x1D
057E 939000DF STS sc_bt1_record+1,R25
0580 938000DE STS sc_bt1_record,R24
(0094) if(sc_eeprom==0)
0582 902000E2 LDS R2,sc_eeprom
0584 903000E3 LDS R3,sc_eeprom+1
0586 2022 TST R2
0587 F519 BNE 0x05AB
0588 2033 TST R3
0589 F509 BNE 0x05AB
(0095) {
(0096) if(BT1_V<2000)
058A 918000D9 LDS R24,BT1_V
058C 919000DA LDS R25,BT1_V+1
058E 3D80 CPI R24,0xD0
058F E0E7 LDI R30,7
0590 079E CPC R25,R30
0591 F408 BCC 0x0593
(0097) {discharge_stop();}
0592 D5BC RCALL _discharge_stop
(0098) EEPROM_WRITE(0x01F0,BT1_mAh);
0593 E084 LDI R24,4
0594 E090 LDI R25,0
0595 8399 STD Y+1,R25
0596 8388 STD Y+0,R24
0597 EC25 LDI R18,0xC5
0598 E030 LDI R19,0
0599 EF00 LDI R16,0xF0
059A E011 LDI R17,1
059B DA40 RCALL _EEPROMWriteBytes
(0099) EEPROM_WRITE(0x01F4,BT1_time);
059C E084 LDI R24,4
059D E090 LDI R25,0
059E 8399 STD Y+1,R25
059F 8388 STD Y+0,R24
05A0 EC21 LDI R18,0xC1
05A1 E030 LDI R19,0
05A2 EF04 LDI R16,0xF4
05A3 E011 LDI R17,1
05A4 DA37 RCALL _EEPROMWriteBytes
(0100) sc_eeprom=1250;//每10秒保存一次
05A5 EE82 LDI R24,0xE2
05A6 E094 LDI R25,4
05A7 939000E3 STS sc_eeprom+1,R25
05A9 938000E2 STS sc_eeprom,R24
(0101) }
(0102) }
(0103) if(sc_bt_ctrl==0)
05AB 902000E4 LDS R2,sc_bt_ctrl
05AD 903000E5 LDS R3,sc_bt_ctrl+1
05AF 2022 TST R2
05B0 F521 BNE 0x05D5
05B1 2033 TST R3
05B2 F511 BNE 0x05D5
(0104) {
(0105) BT1_I_Ctrl();
05B3 D834 RCALL _BT1_I_Ctrl
(0106) if((BT1_I>BT1_I_SET+5)||(BT1_I<BT1_I_SET-5))
05B4 918000CB LDS R24,BT1_I_SET
05B6 919000CC LDS R25,BT1_I_SET+1
05B8 9605 ADIW R24,5
05B9 902000D7 LDS R2,BT1_I
05BB 903000D8 LDS R3,BT1_I+1
05BD 1582 CP R24,R2
05BE 0593 CPC R25,R3
05BF F040 BCS 0x05C8
05C0 918000CB LDS R24,BT1_I_SET
05C2 919000CC LDS R25,BT1_I_SET+1
05C4 9705 SBIW R24,5
05C5 1628 CP R2,R24
05C6 0639 CPC R3,R25
05C7 F438 BCC 0x05CF
(0107) sc_bt_ctrl=2;//PWM高速调节
05C8 E082 LDI R24,2
05C9 E090 LDI R25,0
05CA 939000E5 STS sc_bt_ctrl+1,R25
05CC 938000E4 STS sc_bt_ctrl,R24
05CE C006 RJMP 0x05D5
(0108) else sc_bt_ctrl=48;//PWM低速调节
05CF E380 LDI R24,0x30
05D0 E090 LDI R25,0
05D1 939000E5 STS sc_bt_ctrl+1,R25
05D3 938000E4 STS sc_bt_ctrl,R24
(0109) }
05D5 9622 ADIW R28,2
05D6 D956 RCALL pop_gset2
05D7 9508 RET
(0110) }
(0111)
(0112) void system_clock(void)
(0113) { //每个节拍为8ms
(0114) if(sc_timer_dealy!=0) sc_timer_dealy--;
_system_clock:
05D8 902000EB LDS R2,sc_timer_dealy
05DA 2022 TST R2
05DB F021 BEQ 0x05E0
05DC 2D82 MOV R24,R2
05DD 5081 SUBI R24,1
05DE 938000EB STS sc_timer_dealy,R24
(0115) if(sc_keyboard_scan!=0) sc_keyboard_scan--;
05E0 902000EA LDS R2,sc_keyboard_scan
05E2 2022 TST R2
05E3 F021 BEQ 0x05E8
05E4 2D82 MOV R24,R2
05E5 5081 SUBI R24,1
05E6 938000EA STS sc_keyboard_scan,R24
(0116) if(sc_key_delay!=0) sc_key_delay--;
05E8 902000E8 LDS R2,sc_key_delay
05EA 2022 TST R2
05EB F021 BEQ 0x05F0
05EC 2D82 MOV R24,R2
05ED 5081 SUBI R24,1
05EE 938000E8 STS sc_key_delay,R24
(0117) if(sc_lcd_write!=0) sc_lcd_write--;
05F0 902000E9 LDS R2,sc_lcd_write
05F2 2022 TST R2
05F3 F021 BEQ 0x05F8
05F4 2D82 MOV R24,R2
05F5 5081 SUBI R24,1
05F6 938000E9 STS sc_lcd_write,R24
(0118) /*
(0119) if(sc_G_ht!=0) sc_G_ht--;
(0120) if(sc_G_cy!=0) sc_G_cy--;
(0121) if(sc_R_ht!=0) sc_R_ht--;
(0122) if(sc_R_cy!=0) sc_R_cy--;
(0123) */
(0124) if(sc_bt1!=0) sc_bt1--;
05F8 902000E6 LDS R2,sc_bt1
05FA 903000E7 LDS R3,sc_bt1+1
05FC 2022 TST R2
05FD F411 BNE 0x0600
05FE 2033 TST R3
05FF F049 BEQ 0x0609
0600 918000E6 LDS R24,sc_bt1
0602 919000E7 LDS R25,sc_bt1+1
0604 970
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -