📄 lesson10.lis
字号:
.module lesson10.c
.area vector(rom, abs)
.org 44
002C 0C944B00 jmp _uart_rx
.area data(ram, con, rel)
0000 _flag::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile I:\AVR视频教程\视频教程\lesson10\lesson10\lesson10.c
0001 .dbsym e flag _flag c
.area text(rom, con, rel)
0000 .dbfile I:\AVR视频教程\视频教程\lesson10\lesson10\lesson10.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_gset2
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 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 .dbline 15
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 .dbline -2
0026 .dbline 16
0026 ; for(j=0;j<1141;j++);
0026 ; }
0026 ; }
0026 L1:
0026 0E940000 xcall pop_gset2
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r i 20 i
002C .dbsym r j 22 i
002C .dbsym r ms 16 i
002C .dbend
002C .dbfunc e uart_init _uart_init fV
002C ; baud -> R10,R11
.even
002C _uart_init::
002C 0E940000 xcall push_gset3
0030 5801 movw R10,R16
0032 .dbline -1
0032 .dbline 19
0032 ;
0032 ; void uart_init(uint baud)
0032 ; {
0032 .dbline 20
0032 ; UCSRB=0x00;
0032 2224 clr R2
0034 2AB8 out 0xa,R2
0036 .dbline 21
0036 ; UCSRA=0x00; //控制寄存器清零
0036 2BB8 out 0xb,R2
0038 .dbline 22
0038 ; UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
0038 86E8 ldi R24,134
003A 80BD out 0x20,R24
003C .dbline 25
003C ; //选择UCSRC,异步模式,禁止
003C ; // 校验,1位停止位,8位数据位
003C ; baud=mclk/16/baud-1 ; //波特率最大为65K
003C 1501 movw R2,R10
003E 4424 clr R4
0040 5524 clr R5
0042 40E2 ldi R20,32
0044 51EA ldi R21,161
0046 67E0 ldi R22,7
0048 70E0 ldi R23,0
004A 5A92 st -y,R5
004C 4A92 st -y,R4
004E 3A92 st -y,R3
0050 2A92 st -y,R2
0052 8A01 movw R16,R20
0054 9B01 movw R18,R22
0056 0E940000 xcall div32s
005A 41E0 ldi R20,1
005C 50E0 ldi R21,0
005E 60E0 ldi R22,0
0060 70E0 ldi R23,0
0062 1801 movw R2,R16
0064 2901 movw R4,R18
0066 241A sub R2,R20
0068 350A sbc R3,R21
006A 460A sbc R4,R22
006C 570A sbc R5,R23
006E 5101 movw R10,R2
0070 .dbline 26
0070 ; UBRRL=baud;
0070 A9B8 out 0x9,R10
0072 .dbline 27
0072 ; UBRRH=baud>>8; //设置波特率
0072 232C mov R2,R3
0074 3324 clr R3
0076 20BC out 0x20,R2
0078 .dbline 28
0078 ; UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
0078 88E9 ldi R24,152
007A 8AB9 out 0xa,R24
007C .dbline 30
007C ; //接收、发送使能,接收中断使能
007C ; SREG=BIT(7); //全局中断开放
007C 80E8 ldi R24,128
007E 8FBF out 0x3f,R24
0080 .dbline 31
0080 ; DDRD|=0X02; //配置TX为输出(很重要)
0080 899A sbi 0x11,1
0082 .dbline -2
0082 .dbline 33
0082 ;
0082 ; }
0082 L10:
0082 0E940000 xcall pop_gset3
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r baud 10 i
0088 .dbend
0088 .dbfunc e uart_sendB _uart_sendB fV
0088 ; data -> R16
.even
0088 _uart_sendB::
0088 .dbline -1
0088 .dbline 35
0088 ; void uart_sendB(uchar data)
0088 ; {
0088 L12:
0088 .dbline 36
0088 L13:
0088 .dbline 36
0088 ; while(!(UCSRA&(BIT(UDRE)))) ;
0088 5D9B sbis 0xb,5
008A FECF rjmp L12
008C .dbline 37
008C ; UDR=data;
008C 0CB9 out 0xc,R16
008E L15:
008E .dbline 38
008E L16:
008E .dbline 38
008E ; while(!(UCSRA&(BIT(TXC))));
008E 5E9B sbis 0xb,6
0090 FECF rjmp L15
0092 .dbline 39
0092 ; UCSRA|=BIT(TXC);
0092 5E9A sbi 0xb,6
0094 .dbline -2
0094 .dbline 40
0094 ; }
0094 L11:
0094 .dbline 0 ; func end
0094 0895 ret
0096 .dbsym r data 16 c
0096 .dbend
0096 .dbfunc e uart_rx _uart_rx fV
.even
0096 _uart_rx::
0096 2A92 st -y,R2
0098 8A93 st -y,R24
009A 2FB6 in R2,0x3f
009C 2A92 st -y,R2
009E .dbline -1
009E .dbline 42
009E ; void uart_rx()
009E ; {
009E .dbline 43
009E ; UCSRB&=~BIT(RXCIE);
009E 5798 cbi 0xa,7
00A0 .dbline 44
00A0 ; rdata=UDR;
00A0 2CB0 in R2,0xc
00A2 20920000 sts _rdata,R2
00A6 .dbline 45
00A6 ; flag=1;
00A6 81E0 ldi R24,1
00A8 80930000 sts _flag,R24
00AC .dbline 46
00AC ; UCSRB|=BIT(RXCIE);
00AC 579A sbi 0xa,7
00AE .dbline -2
00AE .dbline 47
00AE ; }
00AE L18:
00AE 2990 ld R2,y+
00B0 2FBE out 0x3f,R2
00B2 8991 ld R24,y+
00B4 2990 ld R2,y+
00B6 .dbline 0 ; func end
00B6 1895 reti
00B8 .dbend
00B8 .dbfunc e main _main fV
.even
00B8 _main::
00B8 .dbline -1
00B8 .dbline 49
00B8 ; void main()
00B8 ; {
00B8 .dbline 52
00B8 ; //uchar i=4;
00B8 ; //uchar j='a';
00B8 ; uart_init(19200);
00B8 00E0 ldi R16,19200
00BA 1BE4 ldi R17,75
00BC B7DF xcall _uart_init
00BE 0AC0 xjmp L21
00C0 L20:
00C0 .dbline 54
00C0 ; while(1)
00C0 ; {
00C0 .dbline 55
00C0 ; if(flag)
00C0 20900000 lds R2,_flag
00C4 2220 tst R2
00C6 31F0 breq L23
00C8 .dbline 56
00C8 ; {
00C8 .dbline 57
00C8 ; uart_sendB(rdata);
00C8 00910000 lds R16,_rdata
00CC DDDF xcall _uart_sendB
00CE .dbline 58
00CE ; flag=0;
00CE 2224 clr R2
00D0 20920000 sts _flag,R2
00D4 .dbline 59
00D4 ; }
00D4 L23:
00D4 .dbline 60
00D4 L21:
00D4 .dbline 53
00D4 F5CF xjmp L20
00D6 X0:
00D6 .dbline -2
00D6 .dbline 62
00D6 ; }
00D6 ;
00D6 ; }
00D6 L19:
00D6 .dbline 0 ; func end
00D6 0895 ret
00D8 .dbend
.area bss(ram, con, rel)
0000 .dbfile I:\AVR视频教程\视频教程\lesson10\lesson10\lesson10.c
0000 _rdata::
0000 .blkb 1
0001 .dbsym e rdata _rdata c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -