📄 uart_to_twi.lst
字号:
__text_start:
__start:
0020 E5CF LDI R28,0x5F
0021 E0D4 LDI R29,4
0022 BFCD OUT 0x3D,R28
0023 BFDE OUT 0x3E,R29
0024 51C0 SUBI R28,0x10
0025 40D0 SBCI R29,0
0026 EA0A LDI R16,0xAA
0027 8308 STD Y+0,R16
0028 2400 CLR R0
0029 E7EA LDI R30,0x7A
002A E0F0 LDI R31,0
002B E010 LDI R17,0
002C 3DE2 CPI R30,0xD2
002D 07F1 CPC R31,R17
002E F011 BEQ 0x0031
002F 9201 ST R0,Z+
0030 CFFB RJMP 0x002C
0031 8300 STD Z+0,R16
0032 E2E6 LDI R30,0x26
0033 E0F0 LDI R31,0
0034 E6A0 LDI R26,0x60
0035 E0B0 LDI R27,0
0036 E010 LDI R17,0
0037 34E0 CPI R30,0x40
0038 07F1 CPC R31,R17
0039 F021 BEQ 0x003E
003A 95C8 LPM
003B 9631 ADIW R30,1
003C 920D ST R0,X+
003D CFF9 RJMP 0x0037
003E D001 RCALL _main
_exit:
003F CFFF RJMP _exit
FILE: F:\UART_TO_TWI\uart_to_twi_m8.c
(0001) /*****************************************************************
(0002) ICC-AVR application builder : 2005-8-19 14:40:53
(0003) Target : M8
(0004) Crystal: 7.3728Mhz
(0005) // Crystal: 4.6080Mhz
(0006)
(0007) 实验:做usart串行通讯实验
(0008) 目的:了解及会使用usart串口
(0009) CPU:atmega8L
(0010) 相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
(0011) 其中:UBRRH和UCSRC共用一个地址
(0012) ******************************************************************/
(0013) /*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
(0014) #include <iom8v.h>
(0015) #include <macros.h>
(0016) #include "usart_m8.h"
(0017) #include "twi_master_polling.h"
(0018)
(0019) //#define test
(0020)
(0021) #define LED_ON 1
(0022) #define LED_OFF 0
(0023)
(0024) #define IO_OUT_MAIN_LED 3 //PD3 pin1
(0025) #define IO_OUT_SLAVE_LED 2 //PD2 pin32
(0026)
(0027) #define Main_Led_Off() PORTD |= BIT(IO_OUT_MAIN_LED)
(0028) #define Slave_Led_Off() PORTD |= BIT(IO_OUT_SLAVE_LED)
(0029) #define Main_Led_On() PORTD &= ~BIT(IO_OUT_MAIN_LED)
(0030) #define Slave_Led_On() PORTD &= ~BIT(IO_OUT_SLAVE_LED)
(0031)
(0032) void init_data(void);
(0033) void port_init(void);
(0034) void init_devices(void);
(0035) void timer0_init(void);
(0036) void check_watchdog(void);
(0037) void process_data_pack(void);
(0038) void twi_transmint(void);
(0039) void watchdog_init(void);
(0040) void check_main_led(void);
(0041) void check_slave_led(void);
(0042) void ascii_to_hex(void);
(0043) void show_data(unsigned char dat);
(0044)
(0045) unsigned char Twi_Hex_Data[3];
(0046) unsigned char Twi_ASCI_Data[6];
(0047) unsigned char Twi_Write_Flag,Twi_Read_Flag;
(0048) unsigned char Twi_ASCI_Data_Flag,Twi_Hex_Data_Flag;
(0049) //LED指示灯
(0050) unsigned char Slave_Led_Status;
(0051) unsigned char Main_Led_Status,Cur_Main_Led_Status,Count_10ms;
(0052)
(0053)
(0054)
(0055) void main(void)
(0056) {
(0057) init_devices();
_main:
0040 D173 RCALL _init_devices
(0058) init_data();
0041 D154 RCALL _init_data
(0059)
(0060) USART_Transmit( "read go!" );//用来指示,是不是看门狗复位
0042 E600 LDI R16,0x60
0043 E010 LDI R17,0
0044 D211 RCALL _USART_Transmit
0045 C005 RJMP 0x004B
(0061) while(1) //forever
(0062) {
(0063) UART_Receive();
0046 D1FC RCALL _UART_Receive
(0064) check_watchdog();//喂狗
0047 D178 RCALL _check_watchdog
(0065) process_data_pack();//解包
0048 D004 RCALL _process_data_pack
(0066) //while(1)WDR();
(0067) twi_transmint();
0049 D103 RCALL _twi_transmint
(0068) //while(1)WDR();
(0069) check_main_led();
004A D1A7 RCALL _check_main_led
004B CFFA RJMP 0x0046
004C 9508 RET
_process_data_pack:
dat --> R22
cnt --> R20
004D D31D RCALL push_gset2
(0070) }
(0071)
(0072) }
(0073) //>>>>>>>>>>>>>>>>>>>>>>>>解包
(0074) void process_data_pack(void)
(0075) {
(0076) unsigned char cnt,dat;
(0077)
(0078) if(Rx_Over_Pack_Flag == true)
004E 918000CE LDS R24,Rx_Over_Pack_Flag
0050 3081 CPI R24,1
0051 F009 BEQ 0x0053
0052 C08A RJMP 0x00DD
(0079) {
(0080) //从灯
(0081) Slave_Led_Status = LED_ON;
0053 E081 LDI R24,1
0054 9380007D STS Slave_Led_Status,R24
(0082) check_slave_led();//先让通讯亮一下
0056 D1AC RCALL _check_slave_led
(0083) Rx_Over_Pack_Flag = false;
0057 2422 CLR R2
0058 922000CE STS Rx_Over_Pack_Flag,R2
(0084) Slave_Led_Status = LED_OFF;
005A 9220007D STS Slave_Led_Status,R2
(0085)
(0086) if(UART_RX_buff[1] == 0x57)
005C 918000AF LDS R24,UART_RX_buff+1
005E 3587 CPI R24,0x57
005F F569 BNE 0x008D
(0087) {
(0088) for(cnt =0;cnt<6;cnt++)
0060 2744 CLR R20
0061 C025 RJMP 0x0087
(0089) {
(0090) dat = UART_RX_buff[cnt+2];//前面两个字节是'x','w'或'R'
0062 EB80 LDI R24,0xB0
0063 E090 LDI R25,0
0064 2FE4 MOV R30,R20
0065 27FF CLR R31
0066 0FE8 ADD R30,R24
0067 1FF9 ADC R31,R25
0068 8160 LDD R22,Z+0
(0091) if((dat >= 0x30)&&(dat <=0x39))
0069 3360 CPI R22,0x30
006A F068 BCS 0x0078
006B E389 LDI R24,0x39
006C 1786 CP R24,R22
006D F050 BCS 0x0078
(0092) {
(0093) Twi_ASCI_Data[cnt] = dat - 0x30;
006E E882 LDI R24,0x82
006F E090 LDI R25,0
0070 2FE4 MOV R30,R20
0071 27FF CLR R31
0072 0FE8 ADD R30,R24
0073 1FF9 ADC R31,R25
0074 2F86 MOV R24,R22
0075 5380 SUBI R24,0x30
0076 8380 STD Z+0,R24
(0094) }
0077 C00E RJMP 0x0086
(0095) else if((dat>=0x41)&&(dat<=0x46))
0078 3461 CPI R22,0x41
0079 F060 BCS 0x0086
007A E486 LDI R24,0x46
007B 1786 CP R24,R22
007C F048 BCS 0x0086
(0096) {
(0097) Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
007D E882 LDI R24,0x82
007E E090 LDI R25,0
007F 2FE4 MOV R30,R20
0080 27FF CLR R31
0081 0FE8 ADD R30,R24
0082 1FF9 ADC R31,R25
0083 2F86 MOV R24,R22
0084 5387 SUBI R24,0x37
0085 8380 STD Z+0,R24
0086 9543 INC R20
0087 3046 CPI R20,6
0088 F2C8 BCS 0x0062
(0098) }
(0099) }
(0100) ascii_to_hex();//组合成数据
0089 D055 RCALL _ascii_to_hex
(0101) Twi_Write_Flag = true;
008A E081 LDI R24,1
008B 93800081 STS Twi_Write_Flag,R24
(0102) }
(0103) if(UART_RX_buff[1] == 0x52)
008D 918000AF LDS R24,UART_RX_buff+1
008F 3582 CPI R24,0x52
0090 F569 BNE 0x00BE
(0104) {
(0105) for(cnt =0;cnt<4;cnt++)
0091 2744 CLR R20
0092 C025 RJMP 0x00B8
(0106) {
(0107) dat = UART_RX_buff[cnt+2];
0093 EB80 LDI R24,0xB0
0094 E090 LDI R25,0
0095 2FE4 MOV R30,R20
0096 27FF CLR R31
0097 0FE8 ADD R30,R24
0098 1FF9 ADC R31,R25
0099 8160 LDD R22,Z+0
(0108) if((dat >= 0x30)&&(dat <=0x39))
009A 3360 CPI R22,0x30
009B F068 BCS 0x00A9
009C E389 LDI R24,0x39
009D 1786 CP R24,R22
009E F050 BCS 0x00A9
(0109) {
(0110) Twi_ASCI_Data[cnt] = dat - 0x30;
009F E882 LDI R24,0x82
00A0 E090 LDI R25,0
00A1 2FE4 MOV R30,R20
00A2 27FF CLR R31
00A3 0FE8 ADD R30,R24
00A4 1FF9 ADC R31,R25
00A5 2F86 MOV R24,R22
00A6 5380 SUBI R24,0x30
00A7 8380 STD Z+0,R24
(0111) }
00A8 C00E RJMP 0x00B7
(0112) else if((dat>=0x41)&&(dat<=0x46))
00A9 3461 CPI R22,0x41
00AA F060 BCS 0x00B7
00AB E486 LDI R24,0x46
00AC 1786 CP R24,R22
00AD F048 BCS 0x00B7
(0113) {
(0114) Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
00AE E882 LDI R24,0x82
00AF E090 LDI R25,0
00B0 2FE4 MOV R30,R20
00B1 27FF CLR R31
00B2 0FE8 ADD R30,R24
00B3 1FF9 ADC R31,R25
00B4 2F86 MOV R24,R22
00B5 5387 SUBI R24,0x37
00B6 8380 STD Z+0,R24
00B7 9543 INC R20
00B8 3044 CPI R20,4
00B9 F2C8 BCS 0x0093
(0115) }
(0116) }
(0117) ascii_to_hex();
00BA D024 RCALL _ascii_to_hex
(0118) Twi_Read_Flag = true;
00BB E081 LDI R24,1
00BC 93800080 STS Twi_Read_Flag,R24
(0119) }
(0120) Twi_Hex_Data_Flag = true;
00BE E081 LDI R24,1
00BF 9380007E STS Twi_Hex_Data_Flag,R24
(0121) //处理完,先把数据放在UART_TX_buff[]绶冲区,且接收绶冲区清零
(0122) for(cnt=0;cnt<9;cnt++)
00C1 2744 CLR R20
00C2 C017 RJMP 0x00DA
(0123) {
(0124) UART_TX_buff[cnt] = UART_RX_buff[cnt];
00C3 EA8E LDI R24,0xAE
00C4 E090 LDI R25,0
00C5 2FE4 MOV R30,R20
00C6 27FF CLR R31
00C7 0FE8 ADD R30,R24
00C8 1FF9 ADC R31,R25
00C9 8020 LDD R2,Z+0
00CA E88E LDI R24,0x8E
00CB E090 LDI R25,0
00CC 2FE4 MOV R30,R20
00CD 27FF CLR R31
00CE 0FE8 ADD R30,R24
00CF 1FF9 ADC R31,R25
00D0 8220 STD Z+0,R2
(0125) UART_RX_buff[cnt] = 0;
00D1 EA8E LDI R24,0xAE
00D2 E090 LDI R25,0
00D3 2FE4 MOV R30,R20
00D4 27FF CLR R31
00D5 0FE8 ADD R30,R24
00D6 1FF9 ADC R31,R25
00D7 2422 CLR R2
00D8 8220 STD Z+0,R2
00D9 9543 INC R20
00DA 3049 CPI R20,0x9
00DB F338 BCS 0x00C3
(0126) }
(0127) WDR();
00DC 95A8 WDR
(0128) }
00DD D285 RCALL pop_gset2
00DE 9508 RET
(0129) }
(0130) //继续解包,=>两个ASCII码组成一个数
(0131) void ascii_to_hex(void)
(0132) {
(0133) unsigned char cnt,i;
(0134)
(0135) for(cnt=0,i=0;cnt<6;cnt++,cnt++,i++)
_ascii_to_hex:
i --> R16
cnt --> R18
00DF 2722 CLR R18
00E0 2700 CLR R16
00E1 C02B RJMP 0x010D
(0136) {
(0137) Twi_Hex_Data[i] = Twi_ASCI_Data[cnt];//先放ASCII的高位(四位)
00E2 E882 LDI R24,0x82
00E3 E090 LDI R25,0
00E4 2FE2 MOV R30,R18
00E5 27FF CLR R31
00E6 0FE8 ADD R30,R24
00E7 1FF9 ADC R31,R25
00E8 8020 LDD R2,Z+0
00E9 E888 LDI R24,0x88
00EA E090 LDI R25,0
00EB 2FE0 MOV R30,R16
00EC 27FF CLR R31
00ED 0FE8 ADD R30,R24
00EE 1FF9 ADC R31,R25
00EF 8220 STD Z+0,R2
(0138) Twi_Hex_Data[i] <<= 4;
00F0 2E20 MOV R2,R16
00F1 2433 CLR R3
00F2 0E28 ADD R2,R24
00F3 1E39 ADC R3,R25
00F4 01F1 MOVW R30,R2
00F5 8180 LDD R24,Z+0
00F6 708F ANDI R24,0xF
00F7 9582 SWAP R24
00F8 8380 STD Z+0,R24
(0139) Twi_Hex_Data[i] += Twi_ASCI_Data[cnt+1];
00F9 E888 LDI R24,0x88
00FA E090 LDI R25,0
00FB 2E20 MOV R2,R16
00FC 2433 CLR R3
00FD 0E28 ADD R2,R24
00FE 1E39 ADC R3,R25
00FF E883 LDI R24,0x83
0100 E090 LDI R25,0
0101 2FE2 MOV R30,R18
0102 27FF CLR R31
0103 0FE8 ADD R30,R24
0104 1FF9 ADC R31,R25
0105 8040 LDD R4,Z+0
0106 01F1 MOVW R30,R2
0107 8050 LDD R5,Z+0
0108 0C54 ADD R5,R4
0109 8250 STD Z+0,R5
010A 9523 INC R18
010B 9523 INC R18
010C 9503 INC R16
010D 3026 CPI R18,6
010E F408 BCC 0x0110
010F CFD2 RJMP 0x00E2
0110 9508 RET
_hex_to_ascii:
dat_buff --> R20
dat --> R16
0111 D25B RCALL push_gset1
(0140) }
(0141) }
(0142) void hex_to_ascii(unsigned char dat)
(0143) {
(0144) unsigned char dat_buff;
(0145)
(0146) dat_buff = dat;
0112 2F40 MOV R20,R16
(0147) dat = dat&0x0f;
0113 700F ANDI R16,0xF
(0148) if((dat>=0)&&(dat<=9))
0114 3000 CPI R16,0
0115 F028 BCS 0x011B
0116 E089 LDI R24,0x9
0117 1780 CP R24,R16
0118 F010 BCS 0x011B
(0149) {
(0150) dat += 0x30;
0119 5D00 SUBI R16,0xD0
(0151) }
011A C001 RJMP 0x011C
(0152) else
(0153) dat += 0x37;
011B 5C09 SUBI R16,0xC9
(0154) UART_TX_buff[7] = dat;
011C 93000095 STS 0x95,R16
(0155)
(0156) dat = dat_buff;
011E 2F04 MOV R16,R20
(0157) dat >>= 4;
011F 2F80 MOV R24,R16
0120 9582 SWAP R24
0121 708F ANDI R24,0xF
0122 2F08 MOV R16,R24
(0158) dat = dat&0x0f;
0123 700F ANDI R16,0xF
(0159) if((dat>=0)&&(dat<=9))
0124 3000 CPI R16,0
0125 F028 BCS 0x012B
0126 E089 LDI R24,0x9
0127 1780 CP R24,R16
0128 F010 BCS 0x012B
(0160) {
(0161) dat += 0x30;
0129 5D00 SUBI R16,0xD0
(0162) }
012A C001 RJMP 0x012C
(0163) else
(0164) dat += 0x37;
012B 5C09 SUBI R16,0xC9
(0165) UART_TX_buff[6] = dat;
012C 93000094 STS 0x94,R16
012E D241 RCALL pop_gset1
012F 9508 RET
(0166) }
(0167) //<<<<<<<<<<<<<<<<<<<<<
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -