📄 uart.lst
字号:
(0024) uint testVarPoint;
(0025) uint testVarInputUp;
(0026) uint testVarInputDown;
(0027)
(0028) // UART0 initialize
(0029) // desired baud rate: 9600
(0030) // actual: baud rate:9615 (0.2%)
(0031) void uart0_init(void)
(0032) {
(0033) UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
0172 2422 CLR R2
0173 922000C1 STS 0xC1,R2
(0034) UCSR0A = 0x02; // 0x02;
0175 E082 LDI R24,2
0176 938000C0 STS 0xC0,R24
(0035) UCSR0C = 0x3E; //奇校验 2个停止位.
0178 E38E LDI R24,0x3E
0179 938000C2 STS 0xC2,R24
(0036) UBRR0L = 0x67; //set baud rate lo.
017B E687 LDI R24,0x67
017C 938000C4 STS 0xC4,R24
(0037) UBRR0H = 0x00; //set baud rate hi.
017E 922000C5 STS 0xC5,R2
(0038) // UCSR0B = 0xB8; //bit3 send enable.
(0039) UCSR0B = 0b10010000;
0180 E980 LDI R24,0x90
0181 938000C1 STS 0xC1,R24
0183 9508 RET
(0040) // UCSR0B &= ~BIT(TXCIE0); //RXCIE0 清零.
(0041) // UCSR0B &= ~BIT(TXEN0); //TXEN0 清零.
(0042) }//void uart0_init(void)
(0043)
(0044)
(0045) void beginSend(void)
(0046) {
(0047) //sendEnable(); //设为发送.
(0048) sendPosi = 0;
_beginSend:
0184 2422 CLR R2
0185 92200131 STS sendPosi,R2
(0049) if(sendCount > 1)
0187 E081 LDI R24,1
0188 90200130 LDS R2,sendCount
018A 1582 CP R24,R2
018B F428 BCC 0x0191
(0050) sendCount--;
018C 91800130 LDS R24,sendCount
018E 5081 SUBI R24,1
018F 93800130 STS sendCount,R24
(0051) // TX9D = ParityBit(sendBuf[0]);
(0052) UDR0 = sendBuf[0];
0191 9020011C LDS R2,sendBuf
0193 922000C6 STS 0xC6,R2
(0053) //UCSR0B |= BIT(UDRIE0); // TXIE = 1; //使能发送中断.
(0054) UCSR0B |= BIT(TXCIE0);
0195 918000C1 LDS R24,0xC1
0197 6480 ORI R24,0x40
0198 938000C1 STS 0xC1,R24
(0055) UCSR0B |= BIT(TXEN0); // TXEN = 1; //使能发送
019A 918000C1 LDS R24,0xC1
019C 6088 ORI R24,0x8
019D 938000C1 STS 0xC1,R24
019F 9508 RET
(0056) // TXIE = 1;
(0057) // CREN = 1;
(0058) // RCIE = 1;
(0059) // CREN = 0;
(0060) // RCIE = 0;
(0061) }//void beginSend(void)
(0062)
(0063) /*
(0064) void singleKeyTranmit(void)
(0065) {
(0066) sendBuf[0] = 0x12;
(0067) sendBuf[1] = 0x34;
(0068) sendBuf[2] = 0x56;
(0069) sendBuf[3] = 0x78;
(0070) sendBuf[4] = 0x90;
(0071) sendCount = 5; //发送字节长
(0072) beginSend();
(0073) }
(0074) */
(0075)
(0076)
(0077) //单键值处理
(0078) void singleKeyTranmit(void)
(0079) {
(0080) sendBuf[0] = 0xff;
_singleKeyTranmit:
01A0 EF8F LDI R24,0xFF
01A1 9380011C STS sendBuf,R24
(0081) sendBuf[1] = 0xaa;
01A3 EA8A LDI R24,0xAA
01A4 9380011D STS sendBuf+1,R24
(0082) sendBuf[2] = 0x55; //0x55 校验确认回复.
01A6 E585 LDI R24,0x55
01A7 9380011E STS sendBuf+2,R24
(0083) crc_result = CRC16(sendBuf,3);
01A9 E023 LDI R18,3
01AA E030 LDI R19,0
01AB E10C LDI R16,0x1C
01AC E011 LDI R17,1
01AD D0A5 RCALL _CRC16
01AE 93100103 STS crc_result+1,R17
01B0 93000102 STS crc_result,R16
(0084) sendBuf[3] = (uchar)(crc_result&0x00ff); // Lo byte.
01B2 01C8 MOVW R24,R16
01B3 7090 ANDI R25,0
01B4 9380011F STS sendBuf+3,R24
(0085) sendBuf[4] = (uchar)((crc_result&0xff00)>>8); // Hi byte.
01B6 01C8 MOVW R24,R16
01B7 7080 ANDI R24,0
01B8 2F89 MOV R24,R25
01B9 2799 CLR R25
01BA 93800120 STS 0x120,R24
(0086) //--------
(0087) sendCount = 5;
01BC E085 LDI R24,5
01BD 93800130 STS sendCount,R24
(0088) //----------
(0089) beginSend();
01BF DFC4 RCALL _beginSend
01C0 9508 RET
_ReceiveFrameDisFun:
01C1 D33E RCALL push_gset1
(0090) }
(0091)
(0092)
(0093) // 从站接受信息帧处理
(0094) void ReceiveFrameDisFun(void)
(0095) {
(0096) if(receCount>4)
01C2 E084 LDI R24,4
01C3 9020012F LDS R2,receCount
01C5 1582 CP R24,R2
01C6 F008 BCS 0x01C8
01C7 C065 RJMP 0x022D
(0097) {
(0098) switch(receBuf[1]) //byte 2: Command byte.
01C8 9140010D LDS R20,receBuf+1
01CA 2755 CLR R21
01CB 3040 CPI R20,0
01CC 0745 CPC R20,R21
01CD F409 BNE 0x01CF
01CE C05E RJMP 0x022D
01CF 3041 CPI R20,1
01D0 E0E0 LDI R30,0
01D1 075E CPC R21,R30
01D2 F409 BNE 0x01D4
01D3 C059 RJMP 0x022D
01D4 3043 CPI R20,3
01D5 E0E0 LDI R30,0
01D6 075E CPC R21,R30
01D7 F079 BEQ 0x01E7
01D8 3045 CPI R20,5
01D9 E0E0 LDI R30,0
01DA 075E CPC R21,R30
01DB F409 BNE 0x01DD
01DC C050 RJMP 0x022D
01DD 3040 CPI R20,0
01DE E0E0 LDI R30,0
01DF 075E CPC R21,R30
01E0 F40C BGE 0x01E2
01E1 C04B RJMP 0x022D
01E2 3A4A CPI R20,0xAA
01E3 E0E0 LDI R30,0
01E4 075E CPC R21,R30
01E5 F121 BEQ 0x020A
01E6 C046 RJMP 0x022D
(0099) {
(0100) case 0:
(0101) break;
(0102) case 1:
(0103) break;
(0104) case 3: //请求变量
(0105)
(0106) if(receCount >= 8)
01E7 9180012F LDS R24,receCount
01E9 3088 CPI R24,0x8
01EA F408 BCC 0x01EC
01EB C041 RJMP 0x022D
(0107) {
(0108) //PORTC ^= 0x02;
(0109)
(0110) if(receBuf[0]==LocalAddr && checkoutError==0)
01EC 9180010C LDS R24,receBuf
01EE 3081 CPI R24,1
01EF F4A1 BNE 0x0204
01F0 9020012D LDS R2,checkoutError
01F2 2022 TST R2
01F3 F481 BNE 0x0204
(0111) {
(0112) if(RecFrameCheck(&receBuf[0],receCount))
01F4 9120012F LDS R18,receCount
01F6 2733 CLR R19
01F7 E00C LDI R16,0xC
01F8 E011 LDI R17,1
01F9 D036 RCALL _RecFrameCheck
01FA 3000 CPI R16,0
01FB 0701 CPC R16,R17
01FC F039 BEQ 0x0204
(0113) { //校验正确
(0114) readRegisters();
01FD D092 RCALL _readRegisters
(0115) LedShowLink = 1717;
01FE EB85 LDI R24,0xB5
01FF E096 LDI R25,6
0200 9390013D STS LedShowLink+1,R25
0202 9380013C STS LedShowLink,R24
(0116) }
(0117) }
(0118) receCount = 0;
0204 2422 CLR R2
0205 9220012F STS receCount,R2
(0119) checkoutError = 0;
0207 9220012D STS checkoutError,R2
(0120) }
(0121)
(0122) break;
0209 C023 RJMP 0x022D
(0123)
(0124) case 5:
(0125) break;
(0126)
(0127) case 0xaa:
(0128) // PORTC ^= 0x02;
(0129) if(receCount >= 5)
020A 9180012F LDS R24,receCount
020C 3085 CPI R24,5
020D F0F8 BCS 0x022D
(0130) {
(0131) // PORTC ^= 0x02;
(0132) if(receBuf[0]==LocalAddr && checkoutError==0)
020E 9180010C LDS R24,receBuf
0210 3081 CPI R24,1
0211 F4B1 BNE 0x0228
0212 9020012D LDS R2,checkoutError
0214 2022 TST R2
0215 F491 BNE 0x0228
(0133) {
(0134) // PORTC ^= 0x02;
(0135) if( RecFrameCheck(receBuf,5) )
0216 E025 LDI R18,5
0217 E030 LDI R19,0
0218 E00C LDI R16,0xC
0219 E011 LDI R17,1
021A D015 RCALL _RecFrameCheck
021B 3000 CPI R16,0
021C 0701 CPC R16,R17
021D F051 BEQ 0x0228
(0136) {//校验正确
(0137) // PORTC ^= 0x02;
(0138) GetKeyValue = receBuf[2];
021E 9020010E LDS R2,receBuf+2
0220 92200101 STS GetKeyValue,R2
(0139) LedShowLink = GetKeyValue;
0222 2433 CLR R3
0223 9230013D STS LedShowLink+1,R3
0225 9220013C STS LedShowLink,R2
(0140) singleKeyTranmit();
0227 DF78 RCALL _singleKeyTranmit
(0141) }
(0142) } //if(receBuf[0]==LocalAddr && checkoutError==0)
(0143) receCount = 0;
0228 2422 CLR R2
0229 9220012F STS receCount,R2
(0144) checkoutError = 0;
022B 9220012D STS checkoutError,R2
(0145) }
(0146) break;
(0147)
(0148) default:
(0149) break; // 错误功能码处理.
(0150) } //switch(receBuf[1])
(0151) } // if(receCount>4)
(0152) NOP();
022D 0000 NOP
022E D2D4 RCALL pop_gset1
022F 9508 RET
_RecFrameCheck:
CRCWord --> R20
GetCntTempBuf --> R10
p_CheckData --> R22
0230 D2CB RCALL push_gset3
0231 2EA2 MOV R10,R18
0232 01B8 MOVW R22,R16
(0153) } //void ReceiveFrameDisFun(void)
(0154)
(0155)
(0156) uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
(0157) {
(0158) uint CRCWord;
(0159) CRCWord = *(p_CheckData+(GetCntTempBuf-1)) +
0233 2DEA MOV R30,R10
0234 27FF CLR R31
0235 9732 SBIW R30,2
0236 0FE6 ADD R30,R22
0237 1FF7 ADC R31,R23
0238 8020 LDD R2,Z+0
0239 2433 CLR R3
023A 2C32 MOV R3,R2
023B 2422 CLR R2
023C 2DEA MOV R30,R10
023D 27FF CLR R31
023E 9731 SBIW R30,1
023F 0FE6 ADD R30,R22
0240 1FF7 ADC R31,R23
0241 8140 LDD R20,Z+0
0242 2755 CLR R21
0243 0D42 ADD R20,R2
0244 1D53 ADC R21,R3
(0160) (*(p_CheckData+(GetCntTempBuf-2))<<8);
(0161) // CRCWord = *(p_CheckData+(GetCntTempBuf-2)) +
(0162) // (*(p_CheckData+(GetCntTempBuf-1))<<8);
(0163) if(CRCWord == CRC16(p_CheckData,GetCntTempBuf-2))
0245 2D2A MOV R18,R10
0246 2733 CLR R19
0247 5022 SUBI R18,2
0248 4030 SBCI R19,0
0249 018B MOVW R16,R22
024A D008 RCALL _CRC16
024B 1740 CP R20,R16
024C 0751 CPC R21,R17
024D F411 BNE 0x0250
(0164) {
(0165) return TRUE;
024E E001 LDI R16,1
024F C001 RJMP 0x0251
(0166) }
(0167) else
(0168) {
(0169) return FLASE;
0250 2700 CLR R16
0251 D2A0 RCALL pop_gset3
0252 9508 RET
_CRC16:
i --> R20
CH --> R22
CL --> R10
SaveLo --> R14
SaveHi --> Y+2
Flag --> Y+0
CRC16Hi --> R12
CRC16Lo --> R6
iLength --> R8
data --> R4
0253 D2A4 RCALL push_gset5
0254 0149 MOVW R8,R18
0255 0128 MOVW R4,R16
0256 9723 SBIW R28,3
(0170) }
(0171) }//uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
(0172)
(0173)
(0174)
(0175)
(0176) //
(0177) MyWord CRC16(MyByte *data,int iLength)
(0178) {
(0179) MyByte CRC16Lo,CRC16Hi;
(0180) MyByte CL,CH;
(0181) MyByte SaveHi,SaveLo;
(0182) int i,Flag;
(0183)
(0184) CRC16Lo = 0xff;
0257 EF8F LDI R24,0xFF
0258 2E68 MOV R6,R24
(0185) CRC16Hi = 0xff;
0259 2EC8 MOV R12,R24
(0186) CL = 0x01;
025A 24AA CLR R10
025B 94A3 INC R10
(0187) CH = 0xa0;
025C EA60 LDI R22,0xA0
(0188) for(i=0; i<iLength; i++)
025D 2744 CLR R20
025E 2755 CLR R21
025F C028 RJMP 0x0288
(0189) {
(0190) CRC16Lo = CRC16Lo ^ data[i];
0260 01FA MOVW R30,R20
0261 0DE4 ADD R30,R4
0262 1DF5 ADC R31,R5
0263 8020 LDD R2,Z+0
0264 2462 EOR R6,R2
(0191) for( Flag=0; Flag<=7; Flag++)
0265 2400 CLR R0
0266 2411 CLR R1
0267 8219 STD Y+1,R1
0268 8208 STD Y+0,R0
(0192) {
(0193) SaveHi = CRC16Hi;
0269 82CA STD Y+2,R12
(0194) SaveLo = CRC16Lo;
026A 2CE6 MOV R14,R6
(0195) CRC16Hi = CRC16Hi>>1;
026B 94C6 LSR R12
(0196) CRC16Lo = CRC16Lo>>1;
026C 9466 LSR R6
(0197)
(0198) if((SaveHi&0x01) == 0x01)
026D 818A LDD R24,Y+2
026E 7081 ANDI R24,1
026F 3081 CPI R24,1
0270 F419 BNE 0x0274
(0199) CRC16Lo = CRC16Lo|0x80;
0271 2D86 MOV R24,R6
0272 6880 ORI R24,0x80
0273 2E68 MOV R6,R24
(0200)
(0201) if((SaveLo&0x01) == 0x01)
0274 2D8E MOV R24,R14
0275 7081 ANDI R24,1
0276 3081 CPI R24,1
0277 F411 BNE 0x027A
(0202) {
(0203) CRC16Hi = CRC16Hi ^ CH; //
0278 26C6 EOR R12,R22
(0204) CRC16Lo = CRC16Lo ^ CL; //
0279 246A EOR R6,R10
027A 8188 LDD R24,Y+0
027B 8199 LDD R25,Y+1
027C 9601 ADIW R24,1
027D 8399 STD Y+1,R25
027E 8388 STD Y+0,R24
027F E087 LDI R24,7
0280 E090 LDI R25,0
0281 8008 LDD R0,Y+0
0282 8019 LDD R1,Y+1
0283 1580 CP R24,R0
0284 0591 CPC R25,R1
0285 F71C BGE 0x0269
0286 5F4F SUBI R20,0xFF
0287 4F5F SBCI R21,0xFF
0288 1548 CP R20,R8
0289 0559 CPC R21,R9
028A F2AC BLT 0x0260
(0205) }
(0206) }
(0207) }
(0208) return(CRC16Hi<<8 | CRC16Lo);
028B 2D1C MOV R17,R12
028C 2D06 MOV R16,R6
028D 9623 ADIW R28,3
028E D267 RCALL pop_gset5
028F 9508 RET
_readRegisters:
finsh --> Y+1
result --> Y+1
readCount --> R20
addr --> R20
crcData --> R20
byteCount --> R10
tempAddr --> R12
tempData --> Y+0
i --> R22
0290 D269 RCALL push_gset4
0291 9722 SBIW R28,2
(0209) }//MyWord CRC16(MyByte *data,int iLength).
(0210)
(0211)
(0212) //读寄存器
(0213) void readRegisters(void)
(0214) {
(0215) uint addr;
(0216) uint tempAddr;
(0217) uint result;
(0218) uint crcData;
(0219) uchar readCount;
(0220) uchar byteCount;
(0221) uchar finsh; //1完成 0出错
(0222) uint i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -