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