📄 doo1.s
字号:
.module DOO1.c
.area data(ram, con, rel)
_mark::
.blkb 2
.area idata
.word 1500
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbsym e mark _mark I
_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbsym e flag _flag c
_flagh::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbsym e flagh _flagh c
_acount::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbsym e acount _acount c
_bcount::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbsym e bcount _bcount c
_powbit::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbsym e powbit _powbit c
.area text(rom, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 29
; #include <iot13v.h>
; #include <macros.h>
; #include "delay.h"
; #include "eeprom.h"
; #define uchar unsigned char
; #define unit unsigned int
; #define ulong unsigned long
; #define xtal 9.8
;
; int mark=1500;
;
; unsigned int ai,aa;
; unsigned char crc,i,j,flag=0,flagh=0,flagl,acount=0,bcount=0,powbit=0;
; unsigned char DECODER_CODE1,DECODER_CODE0;
; unsigned char data[3];
; unsigned char dataf[3];
;
;
; //PB3是控制输出端口!
; #define POWER_ON PORTB |= (1 << PB2) //打开输出
; #define POWER_OFF PORTB &= ~(1 << PB2) //关闭输出
; #define LED_ON PORTB |= (1 << PB0) //打开输出
; #define LED_OFF PORTB &= ~(1 << PB0) //关闭输出
; #define RF_ON PORTB |= (1 << PB1) //打开输出
; #define RF_OFF PORTB &= ~(1 << PB1) //关闭输出
;
; //端口初始化
; void port_init(void)
; {
.dbline 30
; PORTB = 0x38; //输入设置有上拉电阻,输出预设低电平
ldi R24,56
out 0x18,R24
.dbline 31
; DDRB = 0x07; //PB4输入,PB3输出
ldi R24,7
out 0x17,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 35
; }
; //转换初始化
; void adc_init(void)
; {
.dbline 36
; ADCSRA=0x00; //vcc作为模拟参考电压
clr R2
out 0x6,R2
.dbline 38
;
; ADCMUX = 0x03; //选择ADC2通道
ldi R24,3
out 0x7,R24
.dbline 39
; ACSR = (1 << ACD);//禁用模拟比较器
ldi R24,128
ldi R25,0
out 0x9,R25
out 0x8,R24
.dbline 43
;
; //使能ADC,终端允许,自由模式,时钟CLK/8
; //0x86允许转换ADEN,ADSC,时钟128分频 75KHz@9.6MHz system clock
; ADCSRA = (1 << ADEN) | 0x07;//| ( 1 << ADATE )
ldi R24,135
out 0x6,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 48
;
; }
; //看门狗初始化
; void watchdog_init(void)
; {
.dbline 49
; WDR(); //this prevents a timout on enabling
wdr
.dbline 50
; WDTCR=(1<<WDCE)|(1<<WDE);
ldi R24,24
out 0x21,R24
.dbline 51
; WDTCR=(0<<WDE);
clr R2
out 0x21,R2
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e GetADC _GetADC fi
; adc_value -> R20,R21
.even
_GetADC::
rcall push_gset1
.dbline -1
.dbline 56
; }
;
; //从AD口读入一个值
; unsigned int GetADC(void)
; {
.dbline 60
;
; unsigned int adc_value;
;
; ADC = 0;
clr R2
clr R3
out 0x5,R3
out 0x4,R2
.dbline 61
; ADCSRA |= (1 << ADSC); //启动AD转换
sbi 0x6,6
.dbline 63
;
; del(10);
ldi R16,10
ldi R17,0
rcall _del
L5:
.dbline 64
L6:
.dbline 64
; while(!(ADCSRA&(BIT(ADIF))));////ADIF=4, 表示若ADCSR的第5位置为1,则中断AD转换
sbis 0x6,4
rjmp L5
.dbline 67
; //loop_until_bit_is_set(ADCSRA, ADIF);//等待AD转换结束
;
; ADCSRA |= (1 << ADIF); //写1清除标志位
sbi 0x6,4
.dbline 69
;
; adc_value = ADC; //读转换结果
in R20,0x4
in R21,0x5
.dbline 71
;
; return adc_value;
mov R16,R20
mov R17,R21
.dbline -2
L4:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r adc_value 20 i
.dbend
.dbfunc e CRC3 _CRC3 fc
; i -> <dead>
; j -> R22
; len -> R10
; data -> R20,R21
.even
_CRC3::
rcall push_gset3
mov R10,R18
mov R20,R16
mov R21,R17
.dbline -1
.dbline 85
; }
;
;
; /******************************************
; CRC3校验函数
; 输 入: ptr需要进行校验的数据包
; len需要校验的数据包字节数
; 输 出: 校验码;
; 调 用: 无;
; 被调用: 从机协议打包函数;
; 功 能: 将一给定的数据包进行CRC3校验给调用者返回校验码
; ******************************************/
; unsigned char CRC3(unsigned char *data, unsigned char len)
; {
.dbline 88
; unsigned char i;
; unsigned char j;
; j = 0;
clr R22
.dbline 89
; crc=0;
clr R2
sts _crc,R2
rjmp L10
L9:
.dbline 92
;
; while(len)
; {
.dbline 94
; /*多项式除法*/
; if(*data & (0x80>>j)) //如果该位为1
mov R18,R22
clr R19
ldi R16,128
ldi R17,0
rcall asr16
mov R30,R20
mov R31,R21
ldd R2,z+0
clr R3
and R2,R16
and R3,R17
tst R2
brne X0
tst R3
breq L12
X0:
.dbline 95
; crc |= 0x01; //则在余数尾部添1否则添0
lds R24,_crc
ori R24,1
sts _crc,R24
L12:
.dbline 96
; if(crc >= 0x8)
lds R24,_crc
cpi R24,8
brlo L14
.dbline 97
; crc ^= 11;
ldi R24,11
lds R2,_crc
eor R2,R24
sts _crc,R2
L14:
.dbline 98
; crc <<= 1;
lds R2,_crc
lsl R2
sts _crc,R2
.dbline 99
; j++;
inc R22
.dbline 100
; if(len==1)
mov R24,R10
cpi R24,1
brne L16
.dbline 101
; {
.dbline 102
; if(j == 7)
cpi R22,7
brne L17
.dbline 103
; {
.dbline 104
; j = 0;
clr R22
.dbline 105
; data++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 106
; len--;
dec R10
.dbline 107
; }
.dbline 108
; }
rjmp L17
L16:
.dbline 110
; else
; {
.dbline 111
; if(j == 8)
cpi R22,8
brne L20
.dbline 112
; {
.dbline 113
; j = 0;
clr R22
.dbline 114
; data++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 115
; len--;
dec R10
.dbline 116
; }
L20:
.dbline 117
; }
L17:
.dbline 118
L10:
.dbline 91
tst R10
brne L9
.dbline 119
; }
; return(crc);
lds R16,_crc
.dbline -2
L8:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l i 1 c
.dbsym r j 22 c
.dbsym r len 10 c
.dbsym r data 20 pc
.dbend
.dbfunc e addr_f _addr_f fV
; j -> <dead>
; i -> <dead>
.even
_addr_f::
.dbline -1
.dbline 125
; }
;
;
; //地址计算
; void addr_f(void)
; {
.dbline 128
; unsigned char i;
; unsigned char j;
; data[0]=EEPROM_read(0);
clr R16
rcall _EEPROM_read
sts _data,R16
.dbline 129
; data[1]=EEPROM_read(1); //EEPORM内地址,最大FFFF
ldi R16,1
rcall _EEPROM_read
sts _data+1,R16
.dbline 130
; data[2]=0;
clr R2
sts _data+2,R2
.dbline 131
; if(GetADC()<327) data[2]|=0x80;
rcall _GetADC
cpi R16,71
ldi R30,1
cpc R17,R30
brsh L25
.dbline 131
lds R24,_data+2
ori R24,128
sts _data+2,R24
L25:
.dbline 132
; if(powbit) data[2]|=0x40;
lds R2,_powbit
tst R2
breq L28
.dbline 132
lds R24,_data+2
ori R24,64
sts _data+2,R24
L28:
.dbline 133
; data[2]+=CRC3(data,3);
ldi R18,3
ldi R16,<_data
ldi R17,>_data
rcall _CRC3
lds R2,_data+2
add R2,R16
sts _data+2,R2
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbsym l j 1 c
.dbsym l i 1 c
.dbend
.dbfunc e data_1 _data_1 fV
.even
_data_1::
.dbline -1
.dbline 137
; }
; //要发送的数据1
; void data_1(void)
; {
.dbline 138
; RF_OFF;
cbi 0x18,1
.dbline 139
; del(700);
ldi R16,700
ldi R17,2
rcall _del
.dbline 140
; RF_ON;
sbi 0x18,1
.dbline 141
; del(350);
ldi R16,350
ldi R17,1
rcall _del
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbend
.dbfunc e data_0 _data_0 fV
.even
_data_0::
.dbline -1
.dbline 145
; }
; //要发送的数据0
; void data_0(void)
; {
.dbline 146
; RF_OFF;
cbi 0x18,1
.dbline 147
; del(350);
ldi R16,350
ldi R17,1
rcall _del
.dbline 148
; RF_ON;
sbi 0x18,1
.dbline 149
; del(700);
ldi R16,700
ldi R17,2
rcall _del
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.dbfunc e rf _rf fV
; i -> R20
; j -> R10
; dataf -> R22,R23
.even
_rf::
rcall push_gset3
mov R22,R16
mov R23,R17
.dbline -1
.dbline 153
; }
; //发送数据
; void rf (unsigned char *dataf)
; {
.dbline 156
; unsigned char i;
; unsigned char j;
; RF_ON; //起始位
sbi 0x18,1
.dbline 157
; del(350);
ldi R16,350
ldi R17,1
rcall _del
.dbline 158
; for(i=0;i<3;i++)
clr R20
rjmp L38
L35:
.dbline 159
; { for(j=0;j<8;j++)
.dbline 159
clr R10
rjmp L42
L39:
.dbline 160
; {
.dbline 161
; if(*dataf& (0x80>>j)) //如果该位为1
mov R18,R10
clr R19
ldi R16,128
ldi R17,0
rcall asr16
mov R30,R22
mov R31,R23
ldd R2,z+0
clr R3
and R2,R16
and R3,R17
tst R2
brne X1
tst R3
breq L43
X1:
.dbline 162
; data_1();
rcall _data_1
rjmp L44
L43:
.dbline 163
; else data_0();
rcall _data_0
L44:
.dbline 164
L40:
.dbline 159
inc R10
L42:
.dbline 159
mov R24,R10
cpi R24,8
brlo L39
.dbline 165
subi R22,255 ; offset = 1
sbci R23,255
.dbline 166
L36:
.dbline 158
inc R20
L38:
.dbline 158
cpi R20,3
brlo L35
.dbline 167
; }
; dataf++;
; }
; RF_OFF;
cbi 0x18,1
.dbline -2
L34:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 10 c
.dbsym r dataf 22 pc
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 171
; }
; //主函数!不用解释了
; void main()
; {
.dbline 175
;
; unsigned char i;
; //以下初始化硬件
; port_init(); //端口初始化
rcall _port_init
.dbline 176
; adc_init(); //ADC初始化
rcall _adc_init
.dbline 177
; watchdog_init();//初始化看门狗
rcall _watchdog_init
.dbline 178
; POWER_ON;
sbi 0x18,2
.dbline 179
; if(!(PINB&0X10)) powbit=1;
sbic 0x16,4
rjmp L46
.dbline 179
ldi R24,1
sts _powbit,R24
L46:
.dbline 180
; delay(1);
ldi R16,1
ldi R17,0
rcall _delay
rjmp L49
L48:
.dbline 183
;
; while(1)
; {
.dbline 184
; WDR();
wdr
.dbline 185
; LED_ON;
sbi 0x18,0
.dbline 186
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 187
; addr_f();
rcall _addr_f
.dbline 188
; for(i=0;i<50;i++)
clr R20
rjmp L54
L51:
.dbline 189
.dbline 190
lds R2,_data
sts _dataf,R2
.dbline 191
lds R2,_data+1
sts _dataf+1,R2
.dbline 192
lds R2,_data+2
sts _dataf+2,R2
.dbline 193
ldi R16,<_dataf
ldi R17,>_dataf
rcall _rf
.dbline 194
ldi R16,3
ldi R17,0
rcall _delay
.dbline 195
L52:
.dbline 188
inc R20
L54:
.dbline 188
cpi R20,50
brlo L51
.dbline 196
cbi 0x18,2
.dbline 197
ldi R16,100
ldi R17,0
rcall _delay
.dbline 198
cbi 0x18,0
.dbline 199
L49:
.dbline 182
rjmp L48
X2:
.dbline -2
L45:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\EM-PB-2129\DOO1.c
_dataf::
.blkb 3
.dbsym e dataf _dataf A[3:3]c
_data::
.blkb 3
.dbsym e data _data A[3:3]c
_DECODER_CODE0::
.blkb 1
.dbsym e DECODER_CODE0 _DECODER_CODE0 c
_DECODER_CODE1::
.blkb 1
.dbsym e DECODER_CODE1 _DECODER_CODE1 c
_flagl::
.blkb 1
.dbsym e flagl _flagl c
_j::
.blkb 1
.dbsym e j _j c
_i::
.blkb 1
.dbsym e i _i c
_aa::
.blkb 2
.dbsym e aa _aa i
_ai::
.blkb 2
.dbsym e ai _ai i
_crc::
.blkb 1
.dbsym e crc _crc c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -