📄 usart使用.lis
字号:
.module USART使用.c
.area data(ram, con, rel)
0000 _f::
0000 .blkb 2
.area idata
0000 0102 .byte 1,2
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 0304 .byte 3,4
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 0500 .byte 5,0
.area data(ram, con, rel)
0006 .dbfile C:\DOCUME~1\Administrator\桌面\maga8练习\USART\USART使用.c
0006 .dbsym e f _f A[6:6]c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\maga8练习\USART\USART使用.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 10
0000 ; //ICC-AVR application builder : 1980-1-4 4:49:58
0000 ; // Target : M8
0000 ; // Crystal: 1.0000Mhz
0000 ;
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; unsigned char f[6]={0x01,0x02,0x03,0x04,0x05,0x00};
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 11
0000 ; PORTB = 0xFF;
0000 8FEF ldi R24,255
0002 88BB out 0x18,R24
0004 .dbline 12
0004 ; DDRB = 0x00;
0004 2224 clr R2
0006 27BA out 0x17,R2
0008 .dbline 13
0008 ; PORTC = 0x7F; //m103 output only
0008 8FE7 ldi R24,127
000A 85BB out 0x15,R24
000C .dbline 14
000C ; DDRC = 0x00;
000C 24BA out 0x14,R2
000E .dbline 15
000E ; PORTD = 0xFF;
000E 8FEF ldi R24,255
0010 82BB out 0x12,R24
0012 .dbline 16
0012 ; DDRD = 0x02;
0012 82E0 ldi R24,2
0014 81BB out 0x11,R24
0016 .dbline -2
0016 .dbline 17
0016 ; }
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
0018 .dbfunc e uart0_init _uart0_init fV
.even
0018 _uart0_init::
0018 .dbline -1
0018 .dbline 25
0018 ;
0018 ; //UART0 initialisation
0018 ; // desired baud rate: 9600
0018 ; // actual: baud rate:9615 (0.2%)
0018 ; // char size: 8 bit
0018 ; // parity: Disabled
0018 ; void uart0_init(void)
0018 ; {
0018 .dbline 26
0018 ; UCSRB = 0x00; //disable while setting baud rate
0018 2224 clr R2
001A 2AB8 out 0xa,R2
001C .dbline 27
001C ; UCSRA = 0x02;//倍速
001C 82E0 ldi R24,2
001E 8BB9 out 0xb,R24
0020 .dbline 28
0020 ; UCSRC = 0x86;//写UCSRAC,XCK下降沿采样,异步
0020 86E8 ldi R24,134
0022 80BD out 0x20,R24
0024 .dbline 29
0024 ; UBRRL = 0x0C; //set baud rate lo
0024 8CE0 ldi R24,12
0026 89B9 out 0x9,R24
0028 .dbline 30
0028 ; UBRRH = 0x00; //set baud rate hi
0028 20BC out 0x20,R2
002A .dbline 31
002A ; UCSRB = 0x98;//接收结束中断使能
002A 88E9 ldi R24,152
002C 8AB9 out 0xa,R24
002E .dbline -2
002E .dbline 32
002E ; }
002E L2:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbend
0030 .dbfunc e put_char _put_char fV
0030 ; d -> R16
.even
0030 _put_char::
0030 .dbline -1
0030 .dbline 41
0030 ; /*字符输入函数*/
0030 ; /*unsigned char getchar(void)
0030 ; {
0030 ; while(!(UCSRA& (1<<RXC)));
0030 ; return UDR;
0030 ; }
0030 ; *///UART0 发送一个字节
0030 ; void put_char(unsigned char d)
0030 ; {/* 等待发送缓冲器为空 */
0030 L4:
0030 .dbline 42
0030 L5:
0030 .dbline 42
0030 ; while ( !( UCSRA & (1<<UDRE)));
0030 5D9B sbis 0xb,5
0032 FECF rjmp L4
0034 .dbline 44
0034 ; /* 将数据放入缓冲器,发送数据 */
0034 ; UDR=d;
0034 0CB9 out 0xc,R16
0036 .dbline -2
0036 .dbline 47
0036 ; //while(!(UCSRA&0x40)); //等待TXC置位
0036 ; //UCSRA|=0x40; //写1清零
0036 ; }
0036 L3:
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbsym r d 16 c
0038 .dbend
0038 .dbfunc e put_s _put_s fV
0038 ; s -> R20,R21
.even
0038 _put_s::
0038 00D0 rcall push_gset1
003A A801 movw R20,R16
003C .dbline -1
003C .dbline 50
003C ; //字符输入函数
003C ; void put_s(unsigned char *s)
003C ; {
003C 05C0 rjmp L9
003E L8:
003E .dbline 52
003E .dbline 53
003E FA01 movw R30,R20
0040 0081 ldd R16,z+0
0042 F6DF rcall _put_char
0044 .dbline 54
0044 4F5F subi R20,255 ; offset = 1
0046 5F4F sbci R21,255
0048 .dbline 55
0048 L9:
0048 .dbline 51
0048 ; while (*s)
0048 FA01 movw R30,R20
004A 2080 ldd R2,z+0
004C 2220 tst R2
004E B9F7 brne L8
0050 .dbline -2
0050 .dbline 56
0050 ; {
0050 ; put_char(*s);
0050 ; s++;
0050 ; }
0050 ; }
0050 L7:
0050 00D0 rcall pop_gset1
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r s 20 pc
0054 .dbend
.area vector(rom, abs)
.org 22
0016 2AC0 rjmp _uart0_rx_isr
.area text(rom, con, rel)
0054 .dbfile C:\DOCUME~1\Administrator\桌面\maga8练习\USART\USART使用.c
0054 .dbfunc e uart0_rx_isr _uart0_rx_isr fV
.even
0054 _uart0_rx_isr::
0054 00D0 rcall push_lset
0056 .dbline -1
0056 .dbline 60
0056 ;
0056 ; #pragma interrupt_handler uart0_rx_isr:12
0056 ; void uart0_rx_isr(void)//接收中断RXC置1时中断
0056 ; {
0056 .dbline 61
0056 ; put_char(UDR);//接收完发送短信
0056 0CB1 in R16,0xc
0058 EBDF rcall _put_char
005A .dbline -2
005A .dbline 64
005A ;
005A ; //uart has received a character in UDR
005A ; }
005A L11:
005A 00D0 rcall pop_lset
005C .dbline 0 ; func end
005C 1895 reti
005E .dbend
005E .dbfunc e init_devices _init_devices fV
.even
005E _init_devices::
005E .dbline -1
005E .dbline 68
005E ;
005E ; //call this routine to initialise all peripherals
005E ; void init_devices(void)
005E ; {
005E .dbline 70
005E ; //stop errant interrupts until set up
005E ; CLI(); //disable all interrupts
005E F894 cli
0060 .dbline 71
0060 ; port_init();
0060 CFDF rcall _port_init
0062 .dbline 72
0062 ; uart0_init();
0062 DADF rcall _uart0_init
0064 .dbline 74
0064 ;
0064 ; MCUCR = 0x00;
0064 2224 clr R2
0066 25BE out 0x35,R2
0068 .dbline 75
0068 ; GICR = 0x00;
0068 2BBE out 0x3b,R2
006A .dbline 76
006A ; TIMSK = 0x00; //timer interrupt sources
006A 29BE out 0x39,R2
006C .dbline 77
006C ; SEI(); //re-enable interrupts
006C 7894 sei
006E .dbline -2
006E .dbline 79
006E ; //all peripherals are now initialised
006E ; }
006E L12:
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbend
0070 .dbfunc e delay_us _delay_us fV
0070 ; time -> R16,R17
.even
0070 _delay_us::
0070 .dbline -1
0070 .dbline 81
0070 ; void delay_us(int time)
0070 ; {
0070 L14:
0070 .dbline 83
0070 ; do
0070 ; {
0070 .dbline 84
0070 ; time--;
0070 0150 subi R16,1
0072 1040 sbci R17,0
0074 .dbline 85
0074 ; }
0074 L15:
0074 .dbline 86
0074 ; while (time>1);
0074 81E0 ldi R24,1
0076 90E0 ldi R25,0
0078 8017 cp R24,R16
007A 9107 cpc R25,R17
007C CCF3 brlt L14
007E .dbline -2
007E .dbline 87
007E ; }
007E L13:
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbsym r time 16 I
0080 .dbend
0080 .dbfunc e delay_ms _delay_ms fV
0080 ; time -> R20,R21
.even
0080 _delay_ms::
0080 00D0 rcall push_gset1
0082 A801 movw R20,R16
0084 .dbline -1
0084 .dbline 89
0084 ; void delay_ms(unsigned int time)
0084 ; {
0084 05C0 rjmp L19
0086 L18:
0086 .dbline 91
0086 .dbline 92
0086 0EE1 ldi R16,30
0088 10E0 ldi R17,0
008A F2DF rcall _delay_us
008C .dbline 93
008C 4150 subi R20,1
008E 5040 sbci R21,0
0090 .dbline 94
0090 L19:
0090 .dbline 90
0090 ; while(time!=0)
0090 4030 cpi R20,0
0092 4507 cpc R20,R21
0094 C1F7 brne L18
0096 X0:
0096 .dbline -2
0096 .dbline 95
0096 ; {
0096 ; delay_us(30);
0096 ; time--;
0096 ; }
0096 ; }
0096 L17:
0096 00D0 rcall pop_gset1
0098 .dbline 0 ; func end
0098 0895 ret
009A .dbsym r time 20 i
009A .dbend
009A .dbfunc e main _main fV
009A ; i -> R20,R21
.even
009A _main::
009A .dbline -1
009A .dbline 98
009A ;
009A ; void main()
009A ; {int i;
009A .dbline 99
009A ; init_devices();
009A E1DF rcall _init_devices
009C 12C0 rjmp L23
009E L22:
009E .dbline 105
009E ; /*put_s("hello donkey!");
009E ; put_char(0x0a);
009E ; put_char(0x0d);
009E ; put_s("i love you");*/
009E ; while(1)
009E ; {
009E .dbline 106
009E ; for(i=0;i<6;i++)
009E 4427 clr R20
00A0 5527 clr R21
00A2 L25:
00A2 .dbline 107
00A2 .dbline 108
00A2 80E0 ldi R24,<_f
00A4 90E0 ldi R25,>_f
00A6 FA01 movw R30,R20
00A8 E80F add R30,R24
00AA F91F adc R31,R25
00AC 0081 ldd R16,z+0
00AE C0DF rcall _put_char
00B0 .dbline 109
00B0 L26:
00B0 .dbline 106
00B0 4F5F subi R20,255 ; offset = 1
00B2 5F4F sbci R21,255
00B4 .dbline 106
00B4 4630 cpi R20,6
00B6 E0E0 ldi R30,0
00B8 5E07 cpc R21,R30
00BA 9CF3 brlt L25
00BC .dbline 111
00BC 04E6 ldi R16,100
00BE 10E0 ldi R17,0
00C0 DFDF rcall _delay_ms
00C2 .dbline 112
00C2 L23:
00C2 .dbline 104
00C2 EDCF rjmp L22
00C4 X1:
00C4 .dbline -2
00C4 .dbline 113
00C4 ; {
00C4 ; put_char(f[i]);
00C4 ; }//显示数字时,调proteus里面黑屏右键hex display mode
00C4 ; //while(1);
00C4 ; delay_ms(100);
00C4 ; }
00C4 ; }
00C4 L21:
00C4 .dbline 0 ; func end
00C4 0895 ret
00C6 .dbsym r i 20 I
00C6 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -