📄 uart_to_twi_m8.lis
字号:
.module uart_to_twi_m8.c
.area text(rom, con, rel)
0000 .dbfile F:\UART_TO_TWI\uart_to_twi_m8.c
0000 .dbfunc e main _main fV
.even
0000 _main::
0000 .dbline -1
0000 .dbline 56
0000 ; /*****************************************************************
0000 ; ICC-AVR application builder : 2005-8-19 14:40:53
0000 ; Target : M8
0000 ; Crystal: 7.3728Mhz
0000 ; // Crystal: 4.6080Mhz
0000 ;
0000 ; 实验:做usart串行通讯实验
0000 ; 目的:了解及会使用usart串口
0000 ; CPU:atmega8L
0000 ; 相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
0000 ; 其中:UBRRH和UCSRC共用一个地址
0000 ; ******************************************************************/
0000 ; /*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #include "usart_m8.h"
0000 ; #include "twi_master_polling.h"
0000 ;
0000 ; //#define test
0000 ;
0000 ; #define LED_ON 1
0000 ; #define LED_OFF 0
0000 ;
0000 ; #define IO_OUT_MAIN_LED 3 //PD3 pin1
0000 ; #define IO_OUT_SLAVE_LED 2 //PD2 pin32
0000 ;
0000 ; #define Main_Led_Off() PORTD |= BIT(IO_OUT_MAIN_LED)
0000 ; #define Slave_Led_Off() PORTD |= BIT(IO_OUT_SLAVE_LED)
0000 ; #define Main_Led_On() PORTD &= ~BIT(IO_OUT_MAIN_LED)
0000 ; #define Slave_Led_On() PORTD &= ~BIT(IO_OUT_SLAVE_LED)
0000 ;
0000 ; void init_data(void);
0000 ; void port_init(void);
0000 ; void init_devices(void);
0000 ; void timer0_init(void);
0000 ; void check_watchdog(void);
0000 ; void process_data_pack(void);
0000 ; void twi_transmint(void);
0000 ; void watchdog_init(void);
0000 ; void check_main_led(void);
0000 ; void check_slave_led(void);
0000 ; void ascii_to_hex(void);
0000 ; void show_data(unsigned char dat);
0000 ;
0000 ; unsigned char Twi_Hex_Data[3];
0000 ; unsigned char Twi_ASCI_Data[6];
0000 ; unsigned char Twi_Write_Flag,Twi_Read_Flag;
0000 ; unsigned char Twi_ASCI_Data_Flag,Twi_Hex_Data_Flag;
0000 ; //LED指示灯
0000 ; unsigned char Slave_Led_Status;
0000 ; unsigned char Main_Led_Status,Cur_Main_Led_Status,Count_10ms;
0000 ;
0000 ;
0000 ;
0000 ; void main(void)
0000 ; {
0000 .dbline 57
0000 ; init_devices();
0000 73D1 rcall _init_devices
0002 .dbline 58
0002 ; init_data();
0002 54D1 rcall _init_data
0004 .dbline 60
0004 ;
0004 ; USART_Transmit( "read go!" );//用来指示,是不是看门狗复位
0004 00E0 ldi R16,<L2
0006 10E0 ldi R17,>L2
0008 00D0 rcall _USART_Transmit
000A 05C0 rjmp L4
000C L3:
000C .dbline 62
000C .dbline 63
000C 00D0 rcall _UART_Receive
000E .dbline 64
000E 78D1 rcall _check_watchdog
0010 .dbline 65
0010 04D0 rcall _process_data_pack
0012 .dbline 67
0012 03D1 rcall _twi_transmint
0014 .dbline 69
0014 A7D1 rcall _check_main_led
0016 .dbline 70
0016 L4:
0016 .dbline 61
0016 FACF rjmp L3
0018 X0:
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbend
001A .dbfunc e process_data_pack _process_data_pack fV
001A ; dat -> R22
001A ; cnt -> R20
.even
001A _process_data_pack::
001A 00D0 rcall push_gset2
001C .dbline -1
001C .dbline 75
001C ; while(1) //forever
001C ; {
001C ; UART_Receive();
001C ; check_watchdog();//喂狗
001C ; process_data_pack();//解包
001C ; //while(1)WDR();
001C ; twi_transmint();
001C ; //while(1)WDR();
001C ; check_main_led();
001C ; }
001C ;
001C ; }
001C ; //>>>>>>>>>>>>>>>>>>>>>>>>解包
001C ; void process_data_pack(void)
001C ; {
001C .dbline 78
001C ; unsigned char cnt,dat;
001C ;
001C ; if(Rx_Over_Pack_Flag == true)
001C 80910000 lds R24,_Rx_Over_Pack_Flag
0020 8130 cpi R24,1
0022 09F0 breq X1
0024 8AC0 rjmp L7
0026 X1:
0026 .dbline 79
0026 ; {
0026 .dbline 81
0026 ; //从灯
0026 ; Slave_Led_Status = LED_ON;
0026 81E0 ldi R24,1
0028 80930300 sts _Slave_Led_Status,R24
002C .dbline 82
002C ; check_slave_led();//先让通讯亮一下
002C ACD1 rcall _check_slave_led
002E .dbline 83
002E ; Rx_Over_Pack_Flag = false;
002E 2224 clr R2
0030 20920000 sts _Rx_Over_Pack_Flag,R2
0034 .dbline 84
0034 ; Slave_Led_Status = LED_OFF;
0034 20920300 sts _Slave_Led_Status,R2
0038 .dbline 86
0038 ;
0038 ; if(UART_RX_buff[1] == 0x57)
0038 80910100 lds R24,_UART_RX_buff+1
003C 8735 cpi R24,87
003E 69F5 brne L9
0040 .dbline 87
0040 ; {
0040 .dbline 88
0040 ; for(cnt =0;cnt<6;cnt++)
0040 4427 clr R20
0042 25C0 rjmp L15
0044 L12:
0044 .dbline 89
0044 ; {
0044 .dbline 90
0044 ; dat = UART_RX_buff[cnt+2];//前面两个字节是'x','w'或'R'
0044 80E0 ldi R24,<_UART_RX_buff+2
0046 90E0 ldi R25,>_UART_RX_buff+2
0048 E42F mov R30,R20
004A FF27 clr R31
004C E80F add R30,R24
004E F91F adc R31,R25
0050 6081 ldd R22,z+0
0052 .dbline 91
0052 ; if((dat >= 0x30)&&(dat <=0x39))
0052 6033 cpi R22,48
0054 68F0 brlo L17
0056 89E3 ldi R24,57
0058 8617 cp R24,R22
005A 50F0 brlo L17
005C .dbline 92
005C ; {
005C .dbline 93
005C ; Twi_ASCI_Data[cnt] = dat - 0x30;
005C 80E0 ldi R24,<_Twi_ASCI_Data
005E 90E0 ldi R25,>_Twi_ASCI_Data
0060 E42F mov R30,R20
0062 FF27 clr R31
0064 E80F add R30,R24
0066 F91F adc R31,R25
0068 862F mov R24,R22
006A 8053 subi R24,48
006C 8083 std z+0,R24
006E .dbline 94
006E ; }
006E 0EC0 rjmp L18
0070 L17:
0070 .dbline 95
0070 ; else if((dat>=0x41)&&(dat<=0x46))
0070 6134 cpi R22,65
0072 60F0 brlo L19
0074 86E4 ldi R24,70
0076 8617 cp R24,R22
0078 48F0 brlo L19
007A .dbline 96
007A ; {
007A .dbline 97
007A ; Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
007A 80E0 ldi R24,<_Twi_ASCI_Data
007C 90E0 ldi R25,>_Twi_ASCI_Data
007E E42F mov R30,R20
0080 FF27 clr R31
0082 E80F add R30,R24
0084 F91F adc R31,R25
0086 862F mov R24,R22
0088 8753 subi R24,55
008A 8083 std z+0,R24
008C .dbline 98
008C ; }
008C L19:
008C L18:
008C .dbline 99
008C L13:
008C .dbline 88
008C 4395 inc R20
008E L15:
008E .dbline 88
008E 4630 cpi R20,6
0090 C8F2 brlo L12
0092 .dbline 100
0092 ; }
0092 ; ascii_to_hex();//组合成数据
0092 55D0 rcall _ascii_to_hex
0094 .dbline 101
0094 ; Twi_Write_Flag = true;
0094 81E0 ldi R24,1
0096 80930700 sts _Twi_Write_Flag,R24
009A .dbline 102
009A ; }
009A L9:
009A .dbline 103
009A ; if(UART_RX_buff[1] == 0x52)
009A 80910100 lds R24,_UART_RX_buff+1
009E 8235 cpi R24,82
00A0 69F5 brne L21
00A2 .dbline 104
00A2 ; {
00A2 .dbline 105
00A2 ; for(cnt =0;cnt<4;cnt++)
00A2 4427 clr R20
00A4 25C0 rjmp L27
00A6 L24:
00A6 .dbline 106
00A6 ; {
00A6 .dbline 107
00A6 ; dat = UART_RX_buff[cnt+2];
00A6 80E0 ldi R24,<_UART_RX_buff+2
00A8 90E0 ldi R25,>_UART_RX_buff+2
00AA E42F mov R30,R20
00AC FF27 clr R31
00AE E80F add R30,R24
00B0 F91F adc R31,R25
00B2 6081 ldd R22,z+0
00B4 .dbline 108
00B4 ; if((dat >= 0x30)&&(dat <=0x39))
00B4 6033 cpi R22,48
00B6 68F0 brlo L29
00B8 89E3 ldi R24,57
00BA 8617 cp R24,R22
00BC 50F0 brlo L29
00BE .dbline 109
00BE ; {
00BE .dbline 110
00BE ; Twi_ASCI_Data[cnt] = dat - 0x30;
00BE 80E0 ldi R24,<_Twi_ASCI_Data
00C0 90E0 ldi R25,>_Twi_ASCI_Data
00C2 E42F mov R30,R20
00C4 FF27 clr R31
00C6 E80F add R30,R24
00C8 F91F adc R31,R25
00CA 862F mov R24,R22
00CC 8053 subi R24,48
00CE 8083 std z+0,R24
00D0 .dbline 111
00D0 ; }
00D0 0EC0 rjmp L30
00D2 L29:
00D2 .dbline 112
00D2 ; else if((dat>=0x41)&&(dat<=0x46))
00D2 6134 cpi R22,65
00D4 60F0 brlo L31
00D6 86E4 ldi R24,70
00D8 8617 cp R24,R22
00DA 48F0 brlo L31
00DC .dbline 113
00DC ; {
00DC .dbline 114
00DC ; Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
00DC 80E0 ldi R24,<_Twi_ASCI_Data
00DE 90E0 ldi R25,>_Twi_ASCI_Data
00E0 E42F mov R30,R20
00E2 FF27 clr R31
00E4 E80F add R30,R24
00E6 F91F adc R31,R25
00E8 862F mov R24,R22
00EA 8753 subi R24,55
00EC 8083 std z+0,R24
00EE .dbline 115
00EE ; }
00EE L31:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -