📄 test.s
字号:
.module test.c
.area lit(rom, con, rel)
_ABC::
.word 735
.word 735
.word 735
.word 735
.word 735
.word 735
.word 736
.word 737
.word 738
.word 740
.word 742
.word 744
.word 746
.word 748
.word 749
.word 750
.word 752
.word 753
.word 755
.word 757
.word 758
.word 760
.word 762
.word 764
.word 766
.word 766
.word 768
.word 769
.word 770
.word 772
.word 773
.word 775
.word 777
.word 779
.word 780
.word 782
.word 784
.word 786
.word 787
.word 789
.word 790
.word 792
.word 794
.word 796
.word 797
.word 798
.word 799
.word 800
.word 802
.word 804
.word 805
.word 807
.word 809
.word 810
.word 812
.word 813
.word 814
.word 815
.word 817
.word 819
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.word 820
.dbfile E:\MYDATA~1\DIFAMO~1\soft_Difa\test.c
.dbsym e ABC _ABC A[162:81]kI
_ABC_2::
.word 752
.word 753
.word 754
.word 756
.word 758
.word 760
.word 762
.word 764
.word 766
.word 767
.word 768
.word 770
.word 772
.word 774
.word 775
.word 776
.word 778
.word 780
.word 782
.word 783
.word 784
.word 786
.word 788
.word 790
.word 792
.word 793
.word 795
.word 797
.word 798
.word 799
.word 800
.word 802
.word 804
.word 806
.word 807
.word 808
.word 810
.word 812
.word 813
.word 814
.word 815
.word 817
.word 819
.word 821
.word 822
.word 823
.word 824
.word 826
.word 828
.word 829
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.word 831
.dbsym e ABC_2 _ABC_2 A[182:91]kI
.area text(rom, con, rel)
.dbfile E:\MYDATA~1\DIFAMO~1\soft_Difa\test.c
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 54
; //使用内部RC振荡,PB6-G,PB7-DP短路块连接
; //使用INT0/INT1按键切换ADC通道
; #include <iom48v.h>
; #include <macros.h>
; #define osccal 0x9A //内部RC校正常数
; #define Vref 500 //参考电压值
; #define Red PD2 //红色指示灯
; #define Green PD3 //绿色指示灯
; #define P0 PB1 //第0路电流控制
; #define P1 PD5 //第1路电流控制
; #define P2 PB7 //第2路电流控制
; #define P3 PB6 //第3路电流控制
; #define SDA 4
; #define SCL 5
; #define ack 0
; #define a 1
; #define LED_Indi 2
; #define LED_Indi_2 7
; #define LED_yes 3 //允许红灯闪烁
; #define plus_charge 4 //允许进行14.4V/0.8A(1HZ)脉冲充电标志位
; #define anther 5
; #define Charge_Sel 6 //Charge_Sel=1 home_charger Charge_Sel=0; warmup_charger
; #define _nop_() asm("nop")
; //ABC[124] 针对14.3V查表 -40 ~ 84
; const signed int ABC[81]={735,735,735,735,735,735,736,737,738,740,742,744,746,748,749,750,752,753,755,757,758,760,762,764,766,766,768,769,770,772,773,775,777,779,780,782,784,786,787,789,790,792,794,796,797,798,799,800,802,804,805,807,809,810,812,813,814,815,817,819,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820};
; //ABC[124] 针对13.8V查表 005 006 007 8 9 10 11 12 13 14 15 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085
; const signed int ABC_2[91]={752,753,754,756,758,760,762,764,766,767,768,770,772,774,775,776,778,780,782,783,784,786,788,790,792,793,795,797,798,799,800,802,804,806,807,808,810,812,813,814,815,817,819,821,822,823,824,826,828,829,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831};
; //ABC[124] 针对13.8V查表 -05 -04 -03 -02 -01 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085
; unsigned int adc_old;
; unsigned int xxyy;
; unsigned int temp_start;
; signed char temp_step;
; unsigned char temp_dange;
; unsigned char temp;
; unsigned char cycle; //存放从第五步到第一步之间的循环次数
; extern void delay_ms(unsigned int time);
; unsigned int adc_rel; //AD转换结果
; unsigned int Second_count_1; //秒计数1
; unsigned int Second_count_2; //秒计数2
; unsigned int Second_count_3; //秒计数1
; unsigned int Second_count_4; //秒计数2
; unsigned char adc_mux; //AD通道
; unsigned char DA_result; //将需要转换的D/A数据写入其中再进行调用D/A子程序
;
; signed int now_temp;
; signed temp_rep;
; unsigned int abc;
; unsigned int xyz;
; //TIMER1 initialize - prescale:1024
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 1Sec
; // actual value: 1.000Sec (0.0%)
; void timer1_init(void)
; {
.dbline 55
; TCCR1B = 0x00; //stop
clr R2
sts 129,R2
.dbline 56
; TCNT1H = 0xE1; //setup
ldi R24,225
sts 133,R24
.dbline 57
; TCNT1L = 0x7C;
ldi R24,124
sts 132,R24
.dbline 58
; OCR1AH = 0x1E;
ldi R24,30
sts 137,R24
.dbline 59
; OCR1AL = 0x84;
ldi R24,132
sts 136,R24
.dbline 60
; OCR1BH = 0x1E;
ldi R24,30
sts 139,R24
.dbline 61
; OCR1BL = 0x84;
ldi R24,132
sts 138,R24
.dbline 62
; ICR1H = 0x1E;
ldi R24,30
sts 135,R24
.dbline 63
; ICR1L = 0x84;
ldi R24,132
sts 134,R24
.dbline 64
; TCCR1A = 0x00;
sts 128,R2
.dbline 65
; TCCR1B = 0x05; //start Timer
ldi R24,5
sts 129,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 22
rjmp _timer1_compa_isr
.area text(rom, con, rel)
.dbfile E:\MYDATA~1\DIFAMO~1\soft_Difa\test.c
.dbfunc e timer1_compa_isr _timer1_compa_isr fV
.even
_timer1_compa_isr::
.dbline -1
.dbline 70
; }
; unsigned char temp1;
; #pragma interrupt_handler timer1_compa_isr:12
; void timer1_compa_isr(void)
; {
.dbline -2
L2:
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 26
rjmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile E:\MYDATA~1\DIFAMO~1\soft_Difa\test.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 76
; //compare occured TCNT1=OCR1A
; }
;
; #pragma interrupt_handler timer1_ovf_isr:14
; void timer1_ovf_isr(void)
; {
.dbline 77
; TCNT1H = 0xF0; //reload counter high value
ldi R24,240
sts 133,R24
.dbline 78
; TCNT1L = 0xBE; //reload counter low value
ldi R24,190
sts 132,R24
.dbline 80
;
; if((temp&(1<<plus_charge))==0x10) //为第一步脉冲充电做准备
lds R24,_temp
andi R24,16
cpi R24,16
brne L4
.dbline 81
; {temp &= ~(1<<plus_charge);}
.dbline 81
lds R24,_temp
andi R24,239
sts _temp,R24
.dbline 81
rjmp L5
L4:
.dbline 82
; else{temp |= (1<<plus_charge);}
.dbline 82
lds R24,_temp
ori R24,16
sts _temp,R24
.dbline 82
L5:
.dbline 85
;
;
; Second_count_1++;
lds R24,_Second_count_1
lds R25,_Second_count_1+1
adiw R24,1
sts _Second_count_1+1,R25
sts _Second_count_1,R24
.dbline 86
; if(Second_count_1==120) //如果有改动,请改回原来值60
cpi R24,120
ldi R30,0
cpc R25,R30
brne L6
.dbline 87
; {
.dbline 88
; Second_count_2++;
lds R24,_Second_count_2
lds R25,_Second_count_2+1
adiw R24,1
sts _Second_count_2+1,R25
sts _Second_count_2,R24
.dbline 89
; Second_count_1=0;
clr R2
clr R3
sts _Second_count_1+1,R3
sts _Second_count_1,R2
.dbline 90
; }
L6:
.dbline 92
;
; Second_count_3++;
lds R24,_Second_count_3
lds R25,_Second_count_3+1
adiw R24,1
sts _Second_count_3+1,R25
sts _Second_count_3,R24
.dbline 93
; if(Second_count_3==120) //如果有改动,请改回原来值60
cpi R24,120
ldi R30,0
cpc R25,R30
brne L8
.dbline 94
; {
.dbline 95
; Second_count_4++;
lds R24,_Second_count_4
lds R25,_Second_count_4+1
adiw R24,1
sts _Second_count_4+1,R25
sts _Second_count_4,R24
.dbline 96
; Second_count_3=0;
clr R2
clr R3
sts _Second_count_3+1,R3
sts _Second_count_3,R2
.dbline 97
; }
L8:
.dbline 99
;
; if((temp&(1<<LED_yes))==0x08)
lds R24,_temp
andi R24,8
cpi R24,8
brne L10
.dbline 100
; {
.dbline 101
; _nop_();
nop
.dbline 102
; if((temp&(1<<LED_Indi))==0)
lds R2,_temp
sbrc R2,2
rjmp L12
.dbline 103
; {PORTD &= ~(1<<Red);
.dbline 103
cbi 0xb,2
.dbline 104
; PORTD &= ~(1<<Green); //绿色指示灯灭
cbi 0xb,3
.dbline 105
; temp |= (1<<LED_Indi);}
mov R24,R2
ori R24,4
sts _temp,R24
.dbline 105
rjmp L11
L12:
.dbline 107
; else
; {PORTD |= (1<<Red);
.dbline 107
sbi 0xb,2
.dbline 108
; PORTD &= ~(1<<Green); //绿色指示灯灭
cbi 0xb,3
.dbline 109
; temp &= ~(1<<LED_Indi);
lds R24,_temp
andi R24,251
sts _temp,R24
.dbline 110
; };
.dbline 110
.dbline 111
; }
rjmp L11
L10:
.dbline 113
nop
L11:
.dbline -2
L3:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 117
; else
; _nop_();
; }
; //ADC初始化
; void adc_init(void)
; {
.dbline 118
; ADCSRA = 0x00; //设置前,先关闭ADC
clr R2
sts 122,R2
.dbline 120
; //ADMUX =(1<<REFS0); //选择内部AVCC为基准,单端输入口为ADC0
; ADMUX &= ~(1<<REFS0);
lds R24,124
andi R24,191
sts 124,R24
.dbline 121
; ADMUX &= ~(1<<REFS1);
lds R24,124
andi R24,127
sts 124,R24
.dbline 122
; ACSR =(1<<ACD); //关闭模拟比较器,禁止位P148
ldi R24,128
out 0x30,R24
.dbline 124
; //ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
; ADCSRA |= (1<<ADEN);
lds R24,122
ori R24,128
sts 122,R24
.dbline 125
; ADCSRA |= (1<<ADIE);
lds R24,122
ori R24,8
sts 122,R24
.dbline 126
; ADCSRA |= (1<<ADPS2);
lds R24,122
ori R24,4
sts 122,R24
.dbline 127
; ADCSRA |= (1<<ADPS1);
lds R24,122
ori R24,2
sts 122,R24
.dbline 128
; ADCSRA |= (1<<ADSC);
lds R24,122
ori R24,64
sts 122,R24
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 42
rjmp _adc_isr
.area text(rom, con, rel)
.dbfile E:\MYDATA~1\DIFAMO~1\soft_Difa\test.c
.dbfunc e adc_isr _adc_isr fV
.even
_adc_isr::
st -y,R2
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 133
; }
; //ADC完成中断
; #pragma interrupt_handler adc_isr:22
; void adc_isr(void)
; {
.dbline 134
; adc_rel=ADC&0x3ff;
lds R24,120
lds R25,120+1
andi R25,3
sts _adc_rel+1,R25
sts _adc_rel,R24
.dbline 138
; //ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
; //ADMUX=ADMUX |(adc_mux&0x0f);
; //ADMUX |=(adc_mux&0x0f);
; ADMUX=0;
clr R2
sts 124,R2
.dbline 139
; ADMUX |=(adc_mux&0x0f);
lds R24,_adc_mux
andi R24,15
lds R2,124
or R2,R24
sts 124,R2
.dbline 140
; ADCSRA|=(1<<ADSC); //启动AD转换
lds R24,122
ori R24,64
sts 122,R24
.dbline -2
L15:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Start_I2c _Start_I2c fV
.even
_Start_I2c::
.dbline -1
.dbline 149
; }
; /*******************************************************************
; 起动总线函数
; 函数原型: void Start_I2c();
; 功能: 启动I2C总线,即发送I2C起始条件.
;
; ********************************************************************/
; void Start_I2c()
; {
.dbline 150
; PORTC |= (1<<SDA);
sbi 0x8,4
.dbline 151
; _nop_();
nop
.dbline 152
; PORTC |= (1<<SCL);
sbi 0x8,5
.dbline 153
; _nop_();
nop
.dbline 154
; _nop_();
nop
.dbline 155
; _nop_();
nop
.dbline 156
; _nop_();
nop
.dbline 157
; _nop_();
nop
.dbline 158
; PORTC &= ~(1<<SDA);
cbi 0x8,4
.dbline 159
; _nop_();
nop
.dbline 160
; _nop_();
nop
.dbline 161
; _nop_();
nop
.dbline 162
; _nop_();
nop
.dbline 163
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -