📄 uart_to_twi.lst
字号:
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 D218 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 D212 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 D0D2 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 9180008C 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 9220008C STS Write_Succsee_Flag,R2
(0225)
(0226) USART_Transmit(UART_TX_buff);//写成功
016D E900 LDI R16,0x90
016E E010 LDI R17,0
016F D1DD 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 D1D9 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 D10C 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 9180008B 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 D1C4 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 9220008B 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 E900 LDI R16,0x90
0190 E010 LDI R17,0
0191 D1BB 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 D170 RCALL _uart0_init
(0299) twi_init();
01B7 D073 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
FILE: H:\程序库\delay.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) void delay(unsigned int d) //延时
(0004) {
_delay:
d --> R16
020B C001 RJMP 0x020D
(0005) while (d--)
(0006) WDR(); //喂狗
020C 95A8 WDR
020D 0118 MOVW R2,R16
020E 5001 SUBI R16,1
020F 4010 SBCI R17,0
0210 2022 TST R2
0211 F7D1 BNE 0x020C
0212 2033 TST R3
0213 F7C1 BNE 0x020C
0214 9508 RET
(0007) }
(0008) /* 微秒级延时程序 */
(0009) void delay_us(int time)
(0010) {
(0011) do
(0012) {
(0013) time--;
_delay_us:
time --> R16
0215 5001 SUBI R16,1
0216 4010 SBCI R17,0
(0014) }
(0015) while (time>1)WDR();
0217 E081 LDI R24,1
0218 E090 LDI R25,0
0219 1780 CP R24,R16
021A 0791 CPC R25,R17
021B F3CC BLT 0x0215
021C 95A8 WDR
021D 9508 RET
_delay_ms:
time --> R20
021E D14E RCALL push_gset1
021F 01A8 MOVW R20,R16
(0016) }
(0017) /* 毫秒级延时程序 */
(0018) void delay_ms(unsigned int time)
(0019) {
0220 C005 RJMP 0x0226
(0020) while(time!=0)
(0021) {
(0022) delay_us(1000);
0221 EE08 LDI R16,0xE8
0222 E013 LDI R17,3
0223 DFF1 RCALL _delay_us
(0023) time--;
0224 5041 SUBI R20,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -