📄 uart.lis
字号:
.module UART.C
.area text(rom, con, rel)
0000 .dbfile G:\sppp\UART.C
0000 .dbfunc e putchar _putchar fV
0000 ; c -> R16
.even
0000 _putchar::
0000 .dbline -1
0000 .dbline 6
0000 ; #include <iom128v.h>
0000 ; #define fosc 7372800 //晶振8MHZ
0000 ; #define baud 19200 //波特率
0000 ; /* 字符输出函数 */
0000 ; void putchar(unsigned char c)
0000 ; {
0000 L2:
0000 .dbline 7
0000 L3:
0000 .dbline 7
0000 ; while (!(UCSR0A&(1<<UDRE0)));
0000 5D9B sbis 0xb,5
0002 FECF rjmp L2
0004 .dbline 8
0004 ; UDR0=c;
0004 0CB9 out 0xc,R16
0006 .dbline -2
0006 .dbline 9
0006 ; }
0006 L1:
0006 .dbline 0 ; func end
0006 0895 ret
0008 .dbsym r c 16 c
0008 .dbend
0008 .dbfunc e getchar _getchar fc
.even
0008 _getchar::
0008 .dbline -1
0008 .dbline 12
0008 ; /* 字符输入函数 */
0008 ; unsigned char getchar(void)
0008 ; {
0008 L6:
0008 .dbline 13
0008 L7:
0008 .dbline 13
0008 ; while(!(UCSR0A& (1<<RXC0)));
0008 5F9B sbis 0xb,7
000A FECF rjmp L6
000C .dbline 14
000C ; return UDR0;
000C 0CB1 in R16,0xc
000E .dbline -2
000E L5:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e puts _puts fI
0010 ; s -> R20,R21
.even
0010 _puts::
0010 0E940000 xcall push_gset1
0014 A801 movw R20,R16
0016 .dbline -1
0016 .dbline 18
0016 ; }
0016 ; /* 字符串输出函数 */
0016 ; int puts(char *s)
0016 ; {
0016 05C0 xjmp L11
0018 L10:
0018 .dbline 20
0018 .dbline 21
0018 FA01 movw R30,R20
001A 0081 ldd R16,z+0
001C F1DF xcall _putchar
001E .dbline 22
001E 4F5F subi R20,255 ; offset = 1
0020 5F4F sbci R21,255
0022 .dbline 23
0022 L11:
0022 .dbline 19
0022 ; while (*s)
0022 FA01 movw R30,R20
0024 2080 ldd R2,z+0
0026 2220 tst R2
0028 B9F7 brne L10
002A .dbline 24
002A ; {
002A ; putchar(*s);
002A ; s++;
002A ; }
002A ; putchar(0x0a);//回车换行
002A 0AE0 ldi R16,10
002C E9DF xcall _putchar
002E .dbline 25
002E ; putchar(0x0d);
002E 0DE0 ldi R16,13
0030 E7DF xcall _putchar
0032 .dbline 26
0032 ; return 1;
0032 01E0 ldi R16,1
0034 10E0 ldi R17,0
0036 .dbline -2
0036 L9:
0036 0E940000 xcall pop_gset1
003A .dbline 0 ; func end
003A 0895 ret
003C .dbsym r s 20 pc
003C .dbend
003C .dbfunc e putstr _putstr fV
003C ; s -> R20,R21
.even
003C _putstr::
003C 0E940000 xcall push_gset1
0040 A801 movw R20,R16
0042 .dbline -1
0042 .dbline 30
0042 ; }
0042 ; /* 不含回车换行的字符串输出函数 */
0042 ; void putstr(char *s)
0042 ; {
0042 05C0 xjmp L15
0044 L14:
0044 .dbline 32
0044 .dbline 33
0044 FA01 movw R30,R20
0046 0081 ldd R16,z+0
0048 DBDF xcall _putchar
004A .dbline 34
004A 4F5F subi R20,255 ; offset = 1
004C 5F4F sbci R21,255
004E .dbline 35
004E L15:
004E .dbline 31
004E ; while (*s)
004E FA01 movw R30,R20
0050 2080 ldd R2,z+0
0052 2220 tst R2
0054 B9F7 brne L14
0056 .dbline -2
0056 .dbline 36
0056 ; {
0056 ; putchar(*s);
0056 ; s++;
0056 ; }
0056 ; }
0056 L13:
0056 0E940000 xcall pop_gset1
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r s 20 pc
005C .dbend
005C .dbfunc e uart_init _uart_init fV
.even
005C _uart_init::
005C .dbline -1
005C .dbline 42
005C ; /* UART初始化 */
005C ;
005C ;
005C ;
005C ; void uart_init(void)
005C ; {
005C .dbline 44
005C ;
005C ; UCSR0A=0x00;
005C 2224 clr R2
005E 2BB8 out 0xb,R2
0060 .dbline 45
0060 ; UCSR0B=0x00;
0060 2AB8 out 0xa,R2
0062 .dbline 46
0062 ; UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//允许发送和接收;//允许发送和接收
0062 88E9 ldi R24,152
0064 8AB9 out 0xa,R24
0066 .dbline 47
0066 ; UBRR0L=(fosc/16/(baud+1))%256;
0066 87E1 ldi R24,23
0068 89B9 out 0x9,R24
006A .dbline 48
006A ; UBRR0H=(fosc/16/(baud+1))/256;
006A 20929000 sts 144,R2
006E .dbline 49
006E ; UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//8位数据+1位STOP位
006E 86E0 ldi R24,6
0070 80939500 sts 149,R24
0074 .dbline 50
0074 ; SREG|=0x80;
0074 7894 bset 7
0076 .dbline -2
0076 .dbline 51
0076 ; }
0076 L17:
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -