⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_to_twi_m8.lis

📁 AVR单片机的T_TO_TWI通讯方式
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .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 + -