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

📄 ma16.lis

📁 本代码是AVR单片机的完整IIC通信程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module ma16.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\avr_prm\ATmege16\ma16.c
 0000                   .dbfunc e Delay _Delay fV
 0000           ;              i -> R20,R21
 0000           ;         uidata -> R22,R23
 0000           ;           time -> R16
                        .even
 0000           _Delay::
 0000 0E940000          xcall push_gset2
 0004                   .dbline -1
 0004                   .dbline 41
 0004           ; //ICC-AVR application builder : 2006-10-21 上午 03:16:49
 0004           ; // Target : M16
 0004           ; // Crystal: 12.000Mhz
 0004           ; 
 0004           ; #include <iom16v.h>
 0004           ; #include <macros.h>
 0004           ; 
 0004           ; #define TRUE 1
 0004           ; #define FALSE 0
 0004           ; //#define baud  0x4d
 0004           ; //#define fosc 12000000
 0004           ; //#define baud 9600
 0004           ; #define Uchar unsigned char
 0004           ; struct data                     //位定义 
 0004           ; { 
 0004           ;     unsigned bit0:1; 
 0004           ;     unsigned bit1:1; 
 0004           ;     unsigned bit2:1; 
 0004           ;     unsigned bit3:1; 
 0004           ;     unsigned bit4:1; 
 0004           ;     unsigned bit5:1; 
 0004           ;     unsigned bit6:1; 
 0004           ;     unsigned bit7:1; 
 0004           ; }bit_flag; 
 0004           ; #define send_busy_flag bit_flag.bit0
 0004           ; #define GPS_validframe_flag bit_flag.bit1
 0004           ; #define receive_data_flag bit_flag.bit2
 0004           ; #define GPS_datalen 70 ///70 个有效数据
 0004           ; 
 0004           ; Uchar GPS_status_frame;
 0004           ; Uchar GPS_receive_buffer[72];
 0004           ; Uchar GPS_send_buffer[72];
 0004           ; Uchar GPS_data_conut;
 0004           ; Uchar GPS_data_start;
 0004           ; Uchar GPS_data_end;
 0004           ; 
 0004           ; Uchar *com_send_ptr;
 0004           ; Uchar com_datasen_len;
 0004           ; 
 0004           ; void Delay(Uchar time)
 0004           ; {
 0004                   .dbline 42
 0004           ;       int i,uidata=10000;
 0004 60E1              ldi R22,10000
 0006 77E2              ldi R23,39
 0008                   .dbline 43
 0008           ; for(i=0;i<time;i++)
 0008 4427              clr R20
 000A 5527              clr R21
 000C 09C0              xjmp L5
 000E           L6:
 000E                   .dbline 45
 000E                   .dbline 46
 000E 0000              nop
 0010                   .dbline 47
 0010           L7:
 0010                   .dbline 44
 0010 CB01              movw R24,R22
 0012 0197              sbiw R24,1
 0014 BC01              movw R22,R24
 0016 6030              cpi R22,0
 0018 6707              cpc R22,R23
 001A C9F7              brne L6
 001C           X0:
 001C           L3:
 001C                   .dbline 43
 001C 4F5F              subi R20,255  ; offset = 1
 001E 5F4F              sbci R21,255
 0020           L5:
 0020                   .dbline 43
 0020 202E              mov R2,R16
 0022 3324              clr R3
 0024 4215              cp R20,R2
 0026 5305              cpc R21,R3
 0028 9CF3              brlt L7
 002A                   .dbline 48
 002A           ; while(--uidata)
 002A           ; {
 002A           ;   asm("nop");
 002A           ; }
 002A           ;  asm("nop");
 002A 0000              nop
 002C                   .dbline 49
 002C           ;  asm("nop");
 002C 0000              nop
 002E                   .dbline 50
 002E           ;  asm("nop");
 002E 0000              nop
 0030                   .dbline -2
 0030           L1:
 0030 0E940000          xcall pop_gset2
 0034                   .dbline 0 ; func end
 0034 0895              ret
 0036                   .dbsym r i 20 I
 0036                   .dbsym r uidata 22 I
 0036                   .dbsym r time 16 c
 0036                   .dbend
 0036                   .dbfunc e port_init _port_init fV
                        .even
 0036           _port_init::
 0036                   .dbline -1
 0036                   .dbline 54
 0036           ; }
 0036           ; 
 0036           ; void port_init(void)
 0036           ; {
 0036                   .dbline 55
 0036           ;  DDRA  = 0xFF; // Set to ouput
 0036 8FEF              ldi R24,255
 0038 8ABB              out 0x1a,R24
 003A                   .dbline 56
 003A           ;  PORTA = 0x00;
 003A 2224              clr R2
 003C 2BBA              out 0x1b,R2
 003E                   .dbline 57
 003E           ;  DDRB  = 0xFF; // Set to ouput
 003E 87BB              out 0x17,R24
 0040                   .dbline 58
 0040           ;  PORTB = 0x00; // Startup pattern
 0040 28BA              out 0x18,R2
 0042                   .dbline 59
 0042           ;  PORTC = 0x00; //m103 output only
 0042 25BA              out 0x15,R2
 0044                   .dbline 60
 0044           ;  DDRC  = 0x00;
 0044 24BA              out 0x14,R2
 0046                   .dbline 61
 0046           ;  PORTD = 0x00;
 0046 22BA              out 0x12,R2
 0048                   .dbline 62
 0048           ;  DDRD = 0x80;
 0048 80E8              ldi R24,128
 004A 81BB              out 0x11,R24
 004C                   .dbline -2
 004C           L9:
 004C                   .dbline 0 ; func end
 004C 0895              ret
 004E                   .dbend
 004E                   .dbfunc e uart0_init _uart0_init fV
                        .even
 004E           _uart0_init::
 004E                   .dbline -1
 004E                   .dbline 65
 004E           ; }
 004E           ; void uart0_init(void)
 004E           ; {
 004E                   .dbline 66
 004E           ; UCSRA=0x00;
 004E 2224              clr R2
 0050 2BB8              out 0xb,R2
 0052                   .dbline 68
 0052           ; //UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
 0052           ; UCSRB=0xd8;
 0052 88ED              ldi R24,216
 0054 8AB9              out 0xa,R24
 0056                   .dbline 69
 0056           ; UBRRH=0x00;
 0056 20BC              out 0x20,R2
 0058                   .dbline 70
 0058           ; UBRRL=0x33;
 0058 83E3              ldi R24,51
 005A 89B9              out 0x9,R24
 005C                   .dbline 72
 005C           ; //UCSRC| = BIT(URSEL);
 005C           ; UCSRC=BIT(URSEL)|0x06;
 005C 86E8              ldi R24,134
 005E 80BD              out 0x20,R24
 0060                   .dbline -2
 0060           L10:
 0060                   .dbline 0 ; func end
 0060 0895              ret
 0062                   .dbend
                        .area vector(rom, abs)
                        .org 44
 002C 0C943100          jmp _uart0_rx_isr
                        .area text(rom, con, rel)
 0062                   .dbfile D:\avr_prm\ATmege16\ma16.c
                        .area vector(rom, abs)
                        .org 52
 0034 0C949600          jmp _uart0_tx_isr
                        .area text(rom, con, rel)
 0062                   .dbfile D:\avr_prm\ATmege16\ma16.c
 0062                   .dbfunc e uart0_rx_isr _uart0_rx_isr fV
                        .even
 0062           _uart0_rx_isr::
 0062 2A92              st -y,R2
 0064 8A93              st -y,R24
 0066 9A93              st -y,R25
 0068 EA93              st -y,R30
 006A FA93              st -y,R31
 006C 2FB6              in R2,0x3f
 006E 2A92              st -y,R2
 0070                   .dbline -1
 0070                   .dbline 77
 0070           ; }
 0070           ; #pragma interrupt_handler uart0_rx_isr:12
 0070           ; #pragma interrupt_handler uart0_tx_isr:14
 0070           ; void uart0_rx_isr(void)
 0070           ; {
 0070                   .dbline 78
 0070           ;       UCSRA|=(1<<RXC);//清接收中断标志
 0070 5F9A              sbi 0xb,7
 0072                   .dbline 79
 0072           ;       if(GPS_validframe_flag)
 0072 80919700          lds R24,_bit_flag
 0076 8695              lsr R24
 0078 8170              andi R24,1
 007A 09F0              breq L12
 007C                   .dbline 80
 007C           ;               {return;}
 007C                   .dbline 80
 007C 4FC0              xjmp L11
 007E           L12:
 007E                   .dbline 81
 007E           ;       if(GPS_status_frame==0x00)//////////////接收数据起始字符68H
 007E 20909600          lds R2,_GPS_status_frame
 0082 2220              tst R2
 0084 91F4              brne L14
 0086                   .dbline 82
 0086           ;               {
 0086                   .dbline 83
 0086           ;               GPS_data_start=UDR;
 0086 2CB0              in R2,0xc
 0088 20920400          sts _GPS_data_start,R2
 008C                   .dbline 84
 008C           ;               if(GPS_data_start!=0x24)
 008C 822D              mov R24,R2
 008E 8432              cpi R24,36
 0090 21F0              breq L16
 0092                   .dbline 85
 0092           ;                       {
 0092                   .dbline 86
 0092           ;                       GPS_status_frame=0x00;
 0092 2224              clr R2
 0094 20929600          sts _GPS_status_frame,R2
 0098                   .dbline 87
 0098           ;                       }
 0098 41C0              xjmp L15
 009A           L16:
 009A                   .dbline 89
 009A           ;               else
 009A           ;                       {
 009A                   .dbline 90
 009A           ;                       GPS_status_frame=0x01;
 009A 81E0              ldi R24,1
 009C 80939600          sts _GPS_status_frame,R24
 00A0                   .dbline 91
 00A0           ;                       GPS_receive_buffer[0]=GPS_data_start;
 00A0 20900400          lds R2,_GPS_data_start
 00A4 20924E00          sts _GPS_receive_buffer,R2
 00A8                   .dbline 92
 00A8           ;                       }
 00A8                   .dbline 93
 00A8           ;               }
 00A8 39C0              xjmp L15
 00AA           L14:
 00AA                   .dbline 94
 00AA           ;       else if(GPS_status_frame==0x01)//////////开始接收数据
 00AA 80919600          lds R24,_GPS_status_frame
 00AE 8130              cpi R24,1
 00B0 A1F4              brne L18
 00B2                   .dbline 95
 00B2           ;               {
 00B2                   .dbline 96
 00B2           ;               GPS_receive_buffer[GPS_data_conut]=UDR;
 00B2 80E0              ldi R24,<_GPS_receive_buffer
 00B4 90E0              ldi R25,>_GPS_receive_buffer
 00B6 E0910500          lds R30,_GPS_data_conut
 00BA FF27              clr R31
 00BC E80F              add R30,R24
 00BE F91F              adc R31,R25
 00C0 2CB0              in R2,0xc
 00C2 2082              std z+0,R2
 00C4                   .dbline 97
 00C4           ;               GPS_data_conut++;
 00C4 80910500          lds R24,_GPS_data_conut
 00C8 8F5F              subi R24,255    ; addi 1
 00CA 80930500          sts _GPS_data_conut,R24
 00CE                   .dbline 98
 00CE           ;               if(GPS_data_conut==GPS_datalen+1)
 00CE 8734              cpi R24,71
 00D0 29F5              brne L19
 00D2                   .dbline 99
 00D2           ;                       {
 00D2                   .dbline 100
 00D2           ;                       GPS_status_frame=0x02;
 00D2 82E0              ldi R24,2
 00D4 80939600          sts _GPS_status_frame,R24
 00D8                   .dbline 101
 00D8           ;                       }
 00D8                   .dbline 102
 00D8           ;               }
 00D8 21C0              xjmp L19
 00DA           L18:
 00DA                   .dbline 103
 00DA           ;       else if(GPS_status_frame==0x02)
 00DA 80919600          lds R24,_GPS_status_frame
 00DE 8230              cpi R24,2
 00E0 E9F4              brne L22
 00E2                   .dbline 104
 00E2           ;               {
 00E2                   .dbline 105
 00E2           ;               GPS_data_end=UDR;
 00E2 2CB0              in R2,0xc
 00E4 20920300          sts _GPS_data_end,R2
 00E8                   .dbline 106
 00E8           ;               if(GPS_data_end!=0x0a)
 00E8 822D              mov R24,R2
 00EA 8A30              cpi R24,10
 00EC 31F0              breq L24
 00EE                   .dbline 107
 00EE           ;                       {
 00EE                   .dbline 108
 00EE           ;                       GPS_validframe_flag=FALSE;
 00EE 80919700          lds R24,_bit_flag
 00F2 8D7F              andi R24,253
 00F4 80939700          sts _bit_flag,R24
 00F8                   .dbline 109
 00F8           ;                       }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -