📄 init.lis
字号:
00D6 20920000 sts _ADcon,R2
00DA .dbline 105
00DA ; ADCSRA=0X16;
00DA 86E1 ldi R24,22
00DC 80937A00 sts 122,R24
00E0 .dbline 106
00E0 ; ADMUX=0X00; //关ADC
00E0 2224 clr R2
00E2 20927C00 sts 124,R2
00E6 .dbline 107
00E6 ; SEI();
00E6 7894 sei
00E8 .dbline -2
00E8 L6:
00E8 .dbline 0 ; func end
00E8 0895 ret
00EA .dbend
00EA .dbfunc e CRC3 _CRC3 fc
00EA ; i -> <dead>
00EA ; j -> R22
00EA ; len -> R10
00EA ; data -> R20,R21
.even
00EA _CRC3::
00EA 00D0 rcall push_gset3
00EC A22E mov R10,R18
00EE A801 movw R20,R16
00F0 .dbline -1
00F0 .dbline 120
00F0 ; }
00F0 ; /******************************************
00F0 ; CRC3校验函数
00F0 ; 输 入: ptr需要进行校验的数据包
00F0 ; len需要校验的数据包字节数
00F0 ; 输 出: 校验码;
00F0 ; 调 用: 无;
00F0 ; 被调用: 从机协议打包函数;
00F0 ; 功 能: 将一给定的数据包进行CRC12校验给调用者返回校验码
00F0 ; ******************************************/
00F0 ;
00F0 ; unsigned char CRC3(unsigned char *data, unsigned char len)
00F0 ; {
00F0 .dbline 123
00F0 ; unsigned char i;
00F0 ; unsigned char j;
00F0 ; j = 0;
00F0 6627 clr R22
00F2 .dbline 124
00F2 ; crc=0;
00F2 2224 clr R2
00F4 20920000 sts _crc,R2
00F8 29C0 rjmp L12
00FA L11:
00FA .dbline 126
00FA ; while(len)
00FA ; {
00FA .dbline 128
00FA ; /*多项式除法*/
00FA ; if(*data & (0x80>>j)) //如果该位为1
00FA 262F mov R18,R22
00FC 3327 clr R19
00FE 00E8 ldi R16,128
0100 10E0 ldi R17,0
0102 00D0 rcall asr16
0104 FA01 movw R30,R20
0106 2080 ldd R2,z+0
0108 3324 clr R3
010A 2022 and R2,R16
010C 3122 and R3,R17
010E 2220 tst R2
0110 11F4 brne X0
0112 3320 tst R3
0114 29F0 breq L14
0116 X0:
0116 .dbline 129
0116 ; crc |= 0x01; //则在余数尾部添1否则添0
0116 80910000 lds R24,_crc
011A 8160 ori R24,1
011C 80930000 sts _crc,R24
0120 L14:
0120 .dbline 130
0120 ; if(crc >= 0x8)
0120 80910000 lds R24,_crc
0124 8830 cpi R24,8
0126 30F0 brlo L16
0128 .dbline 131
0128 ; crc ^= 11;
0128 8BE0 ldi R24,11
012A 20900000 lds R2,_crc
012E 2826 eor R2,R24
0130 20920000 sts _crc,R2
0134 L16:
0134 .dbline 132
0134 ; crc <<= 1;
0134 20900000 lds R2,_crc
0138 220C lsl R2
013A 20920000 sts _crc,R2
013E .dbline 133
013E ; j++;
013E 6395 inc R22
0140 .dbline 134
0140 ; if(j == 8)
0140 6830 cpi R22,8
0142 21F4 brne L18
0144 .dbline 135
0144 ; {
0144 .dbline 136
0144 ; j = 0;
0144 6627 clr R22
0146 .dbline 137
0146 ; data++;
0146 4F5F subi R20,255 ; offset = 1
0148 5F4F sbci R21,255
014A .dbline 138
014A ; len--;
014A AA94 dec R10
014C .dbline 139
014C ; }
014C L18:
014C .dbline 140
014C L12:
014C .dbline 125
014C AA20 tst R10
014E A9F6 brne L11
0150 .dbline 141
0150 ; }
0150 ; return(crc);
0150 00910000 lds R16,_crc
0154 .dbline -2
0154 L10:
0154 00D0 rcall pop_gset3
0156 .dbline 0 ; func end
0156 0895 ret
0158 .dbsym l i 1 c
0158 .dbsym r j 22 c
0158 .dbsym r len 10 c
0158 .dbsym r data 20 pc
0158 .dbend
.area vector(rom, abs)
.org 32
0020 ACC0 rjmp _timer0_ovf_isr
.area text(rom, con, rel)
0158 .dbfile E:\abol\file\EMD\programme\init.c
0158 .dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
0158 ; j -> R20
0158 ; i -> R22
.even
0158 _timer0_ovf_isr::
0158 00D0 rcall push_lset
015A 00D0 rcall push_gset2
015C .dbline -1
015C .dbline 145
015C ; }
015C ; #pragma interrupt_handler timer0_ovf_isr:17
015C ; void timer0_ovf_isr(void) //中断程序
015C ; {
015C .dbline 147
015C ; unsigned char i,j;
015C ; TCNT0=196; //产生16.8K的信号
015C 84EC ldi R24,196
015E 86BD out 0x26,R24
0160 .dbline 149
0160 ;
0160 ; if (((flag&0x02)!=0)&&((flag&0x04)==0))//RF开关
0160 20900000 lds R2,_flag
0164 21FE sbrs R2,1
0166 1FC1 rjmp L21
0168 22FC sbrc R2,2
016A 1DC1 rjmp L21
016C .dbline 150
016C ; {//1
016C .dbline 151
016C ; if ((PINC&0x08)==0)//测试输入电平 如输入为1跳到高计数
016C 3399 sbic 0x6,3
016E 31C0 rjmp L23
0170 .dbline 152
0170 ; {//2
0170 .dbline 153
0170 ; if ((flag&0x01)==0)//检测以前的解码状态
0170 20FC sbrc R2,0
0172 0CC0 rjmp L25
0174 .dbline 154
0174 ; {//2-1
0174 .dbline 155
0174 ; LO_COUNT++;//最大计数 FFH
0174 80910000 lds R24,_LO_COUNT
0178 8F5F subi R24,255 ; addi 1
017A 80930000 sts _LO_COUNT,R24
017E .dbline 156
017E ; if (LO_COUNT==0)
017E 8823 tst R24
0180 09F0 breq X3
0182 11C1 rjmp L20
0184 X3:
0184 .dbline 157
0184 ; {//2-1'
0184 .dbline 158
0184 ; LO_COUNT--;
0184 8150 subi R24,1
0186 80930000 sts _LO_COUNT,R24
018A .dbline 159
018A ; }//2-1'
018A .dbline 160
018A ; return;//大于FFH跳出中断
018A 0DC1 rjmp L20
018C L25:
018C .dbline 162
018C ; }//2-1
018C ; DECODER_STATUS_L; //变成当前状态
018C 80910000 lds R24,_flag
0190 8E7F andi R24,254
0192 80930000 sts _flag,R24
0196 .dbline 163
0196 ; LO_COUNT_SAVE=LO_COUNT;//保存低电平计数
0196 20900000 lds R2,_LO_COUNT
019A 20920000 sts _LO_COUNT_SAVE,R2
019E .dbline 164
019E ; LO_COUNT=0;//更新低电平计数
019E 2224 clr R2
01A0 20920000 sts _LO_COUNT,R2
01A4 .dbline 165
01A4 ; if ((HI_COUNT_SAVE>MAXDURATION)||(HI_COUNT_SAVE==0))//如果高电平大于限定值
01A4 E0E0 ldi R30,<_MAXDURATION
01A6 F0E0 ldi R31,>_MAXDURATION
01A8 E491 lpm R30,Z
01AA 20900000 lds R2,_HI_COUNT_SAVE
01AE E215 cp R30,R2
01B0 18F0 brlo L31
01B2 2220 tst R2
01B4 09F0 breq X4
01B6 F7C0 rjmp L20
01B8 X4:
01B8 L31:
01B8 .dbline 166
01B8 ; {//2-2
01B8 .dbline 167
01B8 ; BITCOUNTER=CODELANGTH;//代码是错误的
01B8 E0E0 ldi R30,<_CODELANGTH
01BA F0E0 ldi R31,>_CODELANGTH
01BC E491 lpm R30,Z
01BE E0930000 sts _BITCOUNTER,R30
01C2 .dbline 168
01C2 ; data[0]=0;
01C2 2224 clr R2
01C4 20920000 sts _data,R2
01C8 .dbline 169
01C8 ; data[1]=0;
01C8 20920100 sts _data+1,R2
01CC .dbline 170
01CC ; data[2]=0;
01CC 20920200 sts _data+2,R2
01D0 .dbline 171
01D0 ; }//2-2
01D0 .dbline 172
01D0 ; return;//跳出中断
01D0 EAC0 rjmp L20
01D2 L23:
01D2 .dbline 175
01D2 ; }//2
01D2 ; else//高计数
01D2 ; {//3
01D2 .dbline 176
01D2 ; if ((flag&0x01)!=0)//检测以前的解码状态
01D2 20900000 lds R2,_flag
01D6 20FE sbrs R2,0
01D8 0CC0 rjmp L34
01DA .dbline 177
01DA ; {//4
01DA .dbline 178
01DA ; HI_COUNT++;
01DA 80910000 lds R24,_HI_COUNT
01DE 8F5F subi R24,255 ; addi 1
01E0 80930000 sts _HI_COUNT,R24
01E4 .dbline 179
01E4 ; if (HI_COUNT==0)//大于FFH跳出中断
01E4 8823 tst R24
01E6 09F0 breq X5
01E8 DEC0 rjmp L20
01EA X5:
01EA .dbline 180
01EA ; {//4-1
01EA .dbline 181
01EA ; HI_COUNT--;
01EA 8150 subi R24,1
01EC 80930000 sts _HI_COUNT,R24
01F0 .dbline 182
01F0 ; }//4-1
01F0 .dbline 183
01F0 ; return;//跳出中断
01F0 DAC0 rjmp L20
01F2 L34:
01F2 .dbline 185
01F2 ; }//4
01F2 ; DECODER_STATUS_H; //变成当前状态
01F2 80910000 lds R24,_flag
01F6 8160 ori R24,1
01F8 80930000 sts _flag,R24
01FC .dbline 186
01FC ; HI_COUNT_SAVE=HI_COUNT;//保存高电平计数
01FC 20900000 lds R2,_HI_COUNT
0200 20920000 sts _HI_COUNT_SAVE,R2
0204 .dbline 187
0204 ; HI_COUNT=0;//更新低电平计数
0204 2224 clr R2
0206 20920000 sts _HI_COUNT,R2
020A .dbline 188
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -