📄 uart_to_twi.lst
字号:
(0168) /***********************************************************************
(0169) 通用的hex转成ascii
(0170) ************************************************************************/
(0171) unsigned char general_hex_to_ascii(unsigned char dat)
(0172) {
(0173) dat = dat & 0x0f;
_general_hex_to_ascii:
dat --> R16
0130 700F ANDI R16,0xF
(0174) if((dat >= 0)&&(dat <= 9))
0131 3000 CPI R16,0
0132 F028 BCS 0x0138
0133 E089 LDI R24,0x9
0134 1780 CP R24,R16
0135 F010 BCS 0x0138
(0175) {
(0176) dat = dat + 0x30;
0136 5D00 SUBI R16,0xD0
(0177) }
0137 C001 RJMP 0x0139
(0178) else
(0179) {
(0180) dat += 0x37;
0138 5C09 SUBI R16,0xC9
(0181) }
(0182) return dat;
0139 9508 RET
_show_data:
dat_buff --> R22
dat --> R20
013A D230 RCALL push_gset2
013B 2F40 MOV R20,R16
(0183) }
(0184) /************************************************************************
(0185) 通用的,,用来显示一个变量的值,,送到串口来
(0186) *************************************************************************/
(0187) void show_data(unsigned char dat)
(0188) {
(0189) unsigned char dat_buff;
(0190)
(0191) dat_buff = dat;
013C 2F64 MOV R22,R20
(0192) dat >>= 4;
013D 2F84 MOV R24,R20
013E 9582 SWAP R24
013F 708F ANDI R24,0xF
0140 2F48 MOV R20,R24
(0193) dat = dat & 0x0f;
0141 704F ANDI R20,0xF
(0194) dat = general_hex_to_ascii( dat );
0142 2F04 MOV R16,R20
0143 DFEC RCALL _general_hex_to_ascii
(0195) USART_TransmitByte(dat);
0144 D121 RCALL _USART_TransmitByte
(0196) dat = dat_buff;
0145 2F46 MOV R20,R22
(0197) dat = dat & 0x0f;
0146 704F ANDI R20,0xF
(0198) dat = general_hex_to_ascii( dat );
0147 2F04 MOV R16,R20
0148 DFE7 RCALL _general_hex_to_ascii
0149 2F40 MOV R20,R16
(0199) USART_TransmitByte(dat);
014A D11B RCALL _USART_TransmitByte
014B D217 RCALL pop_gset2
014C 9508 RET
_twi_transmint:
dat1_buff --> Y+2
dat1 --> R20
dat2 --> R20
014D D21F RCALL push_gset1
014E 9721 SBIW R28,1
(0200) }
(0201) //>>>>>>>>>>>>>>>>做包
(0202) void twi_transmint(void)
(0203) {
(0204) unsigned char dat1,dat2;
(0205) unsigned char dat1_buff;
(0206)
(0207) if(Twi_Hex_Data_Flag == true)
014F 9180007E LDS R24,Twi_Hex_Data_Flag
0151 3081 CPI R24,1
0152 F009 BEQ 0x0154
0153 C03F RJMP 0x0193
(0208) {
(0209)
(0210) Twi_Hex_Data_Flag = false;
0154 2422 CLR R2
0155 9220007E STS Twi_Hex_Data_Flag,R2
(0211) if(Twi_Write_Flag == true)
0157 91800081 LDS R24,Twi_Write_Flag
0159 3081 CPI R24,1
015A F4D1 BNE 0x0175
(0212) {
(0213) Twi_Write_Flag = false;
015B 92200081 STS Twi_Write_Flag,R2
(0214) dat1 = twi_write_byte(Twi_Hex_Data[0],Twi_Hex_Data[1],Twi_Hex_Data[2]);
015D 9020008A LDS R2,Twi_Hex_Data+2
015F 8228 STD Y+0,R2
0160 91200089 LDS R18,Twi_Hex_Data+1
0162 91000088 LDS R16,Twi_Hex_Data
0164 D133 RCALL _twi_write_byte
0165 2F40 MOV R20,R16
(0215)
(0216) #ifdef test
(0217) //显示TWI状态字
(0218) show_data(dat1);
(0219) USART_Transmit("this is write!");
(0220) #endif
(0221)
(0222) if(Write_Succsee_Flag == true)
0166 918000D1 LDS R24,Write_Succsee_Flag
0168 3081 CPI R24,1
0169 F439 BNE 0x0171
(0223) {
(0224) Write_Succsee_Flag = false;
016A 2422 CLR R2
016B 922000D1 STS Write_Succsee_Flag,R2
(0225)
(0226) USART_Transmit(UART_TX_buff);//写成功
016D E80E LDI R16,0x8E
016E E010 LDI R17,0
016F D0E6 RCALL _USART_Transmit
(0227) #ifdef test
(0228) USART_Transmit("write successfully!");
(0229) #endif
(0230) }
0170 C003 RJMP 0x0174
(0231) else
(0232) {
(0233) USART_Transmit(Write_Error);//写不成功
0171 E609 LDI R16,0x69
0172 E010 LDI R17,0
0173 D0E2 RCALL _USART_Transmit
(0234) #ifdef test
(0235) USART_Transmit("write error!");
(0236) #endif
(0237) }
(0238) WDR();
0174 95A8 WDR
(0239) }
(0240) if(Twi_Read_Flag == true)
0175 91800080 LDS R24,Twi_Read_Flag
0177 3081 CPI R24,1
0178 F4D1 BNE 0x0193
(0241) {
(0242) Twi_Read_Flag = false;
0179 2422 CLR R2
017A 92200080 STS Twi_Read_Flag,R2
(0243) dat2 = twi_read_byte(Twi_Hex_Data[0],Twi_Hex_Data[1]);
017C 91200089 LDS R18,Twi_Hex_Data+1
017E 91000088 LDS R16,Twi_Hex_Data
0180 D16D RCALL _twi_read_byte
0181 2F40 MOV R20,R16
(0244) #ifdef test
(0245) show_data(dat2);
(0246) USART_Transmit("this is read!");
(0247) #endif
(0248)
(0249) if(Read_Succsee_Flag != true)
0182 918000D0 LDS R24,Read_Succsee_Flag
0184 3081 CPI R24,1
0185 F021 BEQ 0x018A
(0250) {
(0251) USART_Transmit(Read_Error);//读失败
0186 E60F LDI R16,0x6F
0187 E010 LDI R17,0
0188 D0CD RCALL _USART_Transmit
(0252) #ifdef test
(0253) USART_Transmit("read error!");
(0254) #endif
(0255) }
0189 C008 RJMP 0x0192
(0256) else
(0257) {
(0258) Read_Succsee_Flag = false;
018A 2422 CLR R2
018B 922000D0 STS Read_Succsee_Flag,R2
(0259)
(0260) hex_to_ascii(dat2);//读成功 且读的数在dat2中
018D 2F04 MOV R16,R20
018E DF82 RCALL _hex_to_ascii
(0261) USART_Transmit(UART_TX_buff);
018F E80E LDI R16,0x8E
0190 E010 LDI R17,0
0191 D0C4 RCALL _USART_Transmit
(0262) #ifdef test
(0263) USART_Transmit("read successfully!");
(0264) #endif
(0265) }
(0266) WDR();
0192 95A8 WDR
(0267) }
(0268) }
0193 9621 ADIW R28,1
0194 D1DB RCALL pop_gset1
0195 9508 RET
(0269) }
(0270)
(0271) void init_data(void)
(0272) {
(0273) Twi_Write_Flag = false;
_init_data:
0196 2422 CLR R2
0197 92200081 STS Twi_Write_Flag,R2
(0274) Twi_Read_Flag = false;
0199 92200080 STS Twi_Read_Flag,R2
(0275) Twi_Hex_Data_Flag = false;
019B 9220007E STS Twi_Hex_Data_Flag,R2
(0276) Twi_ASCI_Data_Flag = false;
019D 9220007F STS Twi_ASCI_Data_Flag,R2
(0277) Slave_Led_Status = LED_OFF;
019F 9220007D STS Slave_Led_Status,R2
(0278) Main_Led_Status = LED_OFF;
01A1 9220007C STS Main_Led_Status,R2
(0279) Cur_Main_Led_Status= LED_OFF;
01A3 9220007B STS Cur_Main_Led_Status,R2
(0280) Count_10ms = 0;
01A5 9220007A STS Count_10ms,R2
(0281) WDR();
01A7 95A8 WDR
01A8 9508 RET
(0282) }
(0283) void port_init(void)
(0284) {
(0285) PORTB = 0x3F;
_port_init:
01A9 E38F LDI R24,0x3F
01AA BB88 OUT 0x18,R24
(0286) DDRB = 0x00;
01AB 2422 CLR R2
01AC BA27 OUT 0x17,R2
(0287) PORTC = 0x4F; //m103 output only
01AD E48F LDI R24,0x4F
01AE BB85 OUT 0x15,R24
(0288) DDRC = 0x00;
01AF BA24 OUT 0x14,R2
(0289) PORTD = 0xFC;
01B0 EF8C LDI R24,0xFC
01B1 BB82 OUT 0x12,R24
(0290) DDRD = 0x00;
01B2 BA21 OUT 0x11,R2
01B3 9508 RET
(0291) }
(0292) //call this routine to initialize all peripherals
(0293) void init_devices(void)
(0294) {
(0295) //stop errant interrupts until set up
(0296) CLI(); //disable all interrupts
_init_devices:
01B4 94F8 BCLR 7
(0297) port_init();
01B5 DFF3 RCALL _port_init
(0298) uart0_init();
01B6 D079 RCALL _uart0_init
(0299) twi_init();
01B7 D0D4 RCALL _twi_init
(0300) timer0_init();
01B8 D00D RCALL _timer0_init
(0301) watchdog_init();
01B9 D008 RCALL _watchdog_init
(0302)
(0303) MCUCR = 0x00;
01BA 2422 CLR R2
01BB BE25 OUT 0x35,R2
(0304) GICR = 0x00;
01BC BE2B OUT 0x3B,R2
(0305) TIMSK = 0x00; //timer interrupt sources
01BD BE29 OUT 0x39,R2
(0306) SEI(); //re-enable interrupts
01BE 9478 BSET 7
01BF 9508 RET
(0307) //all peripherals are now initialized
(0308) }
(0309) void check_watchdog(void)
(0310) {
(0311) WDR();//喂狗
_check_watchdog:
01C0 95A8 WDR
01C1 9508 RET
(0312) }
(0313) void watchdog_init(void)
(0314) {
(0315) WDR();//看门狗计数清零
_watchdog_init:
01C2 95A8 WDR
(0316) WDTCR=((1<<WDE)|(1<<WDP2)|(1<<WDP0));//64K分频,0.52S
01C3 E08D LDI R24,0xD
01C4 BD81 OUT 0x21,R24
01C5 9508 RET
(0317) //WDIE是看门狗中断使能,WDE看门狗使能 101 512k
(0318) }
(0319)
(0320) //TIMER0 initialize - prescale:256
(0321) // desired value: 100Hz
(0322) // actual value: 100.000Hz (0.0%)
(0323) void timer0_init(void)
(0324) {
(0325) TCCR0 = 0x00; //stop
_timer0_init:
01C6 2422 CLR R2
01C7 BE23 OUT 0x33,R2
(0326) TCNT0 = 0x4C; //set count
01C8 E48C LDI R24,0x4C
01C9 BF82 OUT 0x32,R24
(0327) TCCR0 = 0x04; //start timer
01CA E084 LDI R24,4
01CB BF83 OUT 0x33,R24
01CC 9508 RET
_timer0_ovf_isr:
01CD 922A ST R2,-Y
01CE 938A ST R24,-Y
01CF 939A ST R25,-Y
01D0 B62F IN R2,0x3F
01D1 922A ST R2,-Y
(0328) }
(0329)
(0330) #pragma interrupt_handler timer0_ovf_isr:10
(0331) void timer0_ovf_isr(void)
(0332) {
(0333) TCNT0 = 0x4C; //reload counter value
01D2 E48C LDI R24,0x4C
01D3 BF82 OUT 0x32,R24
(0334) //主灯
(0335) Count_10ms++;
01D4 9180007A LDS R24,Count_10ms
01D6 5F8F SUBI R24,0xFF
01D7 9380007A STS Count_10ms,R24
(0336) if((Count_10ms>0)&&(Count_10ms<5))
01D9 2422 CLR R2
01DA 1628 CP R2,R24
01DB F428 BCC 0x01E1
01DC 3085 CPI R24,5
01DD F418 BCC 0x01E1
(0337) {
(0338) Cur_Main_Led_Status = LED_ON;
01DE E081 LDI R24,1
01DF 9380007B STS Cur_Main_Led_Status,R24
(0339) }
(0340) if((Count_10ms>5)&&(Count_10ms<10))
01E1 E085 LDI R24,5
01E2 9020007A LDS R2,Count_10ms
01E4 1582 CP R24,R2
01E5 F430 BCC 0x01EC
01E6 2D82 MOV R24,R2
01E7 308A CPI R24,0xA
01E8 F418 BCC 0x01EC
(0341) {
(0342) Cur_Main_Led_Status = LED_OFF;
01E9 2422 CLR R2
01EA 9220007B STS Cur_Main_Led_Status,R2
(0343) }
01EC 9029 LD R2,Y+
01ED BE2F OUT 0x3F,R2
01EE 9199 LD R25,Y+
01EF 9189 LD R24,Y+
01F0 9029 LD R2,Y+
01F1 9518 RETI
(0344) }
(0345) void check_main_led(void)
(0346) {
(0347) if(Main_Led_Status != Cur_Main_Led_Status)
_check_main_led:
01F2 9020007B LDS R2,Cur_Main_Led_Status
01F4 9030007C LDS R3,Main_Led_Status
01F6 1432 CP R3,R2
01F7 F051 BEQ 0x0202
(0348) {
(0349) if(Main_Led_Status == LED_ON) Main_Led_Off();
01F8 2D83 MOV R24,R3
01F9 3081 CPI R24,1
01FA F411 BNE 0x01FD
01FB 9A93 SBI 0x12,3
01FC C001 RJMP 0x01FE
(0350) else Main_Led_On();
01FD 9893 CBI 0x12,3
(0351) Main_Led_Status = Cur_Main_Led_Status;
01FE 9020007B LDS R2,Cur_Main_Led_Status
0200 9220007C STS Main_Led_Status,R2
(0352) }
0202 9508 RET
(0353) }
(0354) void check_slave_led(void)
(0355) {
(0356) if(Slave_Led_Status == LED_ON)
_check_slave_led:
0203 9180007D LDS R24,Slave_Led_Status
0205 3081 CPI R24,1
0206 F411 BNE 0x0209
(0357) {
(0358) Slave_Led_On();
0207 9892 CBI 0x12,2
(0359) }
0208 C001 RJMP 0x020A
(0360) else
(0361) {
(0362) Slave_Led_Off();
0209 9A92 SBI 0x12,2
(0363) }
020A 9508 RET
_uart0_rx_isr:
020B 922A ST R2,-Y
020C 938A ST R24,-Y
020D 939A ST R25,-Y
020E 93EA ST R30,-Y
020F 93FA ST R31,-Y
0210 B62F IN R2,0x3F
0211 922A ST R2,-Y
0212 EA8E LDI R24,0xAE
0213 E090 LDI R25,0
0214 91E0008B LDS R30,Rx_Count
0216 27FF CLR R31
0217 0FE8 ADD R30,R24
0218 1FF9 ADC R31,R25
0219 B02C IN R2,0x0C
021A 8220 STD Z+0,R2
021B 9180008B LDS R24,Rx_Count
021D 5F8F SUBI R24,0xFF
021E 9380008B STS Rx_Count,R24
0220 3089 CPI R24,0x9
0221 F431 BNE 0x0228
0222 E081 LDI R24,1
0223 9380008D STS Rx_Flag,R24
0225 2422 CLR R2
0226 9220008B STS Rx_Count,R2
0228 9029 LD R2,Y+
0229 BE2F OUT 0x3F,R2
022A 91F9 LD R31,Y+
022B 91E9 LD R30,Y+
022C 9199 LD R25,Y+
022D 9189 LD R24,Y+
022E 9029 LD R2,Y+
022F 9518 RETI
_uart0_init:
0230 2422 CLR R2
0231 9220008B STS Rx_Count,R2
0233 9220008D STS Rx_Flag,R2
0235 922000CF STS Rx_Start_Pack_Flag,R2
0237 922000CE STS Rx_Over_Pack_Flag,R2
0239 B82A OUT 0x0A,R2
023A B82B OUT 0x0B,R2
023B E886 LDI R24,0x86
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -