📄 uart.lis
字号:
.module uart.c
.area vector(rom, abs)
.org 44
002C 0C940500 jmp _uart_rx
.area data(ram, con, rel)
0000 _data_tx::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
0001 .dbsym e data_tx _data_tx c
0001 _data_rx::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 .dbfile D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
0002 .dbsym e data_rx _data_rx c
.area text(rom, con, rel)
0000 .dbfile D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
0000 .dbfunc e main _main fV
.even
0000 _main::
0000 .dbline -1
0000 .dbline 20
0000 ; // **************************************************************
0000 ; // *** AVR单片机应用程序 ***
0000 ; // *** RS232通信演示程序 ***
0000 ; // *** 2005年10月 ***
0000 ; // *** 目标MCU:MEGA16,晶振:内部(INT)8MHZ,19200,8bit,N,1 ***
0000 ; // *** 实现将PC机串行给MEGA16的数送回给PCS机 ***
0000 ; // **************************************************************
0000 ; #include<iom16v.h>
0000 ; #include<macros.h>
0000 ; #include "uart.h"
0000 ;
0000 ; /*声明串口接收中断入口*/
0000 ; #pragma interrupt_handler uart_rx:12
0000 ; unsigned char data_tx=0,data_rx=0; //定义发送缓存和接收缓存
0000 ;
0000 ;
0000 ;
0000 ; /*RS232通信main函数*/
0000 ; void main(void)
0000 ; {
0000 .dbline 21
0000 ; CLI(); //关中断
0000 F894 cli
0002 .dbline 22
0002 ; uart_init(); //串口初始化
0002 0FD0 xcall _uart_init
0004 .dbline 23
0004 ; SEI(); //开中断
0004 7894 sei
0006 L2:
0006 .dbline 25
0006 .dbline 25
0006 .dbline 25
0006 L3:
0006 .dbline 24
0006 FFCF xjmp L2
0008 X0:
0008 .dbline -2
0008 .dbline 26
0008 ; while(1)
0008 ; {uart_rx;}
0008 ; }
0008 L1:
0008 .dbline 0 ; func end
0008 0895 ret
000A .dbend
000A .dbfunc e uart_rx _uart_rx fV
.even
000A _uart_rx::
000A 0E940000 xcall push_lset
000E .dbline -1
000E .dbline 30
000E ;
000E ; /*串口接收函数*/
000E ; void uart_rx(void)
000E ; {
000E .dbline 31
000E ; data_rx = UDR;
000E 2CB0 in R2,0xc
0010 20920100 sts _data_rx,R2
0014 .dbline 32
0014 ; data_tx=data_rx;
0014 20920000 sts _data_tx,R2
0018 .dbline 33
0018 ; putchar(data_tx);
0018 022D mov R16,R2
001A 0ED0 xcall _putchar
001C .dbline -2
001C .dbline 34
001C ; }
001C L5:
001C 0E940000 xcall pop_lset
0020 .dbline 0 ; func end
0020 1895 reti
0022 .dbend
0022 .dbfunc e uart_init _uart_init fV
.even
0022 _uart_init::
0022 .dbline -1
0022 .dbline 39
0022 ;
0022 ;
0022 ; /*串口初始化函数*/
0022 ; void uart_init(void)
0022 ; {
0022 .dbline 40
0022 ; UCSRB = 0x00; //设置波特率时关闭发送和接收
0022 2224 clr R2
0024 2AB8 out 0xa,R2
0026 .dbline 41
0026 ; UBRRL = 0x19;
0026 89E1 ldi R24,25
0028 89B9 out 0x9,R24
002A .dbline 42
002A ; UBRRH = 0x00; //设定波特率,19200
002A 20BC out 0x20,R2
002C .dbline 43
002C ; UCSRA = 0x00; //初始化
002C 2BB8 out 0xb,R2
002E .dbline 44
002E ; UCSRC = 0x86; //设置帧格式,8位数据,无奇偶校验,1位停止位
002E 86E8 ldi R24,134
0030 80BD out 0x20,R24
0032 .dbline 45
0032 ; UCSRB =(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //允许发送和接收,接收中断使能
0032 88E9 ldi R24,152
0034 8AB9 out 0xa,R24
0036 .dbline -2
0036 .dbline 46
0036 ; }
0036 L6:
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbend
0038 .dbfunc e putchar _putchar fV
0038 ; data -> R16
.even
0038 _putchar::
0038 .dbline -1
0038 .dbline 51
0038 ;
0038 ;
0038 ; /*字节输出函数*/
0038 ; void putchar(unsigned char data)
0038 ; {
0038 L8:
0038 .dbline 52
0038 L9:
0038 .dbline 52
0038 ; while (!(UCSRA&(1<<UDRE))); //判断上次发送是否完成
0038 5D9B sbis 0xb,5
003A FECF rjmp L8
003C .dbline 53
003C ; UDR=data; //发送数据
003C 0CB9 out 0xc,R16
003E .dbline -2
003E .dbline 54
003E ; }
003E L7:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbsym r data 16 c
0040 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -