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

📄 test.lis

📁 uart软件仿真实现
💻 LIS
字号:
                        .module TEST.C
                        .area text(rom, con, rel)
 0000                   .dbfile D:\iccavr\mega16\11\UART\TEST.C
 0000                   .dbfile D:\iccavr\mega16\11\UART\uart.h
 0000                   .dbfunc e uart_init _uart_init fV
                        .even
 0000           _uart_init::
 0000                   .dbline -1
 0000                   .dbline 9
 0000           ; /**********串口端口定义**********/
 0000           ; #define RxD  PD0
 0000           ; #define TxD  PD1
 0000           ; 
 0000           ; #define baudrate  9600        //波特率
 0000           ; #define F_CPU     8000000UL     //定义晶振频率
 0000           ; 
 0000           ; void uart_init(void)
 0000           ; {
 0000                   .dbline 11
 0000           ;   /*****RS232口线设置*****/
 0000           ;   PORTD|=BIT(RxD)|BIT(TxD);
 0000 82B3              in R24,0x12
 0002 8360              ori R24,3
 0004 82BB              out 0x12,R24
 0006                   .dbline 12
 0006           ;   DDRD&=~BIT(RxD);
 0006 8898              cbi 0x11,0
 0008                   .dbline 13
 0008           ;   DDRD|=BIT(TxD);
 0008 899A              sbi 0x11,1
 000A                   .dbline 16
 000A           ;   
 000A           ;   /* 设置波特率*/
 000A           ;   UBRRL=(F_CPU/baudrate/16-1)%256; //本设置波特率不加倍及U2X=0
 000A 83E3              ldi R24,51
 000C 89B9              out 0x9,R24
 000E                   .dbline 17
 000E           ;   UBRRH=(F_CPU/baudrate/16-1)/256;
 000E 2224              clr R2
 0010 20BC              out 0x20,R2
 0012                   .dbline 24
 0012           ;   /*U2X=1的设置波特率*/
 0012           ;   //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
 0012           ;   //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
 0012           ; 
 0012           ;   /* 接收器与发送器使能*/
 0012           ;   //UCSRB=(1<<RXEN)|(1<<TXEN);
 0012           ;   UCSRB|=BIT(4)|BIT(3);
 0012 8AB1              in R24,0xa
 0014 8861              ori R24,24
 0016 8AB9              out 0xa,R24
 0018                   .dbline 29
 0018           ;   
 0018           ;   /*设置传输格式*/
 0018           ;   //异步,8位数据,无奇偶校验,一个停止位,无倍速
 0018           ;   //UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
 0018           ;   UCSRC|=BIT(7)|BIT(2)|BIT(1);  
 0018 80B5              in R24,0x20
 001A 8668              ori R24,134
 001C 80BD              out 0x20,R24
 001E                   .dbline -2
 001E           L1:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbend
 0020                   .dbfunc e putc _putc fV
 0020           ;              c -> R16
                        .even
 0020           _putc::
 0020                   .dbline -1
 0020                   .dbline 34
 0020           ; }
 0020           ; 
 0020           ; //串口数据发送,查询方式
 0020           ; void putc(unsigned char c)
 0020           ; {
 0020           L3:
 0020                   .dbline 36
 0020           ;    /* 等待发送缓冲器为空 */
 0020           ;    while (!(UCSRA&(1<<UDRE)));
 0020           L4:
 0020                   .dbline 36
 0020 5D9B              sbis 0xb,5
 0022 FECF              rjmp L3
 0024           X0:
 0024                   .dbline 38
 0024           ;   /* 将数据放入缓冲器,发送数据 */
 0024           ;    UDR = c;
 0024 0CB9              out 0xc,R16
 0026                   .dbline -2
 0026           L2:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbsym r c 16 c
 0028                   .dbend
 0028                   .dbfunc e puts _puts fV
 0028           ;              s -> R20,R21
                        .even
 0028           _puts::
 0028 4A93              st -y,R20
 002A 5A93              st -y,R21
 002C A801              movw R20,R16
 002E                   .dbline -1
 002E                   .dbline 43
 002E           ; }
 002E           ; 
 002E           ; //串口字符串发送,查询方式
 002E           ; void puts(unsigned char *s)
 002E           ; {
 002E 05C0              xjmp L8
 0030           L7:
 0030                   .dbline 45
 0030           ;   while(*s)
 0030           ;   {
 0030                   .dbline 46
 0030           ;    putc(*s);
 0030 FA01              movw R30,R20
 0032 0081              ldd R16,z+0
 0034 F5DF              xcall _putc
 0036                   .dbline 47
 0036           ;    s++;
 0036 4F5F              subi R20,255  ; offset = 1
 0038 5F4F              sbci R21,255
 003A                   .dbline 48
 003A           ;   }
 003A           L8:
 003A                   .dbline 44
 003A FA01              movw R30,R20
 003C 2080              ldd R2,z+0
 003E 2220              tst R2
 0040 B9F7              brne L7
 0042           X1:
 0042                   .dbline 49
 0042           ;   putc('\n');
 0042 0AE0              ldi R16,10
 0044 EDDF              xcall _putc
 0046                   .dbline -2
 0046           L6:
 0046                   .dbline 0 ; func end
 0046 5991              ld R21,y+
 0048 4991              ld R20,y+
 004A 0895              ret
 004C                   .dbsym r s 20 pc
 004C                   .dbend
 004C                   .dbfunc e getc _getc fc
                        .even
 004C           _getc::
 004C                   .dbline -1
 004C                   .dbline 55
 004C           ;   //return 1;
 004C           ; }
 004C           ; 
 004C           ; //串口数据接收,查询方式
 004C           ; unsigned char getc(void)
 004C           ; {
 004C           L11:
 004C                   .dbline 57
 004C           ;   /* 等待接收数据*/
 004C           ;   while (!(UCSRA&(1<<RXC)));
 004C           L12:
 004C                   .dbline 57
 004C 5F9B              sbis 0xb,7
 004E FECF              rjmp L11
 0050           X2:
 0050                   .dbline 59
 0050           ;   /* 从缓冲器中获取并返回数据*/
 0050           ;   return UDR;
 0050 0CB1              in R16,0xc
 0052                   .dbline -2
 0052           L10:
 0052                   .dbline 0 ; func end
 0052 0895              ret
 0054                   .dbend
 0054                   .dbfunc e get_s _get_s fV
 0054           ;              i -> R20,R21
 0054           ;            num -> R10,R11
 0054           ;             js -> R12,R13
                        .even
 0054           _get_s::
 0054 0E940000          xcall push_xgset303C
 0058 5901              movw R10,R18
 005A 6801              movw R12,R16
 005C                   .dbline -1
 005C                   .dbline 64
 005C           ; }
 005C           ; 
 005C           ; //串口接收数据存储,存储到数组中
 005C           ; void get_s(unsigned char *js,unsigned int num)
 005C           ; {
 005C                   .dbline 66
 005C           ;  unsigned int i; 
 005C           ;    for(i=0;i<num;i++)
 005C 4427              clr R20
 005E 5527              clr R21
 0060 07C0              xjmp L18
 0062           L15:
 0062                   .dbline 67
 0062           ;    {
 0062                   .dbline 68
 0062           ;        js[i]=getc();          //保存数据到数组里面
 0062 F4DF              xcall _getc
 0064 FA01              movw R30,R20
 0066 EC0D              add R30,R12
 0068 FD1D              adc R31,R13
 006A 0083              std z+0,R16
 006C                   .dbline 69
 006C           ;    }
 006C           L16:
 006C                   .dbline 66
 006C 4F5F              subi R20,255  ; offset = 1
 006E 5F4F              sbci R21,255
 0070           L18:
 0070                   .dbline 66
 0070 4A15              cp R20,R10
 0072 5B05              cpc R21,R11
 0074 B0F3              brlo L15
 0076           X3:
 0076                   .dbline -2
 0076           L14:
 0076                   .dbline 0 ; func end
 0076 0C940000          xjmp pop_xgset303C
 007A                   .dbsym r i 20 i
 007A                   .dbsym r num 10 i
 007A                   .dbsym r js 12 pc
 007A                   .dbend
 007A                   .dbfile D:\iccavr\mega16\11\UART\TEST.C
 007A                   .dbfunc e main _main fV
                        .even
 007A           _main::
 007A                   .dbline -1
 007A                   .dbline 11
 007A           ; //ICC-AVR application builder : 2008-11-4 12:34:31
 007A           ; // Target : M16
 007A           ; // Crystal: 8.0000Mhz
 007A           ; 
 007A           ; #include <iom16v.h>
 007A           ; #include <macros.h>
 007A           ; 
 007A           ; #include "uart.h"
 007A           ; 
 007A           ; void main(void)
 007A           ; {
 007A                   .dbline 12
 007A           ;  uart_init();
 007A C2DF              xcall _uart_init
 007C 02C0              xjmp L21
 007E           L20:
 007E                   .dbline 14
 007E           ;  while(1)
 007E           ;  {
 007E                   .dbline 15
 007E           ;   putc(getc());
 007E E6DF              xcall _getc
 0080 CFDF              xcall _putc
 0082                   .dbline 16
 0082           ;  }
 0082           L21:
 0082                   .dbline 13
 0082 FDCF              xjmp L20
 0084           X4:
 0084                   .dbline -2
 0084           L19:
 0084                   .dbline 0 ; func end
 0084 0895              ret
 0086                   .dbend
 0086           ; }

⌨️ 快捷键说明

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