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

📄 uart.lis

📁 AVR编写的串口程序
💻 LIS
字号:
                        .module uart.c
                        .area vector(rom, abs)
                        .org 44
 002C 0C947400          jmp _uart_rx
                        .area data(ram, con, rel)
 0000           _rdata::
 0000                   .blkb 1
                        .area idata
 0000 01                .byte 1
                        .area data(ram, con, rel)
 0001                   .dbfile D:\chengxu\lesson10_1\uart.c
 0001                   .dbsym e rdata _rdata c
 0001           _flag::
 0001                   .blkb 1
                        .area idata
 0001 00                .byte 0
                        .area data(ram, con, rel)
 0002                   .dbfile D:\chengxu\lesson10_1\uart.c
 0002                   .dbsym e flag _flag c
                        .area code(ram, con, rel)
 0000                   .dbfile D:\chengxu\lesson10_1\uart.c
                        .area lit(rom, con, rel)
 0000           _table::
 0000 3F00              .word 63
 0002 0600              .word 6
 0004 5B00              .word 91
 0006 4F00              .word 79
 0008 6600              .word 102
 000A 6D00              .word 109
 000C 7D00              .word 125
 000E 0700              .word 7
 0010 7F00              .word 127
 0012 6F00              .word 111
 0014 7700              .word 119
 0016 7C00              .word 124
 0018 3900              .word 57
 001A 5E00              .word 94
 001C 7900              .word 121
 001E 7100              .word 113
 0020                   .dbsym e table _table A[32:16]I
                        .area text(rom, con, rel)
 0000                   .dbfile D:\chengxu\lesson10_1\uart.c
 0000                   .dbfunc e show _show fV
 0000           ;              y -> R20
 0000           ;              x -> R22
                        .even
 0000           _show::
 0000 0E940000          xcall push_gset2
 0004 422F              mov R20,R18
 0006 602F              mov R22,R16
 0008                   .dbline -1
 0008                   .dbline 13
 0008           ; #include <iom16v.h>
 0008           ; #include <macros.h>
 0008           ; #define  uchar unsigned char
 0008           ; #define  uint  unsigned int
 0008           ; 
 0008           ; #define  mclk   8000000
 0008           ; #pragma interrupt_handler uart_rx:12
 0008           ; uchar rdata=1,flag=0;
 0008           ; #pragma data:code
 0008           ;    const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
 0008           ;                   0x39,0x5e,0x79,0x71};
 0008           ; void show(uchar x,uchar y)
 0008           ;    {DDRA|=0x18;
 0008                   .dbline 13
 0008 8AB3              in R24,0x1a
 000A 8861              ori R24,24
 000C 8ABB              out 0x1a,R24
 000E                   .dbline 14
 000E           ;     DDRB=0xff;
 000E 8FEF              ldi R24,255
 0010 87BB              out 0x17,R24
 0012                   .dbline 15
 0012           ;     PORTB=table[x];
 0012 82E0              ldi R24,2
 0014 869F              mul R24,R22
 0016 F001              movw R30,R0
 0018 80E0              ldi R24,<_table
 001A 90E0              ldi R25,>_table
 001C E80F              add R30,R24
 001E F91F              adc R31,R25
 0020 0590              lpm R0,Z+
 0022 1490              lpm R1,Z
 0024 F001              movw R30,R0
 0026 E8BB              out 0x18,R30
 0028                   .dbline 16
 0028           ;       PORTA|=BIT(3);
 0028 DB9A              sbi 0x1b,3
 002A                   .dbline 17
 002A           ;       PORTA&=~BIT(3);
 002A DB98              cbi 0x1b,3
 002C                   .dbline 18
 002C           ;       PORTB=0XFF;
 002C 8FEF              ldi R24,255
 002E 88BB              out 0x18,R24
 0030                   .dbline 19
 0030           ;       PORTB&=~BIT(y);
 0030 01E0              ldi R16,1
 0032 142F              mov R17,R20
 0034 0E940000          xcall lsl8
 0038 202E              mov R2,R16
 003A 2094              com R2
 003C 38B2              in R3,0x18
 003E 3220              and R3,R2
 0040 38BA              out 0x18,R3
 0042                   .dbline 20
 0042           ;       PORTA|=BIT(4);
 0042 DC9A              sbi 0x1b,4
 0044                   .dbline 21
 0044           ;       PORTA&=~BIT(4);
 0044 DC98              cbi 0x1b,4
 0046                   .dbline 22
 0046           ;       delay(1);}
 0046 01E0              ldi R16,1
 0048 10E0              ldi R17,0
 004A 03D0              xcall _delay
 004C                   .dbline -2
 004C                   .dbline 22
 004C           L1:
 004C 0E940000          xcall pop_gset2
 0050                   .dbline 0 ; func end
 0050 0895              ret
 0052                   .dbsym r y 20 c
 0052                   .dbsym r x 22 c
 0052                   .dbend
 0052                   .dbfunc e delay _delay fV
 0052           ;              i -> R20,R21
 0052           ;              j -> R22,R23
 0052           ;             ms -> R16,R17
                        .even
 0052           _delay::
 0052 0E940000          xcall push_gset2
 0056                   .dbline -1
 0056                   .dbline 24
 0056           ; void delay(uint ms)
 0056           ; {
 0056                   .dbline 26
 0056           ;         uint i,j;
 0056           ;       for(i=0;i<ms;i++)
 0056 4427              clr R20
 0058 5527              clr R21
 005A 0BC0              xjmp L6
 005C           L3:
 005C                   .dbline 27
 005C           ;          {
 005C                   .dbline 28
 005C 6627              clr R22
 005E 7727              clr R23
 0060 02C0              xjmp L10
 0062           L7:
 0062                   .dbline 28
 0062           L8:
 0062                   .dbline 28
 0062 6F5F              subi R22,255  ; offset = 1
 0064 7F4F              sbci R23,255
 0066           L10:
 0066                   .dbline 28
 0066 6537              cpi R22,117
 0068 E4E0              ldi R30,4
 006A 7E07              cpc R23,R30
 006C D0F3              brlo L7
 006E                   .dbline 29
 006E           L4:
 006E                   .dbline 26
 006E 4F5F              subi R20,255  ; offset = 1
 0070 5F4F              sbci R21,255
 0072           L6:
 0072                   .dbline 26
 0072 4017              cp R20,R16
 0074 5107              cpc R21,R17
 0076 90F3              brlo L3
 0078                   .dbline -2
 0078                   .dbline 30
 0078           ;          for(j=0;j<1141;j++);
 0078           ;        }
 0078           ; }
 0078           L2:
 0078 0E940000          xcall pop_gset2
 007C                   .dbline 0 ; func end
 007C 0895              ret
 007E                   .dbsym r i 20 i
 007E                   .dbsym r j 22 i
 007E                   .dbsym r ms 16 i
 007E                   .dbend
 007E                   .dbfunc e uart_init _uart_init fV
 007E           ;           baud -> R10,R11
                        .even
 007E           _uart_init::
 007E 0E940000          xcall push_gset3
 0082 5801              movw R10,R16
 0084                   .dbline -1
 0084                   .dbline 33
 0084           ; 
 0084           ; void uart_init(uint baud)
 0084           ; {
 0084                   .dbline 34
 0084           ;     UCSRB=0x00; 
 0084 2224              clr R2
 0086 2AB8              out 0xa,R2
 0088                   .dbline 35
 0088           ;    UCSRA=0x00;                    //控制寄存器清零
 0088 2BB8              out 0xb,R2
 008A                   .dbline 36
 008A           ;    UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);   
 008A 86E8              ldi R24,134
 008C 80BD              out 0x20,R24
 008E                   .dbline 39
 008E           ;                                                         //选择UCSRC,异步模式,禁止                        
 008E           ;                                                      //   校验,1位停止位,8位数据位
 008E           ;    baud=mclk/16/baud-1        ;   //波特率最大为65K
 008E 1501              movw R2,R10
 0090 4424              clr R4
 0092 5524              clr R5
 0094 40E2              ldi R20,32
 0096 51EA              ldi R21,161
 0098 67E0              ldi R22,7
 009A 70E0              ldi R23,0
 009C 5A92              st -y,R5
 009E 4A92              st -y,R4
 00A0 3A92              st -y,R3
 00A2 2A92              st -y,R2
 00A4 8A01              movw R16,R20
 00A6 9B01              movw R18,R22
 00A8 0E940000          xcall div32s
 00AC 41E0              ldi R20,1
 00AE 50E0              ldi R21,0
 00B0 60E0              ldi R22,0
 00B2 70E0              ldi R23,0
 00B4 1801              movw R2,R16
 00B6 2901              movw R4,R18
 00B8 241A              sub R2,R20
 00BA 350A              sbc R3,R21
 00BC 460A              sbc R4,R22
 00BE 570A              sbc R5,R23
 00C0 5101              movw R10,R2
 00C2                   .dbline 40
 00C2           ;    UBRRL=baud;                                                  
 00C2 A9B8              out 0x9,R10
 00C4                   .dbline 41
 00C4           ;    UBRRH=baud>>8;                //设置波特率
 00C4 232C              mov R2,R3
 00C6 3324              clr R3
 00C8 20BC              out 0x20,R2
 00CA                   .dbline 42
 00CA           ;    UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); 
 00CA 88E9              ldi R24,152
 00CC 8AB9              out 0xa,R24
 00CE                   .dbline 44
 00CE           ;                                                        //接收、发送使能,接收中断使能
 00CE           ;    SREG=BIT(7);                       //全局中断开放
 00CE 80E8              ldi R24,128
 00D0 8FBF              out 0x3f,R24
 00D2                   .dbline 45
 00D2           ;    DDRD|=0X02;                        //配置TX为输出(很重要)
 00D2 899A              sbi 0x11,1
 00D4                   .dbline -2
 00D4                   .dbline 47
 00D4           ; 
 00D4           ; }
 00D4           L11:
 00D4 0E940000          xcall pop_gset3
 00D8                   .dbline 0 ; func end
 00D8 0895              ret
 00DA                   .dbsym r baud 10 i
 00DA                   .dbend
 00DA                   .dbfunc e uart_sendB _uart_sendB fV
 00DA           ;           data -> R16
                        .even
 00DA           _uart_sendB::
 00DA                   .dbline -1
 00DA                   .dbline 49
 00DA           ; void uart_sendB(uchar data)
 00DA           ; {
 00DA           L13:
 00DA                   .dbline 50
 00DA           L14:
 00DA                   .dbline 50
 00DA           ;    while(!(UCSRA&(BIT(UDRE)))) ;
 00DA 5D9B              sbis 0xb,5
 00DC FECF              rjmp L13
 00DE                   .dbline 51
 00DE           ;    UDR=data;
 00DE 0CB9              out 0xc,R16
 00E0           L16:
 00E0                   .dbline 52
 00E0           L17:
 00E0                   .dbline 52
 00E0           ;    while(!(UCSRA&(BIT(TXC))));
 00E0 5E9B              sbis 0xb,6
 00E2 FECF              rjmp L16
 00E4                   .dbline 53
 00E4           ;    UCSRA|=BIT(TXC);
 00E4 5E9A              sbi 0xb,6
 00E6                   .dbline -2
 00E6                   .dbline 54
 00E6           ; }
 00E6           L12:
 00E6                   .dbline 0 ; func end
 00E6 0895              ret
 00E8                   .dbsym r data 16 c
 00E8                   .dbend
 00E8                   .dbfunc e uart_rx _uart_rx fV
                        .even
 00E8           _uart_rx::
 00E8 2A92              st -y,R2
 00EA 8A93              st -y,R24
 00EC 2FB6              in R2,0x3f
 00EE 2A92              st -y,R2
 00F0                   .dbline -1
 00F0                   .dbline 56
 00F0           ; void uart_rx()
 00F0           ; {
 00F0                   .dbline 57
 00F0           ;     UCSRB&=~BIT(RXCIE);
 00F0 5798              cbi 0xa,7
 00F2                   .dbline 58
 00F2           ;       rdata=UDR;
 00F2 2CB0              in R2,0xc
 00F4 20920000          sts _rdata,R2
 00F8                   .dbline 59
 00F8           ;       flag=1;
 00F8 81E0              ldi R24,1
 00FA 80930100          sts _flag,R24
 00FE                   .dbline 60
 00FE           ;       UCSRB|=BIT(RXCIE);
 00FE 579A              sbi 0xa,7
 0100                   .dbline -2
 0100                   .dbline 61
 0100           ; }
 0100           L19:
 0100 2990              ld R2,y+
 0102 2FBE              out 0x3f,R2
 0104 8991              ld R24,y+
 0106 2990              ld R2,y+
 0108                   .dbline 0 ; func end
 0108 1895              reti
 010A                   .dbend
 010A                   .dbfunc e main _main fV
                        .even
 010A           _main::
 010A                   .dbline -1
 010A                   .dbline 63
 010A           ; void main()
 010A           ; {
 010A                   .dbline 66
 010A           ;     //uchar i=4;
 010A           ;       //uchar j='a';
 010A           ;     uart_init(19200);
 010A 00E0              ldi R16,19200
 010C 1BE4              ldi R17,75
 010E B7DF              xcall _uart_init
 0110 0EC0              xjmp L22
 0112           L21:
 0112                   .dbline 68
 0112           ;       while(1)
 0112           ;       {show(rdata,0);
 0112                   .dbline 68
 0112 2227              clr R18
 0114 00910000          lds R16,_rdata
 0118 73DF              xcall _show
 011A                   .dbline 69
 011A           ;          if(flag)
 011A 20900100          lds R2,_flag
 011E 2220              tst R2
 0120 31F0              breq L24
 0122                   .dbline 70
 0122           ;          {
 0122                   .dbline 71
 0122           ;             uart_sendB(rdata);
 0122 00910000          lds R16,_rdata
 0126 D9DF              xcall _uart_sendB
 0128                   .dbline 72
 0128           ;                 flag=0;
 0128 2224              clr R2
 012A 20920100          sts _flag,R2
 012E                   .dbline 73
 012E           ;          }
 012E           L24:
 012E                   .dbline 74
 012E           L22:
 012E                   .dbline 67
 012E F1CF              xjmp L21
 0130           X0:
 0130                   .dbline -2
 0130                   .dbline 76
 0130           ;       }
 0130           ;       
 0130           ; }
 0130           L20:
 0130                   .dbline 0 ; func end
 0130 0895              ret
 0132                   .dbend

⌨️ 快捷键说明

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