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

📄 main.lis

📁 一个关于AVR单片机的例程
💻 LIS
字号:
                        .module main.c
                        .area lit(rom, con, rel)
 0000           _buffer::
 0000 687474703A2F2F7777772E6176727669  .byte 'h,'t,'t,'p,58,47,47,'w,'w,'w,46,'a,'v,'r,'v,'i
 0010 2E636F6D00        .byte 46,'c,'o,'m,0
 0015                   .dbfile E:\avr\usart_mega16\main.c
 0015                   .dbsym e buffer _buffer A[21:21]kc
                        .area text(rom, con, rel)
 0000                   .dbfile E:\avr\usart_mega16\main.c
 0000                   .dbfunc e USART_Init _USART_Init fV
 0000           ;            tmp -> R10,R11
 0000           ;           baud -> R10,R11
                        .even
 0000           _USART_Init::
 0000 0E940000          xcall push_gset3
 0004 5801              movw R10,R16
 0006                   .dbline -1
 0006                   .dbline 15
 0006           ; // ICC-AVR application builder : 2007-5-20 17:21:25
 0006           ; // Target : M16
 0006           ; // Crystal: 7.3728Mhz
 0006           ; // AVR mega16 串口测试
 0006           ; 
 0006           ; #include <iom16v.h>
 0006           ; #include <macros.h>
 0006           ; 
 0006           ; #define F_CPU 7372800
 0006           ; const unsigned char buffer[]="http://www.avrvi.com";
 0006           ; 
 0006           ; //下面三个函数直接从数据手册上拷贝过来的
 0006           ; 
 0006           ; void USART_Init( unsigned int baud )
 0006           ; {
 0006                   .dbline 18
 0006           ; unsigned int tmp;
 0006           ; /* 设置波特率*/
 0006           ; tmp= F_CPU/baud/16-1;
 0006 1501              movw R2,R10
 0008 4424              clr R4
 000A 5524              clr R5
 000C 40E0              ldi R20,0
 000E 50E8              ldi R21,128
 0010 60E7              ldi R22,112
 0012 70E0              ldi R23,0
 0014 5A92              st -y,R5
 0016 4A92              st -y,R4
 0018 3A92              st -y,R3
 001A 2A92              st -y,R2
 001C 8A01              movw R16,R20
 001E 9B01              movw R18,R22
 0020 0E940000          xcall div32s
 0024 40E1              ldi R20,16
 0026 50E0              ldi R21,0
 0028 60E0              ldi R22,0
 002A 70E0              ldi R23,0
 002C 7A93              st -y,R23
 002E 6A93              st -y,R22
 0030 5A93              st -y,R21
 0032 4A93              st -y,R20
 0034 0E940000          xcall div32s
 0038 1801              movw R2,R16
 003A 2901              movw R4,R18
 003C 41E0              ldi R20,1
 003E 50E0              ldi R21,0
 0040 60E0              ldi R22,0
 0042 70E0              ldi R23,0
 0044 241A              sub R2,R20
 0046 350A              sbc R3,R21
 0048 460A              sbc R4,R22
 004A 570A              sbc R5,R23
 004C 5101              movw R10,R2
 004E                   .dbline 19
 004E           ; UBRRH = (unsigned char)(tmp>>8);
 004E 232C              mov R2,R3
 0050 3324              clr R3
 0052 20BC              out 0x20,R2
 0054                   .dbline 20
 0054           ; UBRRL = (unsigned char)tmp;
 0054 A9B8              out 0x9,R10
 0056                   .dbline 22
 0056           ; /* 接收器与发送器使能*/
 0056           ; UCSRB = (1<<RXEN)|(1<<TXEN);
 0056 88E1              ldi R24,24
 0058 8AB9              out 0xa,R24
 005A                   .dbline 24
 005A           ; /* 设置帧格式: 8 个数据位, 2 个停止位*/
 005A           ; UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
 005A 8EE8              ldi R24,142
 005C 80BD              out 0x20,R24
 005E                   .dbline -2
 005E           L1:
 005E 0E940000          xcall pop_gset3
 0062                   .dbline 0 ; func end
 0062 0895              ret
 0064                   .dbsym r tmp 10 i
 0064                   .dbsym r baud 10 i
 0064                   .dbend
 0064                   .dbfunc e uart0_init _uart0_init fV
                        .even
 0064           _uart0_init::
 0064                   .dbline -1
 0064                   .dbline 51
 0064           ; }
 0064           ; /* UMSEL 模式选择
 0064           ;    0 异步操作
 0064           ;    1 同步操作
 0064           ; 
 0064           ;   USBS 停止位位数
 0064           ;    0    1
 0064           ;    1    2
 0064           ; 
 0064           ;    UCSZ2 UCSZ1 UCSZ0 字符长度
 0064           ;    0 0 0 5 位
 0064           ;    0 0 1 6 位
 0064           ;    0 1 0 7 位
 0064           ;    0 1 1 8 位
 0064           ;    1 0 0 保留
 0064           ;    1 0 1 保留
 0064           ;    1 1 0 保留
 0064           ;    1 1 1 9 位
 0064           ; */
 0064           ; // ICC 生成的初始化
 0064           ; //UART0 initialize
 0064           ; // desired baud rate: 9600
 0064           ; // actual: baud rate:9600 (0.0%)
 0064           ; // char size: 8 bit
 0064           ; // parity: Disabled
 0064           ; void uart0_init(void)
 0064           ; {
 0064                   .dbline 52
 0064           ;  UCSRB = 0x00; //disable while setting baud rate
 0064 2224              clr R2
 0066 2AB8              out 0xa,R2
 0068                   .dbline 53
 0068           ;  UCSRA = 0x00;
 0068 2BB8              out 0xb,R2
 006A                   .dbline 54
 006A           ;  UCSRC = BIT(URSEL) | 0x06;
 006A 86E8              ldi R24,134
 006C 80BD              out 0x20,R24
 006E                   .dbline 55
 006E           ;  UBRRL = 0x2F; //set baud rate lo
 006E 8FE2              ldi R24,47
 0070 89B9              out 0x9,R24
 0072                   .dbline 56
 0072           ;  UBRRH = 0x00; //set baud rate hi
 0072 20BC              out 0x20,R2
 0074                   .dbline 57
 0074           ;  UCSRB = 0x18;
 0074 88E1              ldi R24,24
 0076 8AB9              out 0xa,R24
 0078                   .dbline -2
 0078           L2:
 0078                   .dbline 0 ; func end
 0078 0895              ret
 007A                   .dbend
 007A                   .dbfunc e USART_Transmit _USART_Transmit fV
 007A           ;           data -> R16
                        .even
 007A           _USART_Transmit::
 007A                   .dbline -1
 007A                   .dbline 62
 007A           ; }
 007A           ; 
 007A           ; // 数据发送【发送5 到8 位数据位的帧】
 007A           ; void USART_Transmit( unsigned char data )
 007A           ; {
 007A           L4:
 007A                   .dbline 65
 007A           L5:
 007A                   .dbline 64
 007A           ; /* 等待发送缓冲器为空 */
 007A           ; while ( !( UCSRA & (1<<UDRE)) )
 007A 5D9B              sbis 0xb,5
 007C FECF              rjmp L4
 007E                   .dbline 67
 007E           ; ;
 007E           ; /* 将数据放入缓冲器,发送数据 */
 007E           ; UDR = data;
 007E 0CB9              out 0xc,R16
 0080                   .dbline -2
 0080           L3:
 0080                   .dbline 0 ; func end
 0080 0895              ret
 0082                   .dbsym r data 16 c
 0082                   .dbend
 0082                   .dbfunc e USART_Receive _USART_Receive fc
                        .even
 0082           _USART_Receive::
 0082                   .dbline -1
 0082                   .dbline 73
 0082           ; } 
 0082           ; 
 0082           ; 
 0082           ; // 数据接收【以5 到8 个数据位的方式接收数 据帧】
 0082           ; unsigned char USART_Receive( void )
 0082           ; {
 0082           L8:
 0082                   .dbline 76
 0082           L9:
 0082                   .dbline 75
 0082           ; /* 等待接收数据*/
 0082           ; while ( !(UCSRA & (1<<RXC)) )
 0082 5F9B              sbis 0xb,7
 0084 FECF              rjmp L8
 0086                   .dbline 78
 0086           ; ;
 0086           ; /* 从缓冲器中获取并返回数据*/
 0086           ; return UDR;
 0086 0CB1              in R16,0xc
 0088                   .dbline -2
 0088           L7:
 0088                   .dbline 0 ; func end
 0088 0895              ret
 008A                   .dbend
 008A                   .dbfunc e USART_Transmit_2 _USART_Transmit_2 fV
                        .even
 008A           _USART_Transmit_2::
 008A                   .dbline -1
 008A                   .dbline 83
 008A           ; } 
 008A           ; 
 008A           ; //连续发送字符
 008A           ; void USART_Transmit_2( void )
 008A           ; {
 008A           L12:
 008A                   .dbline 85
 008A           L13:
 008A                   .dbline 84
 008A           ; while ( !( UCSRA & (1<<UDRE)) )
 008A 5D9B              sbis 0xb,5
 008C FECF              rjmp L12
 008E                   .dbline 86
 008E           ; ;
 008E           ; UDR = 'H';
 008E 88E4              ldi R24,72
 0090 8CB9              out 0xc,R24
 0092           L15:
 0092                   .dbline 88
 0092           L16:
 0092                   .dbline 87
 0092           ; while ( !( UCSRA & (1<<UDRE)) )
 0092 5D9B              sbis 0xb,5
 0094 FECF              rjmp L15
 0096                   .dbline 89
 0096           ; ;
 0096           ; UDR = 'e';
 0096 85E6              ldi R24,101
 0098 8CB9              out 0xc,R24
 009A           L18:
 009A                   .dbline 91
 009A           L19:
 009A                   .dbline 90
 009A           ; while ( !( UCSRA & (1<<UDRE)) )
 009A 5D9B              sbis 0xb,5
 009C FECF              rjmp L18
 009E                   .dbline 92
 009E           ; ;
 009E           ; UDR = 'l';
 009E 8CE6              ldi R24,108
 00A0 8CB9              out 0xc,R24
 00A2           L21:
 00A2                   .dbline 94
 00A2           L22:
 00A2                   .dbline 93
 00A2           ; while ( !( UCSRA & (1<<UDRE)) )
 00A2 5D9B              sbis 0xb,5
 00A4 FECF              rjmp L21
 00A6                   .dbline 95
 00A6           ; ;
 00A6           ; UDR = 'l';
 00A6 8CE6              ldi R24,108
 00A8 8CB9              out 0xc,R24
 00AA           L24:
 00AA                   .dbline 97
 00AA           L25:
 00AA                   .dbline 96
 00AA           ; while ( !( UCSRA & (1<<UDRE)) )
 00AA 5D9B              sbis 0xb,5
 00AC FECF              rjmp L24
 00AE                   .dbline 98
 00AE           ; ;
 00AE           ; UDR = 'o';
 00AE 8FE6              ldi R24,111
 00B0 8CB9              out 0xc,R24
 00B2                   .dbline -2
 00B2           L11:
 00B2                   .dbline 0 ; func end
 00B2 0895              ret
 00B4                   .dbend
 00B4                   .dbfunc e main _main fV
 00B4           ;            tmp -> R20
 00B4           ;              i -> R22
                        .even
 00B4           _main::
 00B4                   .dbline -1
 00B4                   .dbline 103
 00B4           ; } 
 00B4           ; 
 00B4           ; 
 00B4           ; void main(void)
 00B4           ; {
 00B4                   .dbline 104
 00B4           ;  unsigned char i=0,tmp=0;
 00B4 6627              clr R22
 00B6                   .dbline 104
 00B6 4427              clr R20
 00B8                   .dbline 106
 00B8           ;  
 00B8           ;  USART_Init(9600); //波特率9600 初始化串口
 00B8 00E8              ldi R16,9600
 00BA 15E2              ldi R17,37
 00BC A1DF              xcall _USART_Init
 00BE                   .dbline 109
 00BE           ; // uart0_init();
 00BE           ;  
 00BE           ;  for(i=0;i<20;i++) //发送数组里面的字符串
 00BE 09C0              xjmp L31
 00C0           L28:
 00C0                   .dbline 110
 00C0                   .dbline 111
 00C0 80E0              ldi R24,<_buffer
 00C2 90E0              ldi R25,>_buffer
 00C4 E62F              mov R30,R22
 00C6 FF27              clr R31
 00C8 E80F              add R30,R24
 00CA F91F              adc R31,R25
 00CC 0491              lpm R16,Z
 00CE D5DF              xcall _USART_Transmit
 00D0                   .dbline 112
 00D0           L29:
 00D0                   .dbline 109
 00D0 6395              inc R22
 00D2           L31:
 00D2                   .dbline 109
 00D2 6431              cpi R22,20
 00D4 A8F3              brlo L28
 00D6                   .dbline 114
 00D6           ;  {
 00D6           ;  USART_Transmit(buffer[i]);
 00D6           ;  }
 00D6           ;  
 00D6           ;  USART_Transmit(0x0d); //发送一个回车
 00D6 0DE0              ldi R16,13
 00D8 D0DF              xcall _USART_Transmit
 00DA                   .dbline 115
 00DA           ;  USART_Transmit(0x0a); //发送一个换行
 00DA 0AE0              ldi R16,10
 00DC CEDF              xcall _USART_Transmit
 00DE 0EC0              xjmp L33
 00E0           L32:
 00E0                   .dbline 118
 00E0           ;  
 00E0           ;  while(1)
 00E0           ;  {
 00E0                   .dbline 119
 00E0           ;   if(UCSRA&(1<<RXC))  //如果接收缓存区有数据
 00E0 5F9B              sbis 0xb,7
 00E2 0CC0              rjmp L35
 00E4                   .dbline 120
 00E4           ;   {
 00E4                   .dbline 121
 00E4           ;    tmp=USART_Receive(); //接收数据
 00E4 CEDF              xcall _USART_Receive
 00E6 402F              mov R20,R16
 00E8                   .dbline 122
 00E8           ;    USART_Transmit(tmp); //发送数据
 00E8 C8DF              xcall _USART_Transmit
 00EA                   .dbline 124
 00EA           ;    
 00EA           ;    if(tmp=='a')         //对接收到的数据进行,如果是a,再发一个OK回来
 00EA 4136              cpi R20,97
 00EC 21F4              brne L37
 00EE                   .dbline 125
 00EE           ;    {
 00EE                   .dbline 126
 00EE           ;     USART_Transmit('O');
 00EE 0FE4              ldi R16,79
 00F0 C4DF              xcall _USART_Transmit
 00F2                   .dbline 127
 00F2           ;       USART_Transmit('K');
 00F2 0BE4              ldi R16,75
 00F4 C2DF              xcall _USART_Transmit
 00F6                   .dbline 128
 00F6           ;    }
 00F6           L37:
 00F6                   .dbline 129
 00F6           ;    if(tmp=='A')
 00F6 4134              cpi R20,65
 00F8 09F4              brne L39
 00FA                   .dbline 130
 00FA           ;    {
 00FA                   .dbline 131
 00FA           ;     USART_Transmit_2();
 00FA C7DF              xcall _USART_Transmit_2
 00FC                   .dbline 132
 00FC           ;    }
 00FC           L39:
 00FC                   .dbline 133
 00FC           ;   }
 00FC           L35:
 00FC                   .dbline 134
 00FC           L33:
 00FC                   .dbline 117
 00FC F1CF              xjmp L32
 00FE           X0:
 00FE                   .dbline -2
 00FE           L27:
 00FE                   .dbline 0 ; func end
 00FE 0895              ret
 0100                   .dbsym r tmp 20 c
 0100                   .dbsym r i 22 c
 0100                   .dbend

⌨️ 快捷键说明

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