📄 uart.lis
字号:
.module UART.c
.area text(rom, con, rel)
0000 .dbfile UART.c
.area vector(rom, abs)
.org 44
002C 0C944900 jmp _uart_rx
.area text(rom, con, rel)
0000 .dbfile UART.c
.area data(ram, con, rel)
0000 .dbfile UART.c
0000 _flag::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile UART.c
0001 .dbfile E:\AVR自编程序\11实验板\16串口通信\UART.c
0001 .dbsym e flag _flag c
.area text(rom, con, rel)
0000 .dbfile E:\AVR自编程序\11实验板\16串口通信\UART.c
0000 .dbfunc e delay _delay fV
0000 ; i -> R20,R21
0000 ; j -> R22,R23
0000 ; ms -> R16,R17
.even
0000 _delay::
0000 0E940000 xcall push_xgsetF000
0004 .dbline -1
0004 .dbline 10
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ; #define uchar unsigned char
0004 ; #define uint unsigned int
0004 ;
0004 ; #define mclk 8000000
0004 ; #pragma interrupt_handler uart_rx:12
0004 ; uchar rdata,flag=0;
0004 ; void delay(uint ms)
0004 ; {
0004 .dbline 12
0004 ; uint i,j;
0004 ; for(i=0;i<ms;i++)
0004 4427 clr R20
0006 5527 clr R21
0008 0BC0 xjmp L5
000A L2:
000A .dbline 13
000A ; {
000A .dbline 14
000A ; for(j=0;j<1141;j++);
000A 6627 clr R22
000C 7727 clr R23
000E 02C0 xjmp L9
0010 L6:
0010 .dbline 14
0010 L7:
0010 .dbline 14
0010 6F5F subi R22,255 ; offset = 1
0012 7F4F sbci R23,255
0014 L9:
0014 .dbline 14
0014 6537 cpi R22,117
0016 E4E0 ldi R30,4
0018 7E07 cpc R23,R30
001A D0F3 brlo L6
001C X0:
001C .dbline 15
001C ; }
001C L3:
001C .dbline 12
001C 4F5F subi R20,255 ; offset = 1
001E 5F4F sbci R21,255
0020 L5:
0020 .dbline 12
0020 4017 cp R20,R16
0022 5107 cpc R21,R17
0024 90F3 brlo L2
0026 X1:
0026 .dbline -2
0026 L1:
0026 .dbline 0 ; func end
0026 0C940000 xjmp pop_xgsetF000
002A .dbsym r i 20 i
002A .dbsym r j 22 i
002A .dbsym r ms 16 i
002A .dbend
002A .dbfunc e uart_init _uart_init fV
002A ; baud -> R10,R11
.even
002A _uart_init::
002A 0E940000 xcall push_xgsetF00C
002E 5801 movw R10,R16
0030 .dbline -1
0030 .dbline 19
0030 ; }
0030 ;
0030 ; void uart_init(uint baud)
0030 ; {
0030 .dbline 20
0030 ; UCSRB=0x00;
0030 2224 clr R2
0032 2AB8 out 0xa,R2
0034 .dbline 21
0034 ; UCSRA=0x00; //控制寄存器清零
0034 2BB8 out 0xb,R2
0036 .dbline 22
0036 ; UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
0036 86E8 ldi R24,134
0038 80BD out 0x20,R24
003A .dbline 25
003A ; //选择UCSRC,异步模式,禁止
003A ; // 校验,1位停止位,8位数据位
003A ; baud=mclk/16/baud-1 ; //波特率最大为65K
003A 1501 movw R2,R10
003C 4424 clr R4
003E 5524 clr R5
0040 40E2 ldi R20,32
0042 51EA ldi R21,161
0044 67E0 ldi R22,7
0046 70E0 ldi R23,0
0048 5A92 st -y,R5
004A 4A92 st -y,R4
004C 3A92 st -y,R3
004E 2A92 st -y,R2
0050 8A01 movw R16,R20
0052 9B01 movw R18,R22
0054 0E940000 xcall div32s
0058 41E0 ldi R20,1
005A 50E0 ldi R21,0
005C 60E0 ldi R22,0
005E 70E0 ldi R23,0
0060 1801 movw R2,R16
0062 2901 movw R4,R18
0064 241A sub R2,R20
0066 350A sbc R3,R21
0068 460A sbc R4,R22
006A 570A sbc R5,R23
006C 5101 movw R10,R2
006E .dbline 26
006E ; UBRRL=baud;
006E 29B8 out 0x9,R2
0070 .dbline 27
0070 ; UBRRH=baud>>8; //设置波特率
0070 232C mov R2,R3
0072 3324 clr R3
0074 20BC out 0x20,R2
0076 .dbline 28
0076 ; UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
0076 88E9 ldi R24,152
0078 8AB9 out 0xa,R24
007A .dbline 30
007A ; //接收、发送使能,接收中断使能
007A ; SREG=BIT(7); //全局中断开放
007A 80E8 ldi R24,128
007C 8FBF out 0x3f,R24
007E .dbline 31
007E ; DDRD|=0X02; //配置TX为输出(很重要)
007E 899A sbi 0x11,1
0080 .dbline -2
0080 L10:
0080 .dbline 0 ; func end
0080 0C940000 xjmp pop_xgsetF00C
0084 .dbsym r baud 10 i
0084 .dbend
0084 .dbfunc e uart_sendB _uart_sendB fV
0084 ; data -> R16
.even
0084 _uart_sendB::
0084 .dbline -1
0084 .dbline 35
0084 ;
0084 ; }
0084 ; void uart_sendB(uchar data)
0084 ; {
0084 L12:
0084 .dbline 36
0084 ; while(!(UCSRA&(BIT(UDRE)))) ;
0084 L13:
0084 .dbline 36
0084 5D9B sbis 0xb,5
0086 FECF rjmp L12
0088 X2:
0088 .dbline 37
0088 ; UDR=data;
0088 0CB9 out 0xc,R16
008A L15:
008A .dbline 38
008A ; while(!(UCSRA&(BIT(TXC))));
008A L16:
008A .dbline 38
008A 5E9B sbis 0xb,6
008C FECF rjmp L15
008E X3:
008E .dbline 39
008E ; UCSRA|=BIT(TXC);
008E 5E9A sbi 0xb,6
0090 .dbline -2
0090 L11:
0090 .dbline 0 ; func end
0090 0895 ret
0092 .dbsym r data 16 c
0092 .dbend
0092 .dbfunc e uart_rx _uart_rx fV
.even
0092 _uart_rx::
0092 2A92 st -y,R2
0094 8A93 st -y,R24
0096 2FB6 IN R2,63
0098 2A92 st -y,R2
009A .dbline -1
009A .dbline 42
009A ; }
009A ; void uart_rx()
009A ; {
009A .dbline 43
009A ; UCSRB&=~BIT(RXCIE);
009A 5798 cbi 0xa,7
009C .dbline 44
009C ; rdata=UDR;
009C 2CB0 in R2,0xc
009E 20920000 sts _rdata,R2
00A2 .dbline 45
00A2 ; flag=1;
00A2 81E0 ldi R24,1
00A4 80930000 sts _flag,R24
00A8 .dbline 46
00A8 ; UCSRB|=BIT(RXCIE);
00A8 579A sbi 0xa,7
00AA .dbline -2
00AA L18:
00AA .dbline 0 ; func end
00AA 2990 ld R2,y+
00AC 2FBE OUT 63,R2
00AE 8991 ld R24,y+
00B0 2990 ld R2,y+
00B2 1895 reti
00B4 .dbend
00B4 .dbfunc e main _main fV
.even
00B4 _main::
00B4 .dbline -1
00B4 .dbline 49
00B4 ; }
00B4 ; void main()
00B4 ; {
00B4 .dbline 52
00B4 ; //uchar i=4;
00B4 ; //uchar j='a';
00B4 ; uart_init(19200);
00B4 00E0 ldi R16,19200
00B6 1BE4 ldi R17,75
00B8 B8DF xcall _uart_init
00BA 0AC0 xjmp L21
00BC L20:
00BC .dbline 54
00BC ; while(1)
00BC ; {
00BC .dbline 55
00BC ; if(flag)
00BC 20900000 lds R2,_flag
00C0 2220 tst R2
00C2 31F0 breq L23
00C4 X4:
00C4 .dbline 56
00C4 ; {
00C4 .dbline 57
00C4 ; uart_sendB(rdata);
00C4 00910000 lds R16,_rdata
00C8 DDDF xcall _uart_sendB
00CA .dbline 58
00CA ; flag=0;
00CA 2224 clr R2
00CC 20920000 sts _flag,R2
00D0 .dbline 59
00D0 ; }
00D0 L23:
00D0 .dbline 60
00D0 ; }
00D0 L21:
00D0 .dbline 53
00D0 F5CF xjmp L20
00D2 X5:
00D2 .dbline -2
00D2 L19:
00D2 .dbline 0 ; func end
00D2 0895 ret
00D4 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\AVR自编程序\11实验板\16串口通信\UART.c
0000 _rdata::
0000 .blkb 1
0001 .dbsym e rdata _rdata c
0001 ;
0001 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -