📄 myuart.lis
字号:
.module myuart.c
.area text(rom, con, rel)
0000 .dbfile F:\全物理仿真\mega128\uart_0\myuart.c
0000 .dbfunc e uart0_init _uart0_init fV
.even
0000 _uart0_init::
0000 .dbline -1
0000 .dbline 8
0000 ; #include"includes.h"
0000 ;
0000 ; /*USART initiate*/
0000 ; U8 rx_flag; //接收数据标志
0000 ; U8 rx_buff; //接收数据缓存区
0000 ;
0000 ; void uart0_init(void)
0000 ; {
0000 .dbline 9
0000 ; UBRR0H = BAUD_H;
0000 2224 clr R2
0002 20929000 sts 144,R2
0006 .dbline 10
0006 ; UBRR0L = BAUD_L; //Set baud rate
0006 83E2 ldi R24,35
0008 89B9 out 0x9,R24
000A .dbline 11
000A ; UCSR0C = 0x0E; //Set frame format: 8data, 2stop bit
000A 8EE0 ldi R24,14
000C 80939500 sts 149,R24
0010 .dbline 12
0010 ; UCSR0B = ((1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)); //Enable Receiver and Transmitter
0010 88E9 ldi R24,152
0012 8AB9 out 0xa,R24
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbend
.area vector(rom, abs)
.org 72
0048 0C940B00 jmp _uart0_rx_isr
.area text(rom, con, rel)
0016 .dbfile F:\全物理仿真\mega128\uart_0\myuart.c
0016 .dbfunc e uart0_rx_isr _uart0_rx_isr fV
.even
0016 _uart0_rx_isr::
0016 2A92 st -y,R2
0018 2FB6 in R2,0x3f
001A 2A92 st -y,R2
001C .dbline -1
001C .dbline 20
001C ; //1:接受中断
001C ; //0:关闭中断
001C ; }
001C ;
001C ; //接收中断
001C ; #pragma interrupt_handler uart0_rx_isr:19
001C ; void uart0_rx_isr(void)
001C ; {
001C .dbline 22
001C ; //uart has received a character in UDR
001C ; PORTA=UDR0; //接收数据并输出到PA
001C 2CB0 in R2,0xc
001E 2BBA out 0x1b,R2
0020 .dbline -2
0020 L2:
0020 2990 ld R2,y+
0022 2FBE out 0x3f,R2
0024 2990 ld R2,y+
0026 .dbline 0 ; func end
0026 1895 reti
0028 .dbend
.area vector(rom, abs)
.org 80
0050 0C941400 jmp _uart0_tx_isr
.area text(rom, con, rel)
0028 .dbfile F:\全物理仿真\mega128\uart_0\myuart.c
0028 .dbfunc e uart0_tx_isr _uart0_tx_isr fV
.even
0028 _uart0_tx_isr::
0028 .dbline -1
0028 .dbline 28
0028 ; }
0028 ;
0028 ; //发送中断
0028 ; #pragma interrupt_handler uart0_tx_isr:21
0028 ; void uart0_tx_isr(void)
0028 ; {
0028 .dbline -2
0028 L3:
0028 .dbline 0 ; func end
0028 1895 reti
002A .dbend
.area vector(rom, abs)
.org 76
004C 0C941500 jmp _uart0_data_isr
.area text(rom, con, rel)
002A .dbfile F:\全物理仿真\mega128\uart_0\myuart.c
002A .dbfunc e uart0_data_isr _uart0_data_isr fV
.even
002A _uart0_data_isr::
002A .dbline -1
002A .dbline 34
002A ; }
002A ;
002A ; //USART0 数据寄存器空中断
002A ; #pragma interrupt_handler uart0_data_isr:20
002A ; void uart0_data_isr(void)
002A ; {
002A .dbline -2
002A L4:
002A .dbline 0 ; func end
002A 1895 reti
002C .dbend
002C .dbfunc e uart0_putchar _uart0_putchar fV
002C ; c -> R16
.even
002C _uart0_putchar::
002C .dbline -1
002C .dbline 43
002C ; }
002C ;
002C ; //call this routine to initialize all peripherals
002C ;
002C ;
002C ;
002C ; //从RS232发送一个字节
002C ; void uart0_putchar(char c)
002C ; {
002C L6:
002C .dbline 44
002C L7:
002C .dbline 44
002C ; while(!(UCSR0A & 0x20));
002C 5D9B sbis 0xb,5
002E FECF rjmp L6
0030 .dbline 45
0030 ; UDR0 = c;
0030 0CB9 out 0xc,R16
0032 .dbline -2
0032 L5:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbsym r c 16 c
0034 .dbend
0034 .dbfunc e uart0_putstr _uart0_putstr fV
0034 ; str -> R20,R21
.even
0034 _uart0_putstr::
0034 0E940000 xcall push_gset1
0038 A801 movw R20,R16
003A .dbline -1
003A .dbline 50
003A ; }
003A ;
003A ; //输出一个字符串
003A ; void uart0_putstr(char* str)
003A ; {
003A 05C0 xjmp L11
003C L10:
003C .dbline 52
003C .dbline 53
003C FA01 movw R30,R20
003E 0081 ldd R16,z+0
0040 F5DF xcall _uart0_putchar
0042 .dbline 54
0042 4F5F subi R20,255 ; offset = 1
0044 5F4F sbci R21,255
0046 .dbline 55
0046 L11:
0046 .dbline 51
0046 ; while(*str)
0046 FA01 movw R30,R20
0048 2080 ldd R2,z+0
004A 2220 tst R2
004C B9F7 brne L10
004E .dbline -2
004E L9:
004E 0E940000 xcall pop_gset1
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r str 20 pc
0054 .dbend
0054 .dbfunc e uart0_getchar _uart0_getchar fI
0054 ; res -> R16
0054 ; status -> R18
.even
0054 _uart0_getchar::
0054 .dbline -1
0054 .dbline 60
0054 ; {
0054 ; uart0_putchar(*str);
0054 ; str++;
0054 ; }
0054 ; }
0054 ;
0054 ; //从RS232接收一个字节
0054 ; int uart0_getchar(void)
0054 ; {
0054 .dbline 62
0054 ; unsigned char status,res;
0054 ; if(!(UCSR0A & 0x80)) return -1; //no data to be received
0054 5F99 sbic 0xb,7
0056 03C0 rjmp L14
0058 .dbline 62
0058 0FEF ldi R16,-1
005A 1FEF ldi R17,-1
005C 09C0 xjmp L13
005E L14:
005E .dbline 63
005E ; status = UCSR0A;
005E 2BB1 in R18,0xb
0060 .dbline 64
0060 ; res = UDR0;
0060 0CB1 in R16,0xc
0062 .dbline 65
0062 ; if (status & 0x1c) return -1; // If error, return -1
0062 822F mov R24,R18
0064 8C71 andi R24,28
0066 19F0 breq L16
0068 .dbline 65
0068 0FEF ldi R16,-1
006A 1FEF ldi R17,-1
006C 01C0 xjmp L13
006E L16:
006E .dbline 66
006E ; return res;
006E 1127 clr R17
0070 .dbline -2
0070 L13:
0070 .dbline 0 ; func end
0070 0895 ret
0072 .dbsym r res 16 c
0072 .dbsym r status 18 c
0072 .dbend
0072 .dbfunc e uart0_waitchar _uart0_waitchar fc
0072 ; c -> R20,R21
.even
0072 _uart0_waitchar::
0072 0E940000 xcall push_gset1
0076 .dbline -1
0076 .dbline 70
0076 ; }
0076 ;
0076 ; char uart0_waitchar(void)
0076 ; {
0076 L19:
0076 .dbline 72
0076 L20:
0076 .dbline 72
0076 ; int c;
0076 ; while((c=uart0_getchar())==-1);
0076 EEDF xcall _uart0_getchar
0078 A801 movw R20,R16
007A 4F3F cpi R20,255
007C EFEF ldi R30,255
007E 5E07 cpc R21,R30
0080 D1F3 breq L19
0082 .dbline 73
0082 ; return (char)c;
0082 .dbline -2
0082 L18:
0082 0E940000 xcall pop_gset1
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r c 20 I
0088 .dbend
.area bss(ram, con, rel)
0000 .dbfile F:\全物理仿真\mega128\uart_0\myuart.c
0000 _rx_buff::
0000 .blkb 1
0001 .dbsym e rx_buff _rx_buff c
0001 _rx_flag::
0001 .blkb 1
0002 .dbsym e rx_flag _rx_flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -