📄 uart.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 + -