📄 usart.s
字号:
.module usart.c
.area data(ram, con, rel)
_temprecv::
.blkb 1
.area idata
.byte 240
.area data(ram, con, rel)
.dbfile E:\AVR开~1\例程\实验15_串口通讯回送数据\usart.c
.dbsym e temprecv _temprecv c
.area vector(rom, abs)
.org 22
rjmp _uart0_rx_isr
.area data(ram, con, rel)
.dbfile E:\AVR开~1\例程\实验15_串口通讯回送数据\usart.c
.area text(rom, con, rel)
.dbfile E:\AVR开~1\例程\实验15_串口通讯回送数据\usart.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
.even
_uart0_rx_isr::
st -y,R2
in R2,0x3f
st -y,R2
.dbline -1
.dbline 33
; //******************************************************************************
; // *
; // FileName : 实验板uart.c ICCAVR V6.31A编译 *
; // Function : uart应用练习 ,回送PC发送的数据,从而双向通讯。 *
; // Date : 2006-05-07 *
; // Version : 1.0 *
; // *
; // Author : 开关电源 hongtusy@163.com *
; // Company : 电子信息技术咨询网 http://www.itsn.cn *
; // *
; //***************************描述与记事*****************************************
; //实验板的AVR程序,uart应用,和计算机通讯,回送PC发送的数据
; //接线定义:PD0-RXD PD1-TXD 开关位置:SW6-7/8打开。
; //使用串口调试器,使用十六进制方式,首先让PC发送一个字符给MCU,然后将接收到MCU返回的值。
; //记事:本程序旨在对uart的理解与演示,程序适合初学者使用.
; //使用片外8MHz晶体,9600bps波特率
; //******************************************************************************
;
; #include <iom16v.h> //头文件,ATmega8535单片机的寄存器定义
; #include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
;
; typedef unsigned char uchar; //数据类型说明,无符号整型,两字节大小。
; typedef unsigned int uint; //数据类型说明,无符号字符型,单字节大小。
;
; #define BAUDRATE 9600 //波特率
; #define F_CPU 8000000 //系统晶体频率
; uchar temprecv=0xf0,tempsend;
; /*========*/
;
; #pragma interrupt_handler uart0_rx_isr: 12
;
; void uart0_rx_isr(void)
; {
.dbline 35
;
; temprecv=UDR;
in R2,0xc
sts _temprecv,R2
.dbline 37
; //while(!(UCSRA&(1<<UDRE)));
; UDR = temprecv;
out 0xc,R2
.dbline -2
L1:
ld R2,y+
out 0x3f,R2
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e DelaymS _DelaymS fV
; j -> R20
; i -> R16,R17
.even
_DelaymS::
rcall push_gset1
.dbline -1
.dbline 48
;
; }
; /************************************************
; 函 数 名: DelaymS()
; 功 能: 毫秒级延时函数
; 输入参数: 延迟时间/系统晶体
; 输出参数: 做相应的延迟处理
; 描 述: /
; ***********************************************/
; void DelaymS (uint i) //延时函数,参数i为延时时间
; {
.dbline 50
; uchar j; //双重延时
; for (;i!=0;i--)
rjmp L6
L3:
.dbline 51
; {
.dbline 52
ldi R20,30
rjmp L10
L7:
.dbline 52
L8:
.dbline 52
dec R20
L10:
.dbline 52
tst R20
brne L7
.dbline 53
L4:
.dbline 50
subi R16,1
sbci R17,0
L6:
.dbline 50
cpi R16,0
cpc R16,R17
brne L3
X0:
.dbline -2
L2:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r i 16 i
.dbend
.dbfunc e usart_Init _usart_Init fV
.even
_usart_Init::
.dbline -1
.dbline 63
; for (j=30;j!=0;j--);
; }
; }
; /********************************************************
; 子程序名: usart_Init()
; 功 能: 串口初始化
; 输入参数: /
; 输出参数: /
; 描 述: /
; ********************************************************/
; void usart_Init (void)
; {
.dbline 64
; CLI(); //关闭中断
cli
.dbline 65
; UBRRL= (F_CPU/BAUDRATE/16-1)%256;
ldi R24,51
out 0x9,R24
.dbline 66
; UBRRH= (F_CPU/BAUDRATE/16-1)/256;
clr R2
out 0x20,R2
.dbline 68
; //UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
; UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //接收结束中断使能,RXD&TXD使能
ldi R24,152
out 0xa,R24
.dbline 69
; UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<UCSZ0)|(1<<UCSZ1);
ldi R24,166
out 0x20,R24
.dbline 71
; //访问UCSRC寄存器,偶校验,8个数据位,默认一个停止位,
; SREG = 0b10000000;
ldi R24,128
out 0x3f,R24
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; temp -> R20
.even
_main::
.dbline -1
.dbline 77
; //TIMSK =0X00;
; //SEI(); //开全局中断使能
; }
; //*****************主程序**********************************
; void main (void)
; {
.dbline 78
; uchar temp=0xff;
ldi R20,255
.dbline 79
; usart_Init(); //串口初始化
rcall _usart_Init
rjmp L14
L13:
.dbline 81
; while(1) //无限循环执行
; {
.dbline 86
; //if (UCSRA & (1<<RXC)) //等待接收完成,
; //{
; // temp = UDR; //将接收到的数据暂存
; //while(!(UCSRA&(1<<UDRE)));
; if(temp!=temprecv)
lds R2,_temprecv
cp R20,R2
breq L16
.dbline 87
; {
L18:
.dbline 88
L19:
.dbline 88
; while(!(UCSRA&(1<<UDRE)));
sbis 0xb,5
rjmp L18
.dbline 89
; UDR = temprecv; //将接收到的数据发送出去
lds R2,_temprecv
out 0xc,R2
.dbline 90
; }
L16:
.dbline 92
lds R20,_temprecv
.dbline 94
L14:
.dbline 80
rjmp L13
X1:
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\AVR开~1\例程\实验15_串口通讯回送数据\usart.c
_tempsend::
.blkb 1
.dbsym e tempsend _tempsend c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -