📄 main.s
字号:
.module main.c
.area lit(rom, con, rel)
_buffer::
.byte 'h,'t,'t,'p,58,47,47,'w,'w,'w,46,'a,'v,'r,'v,'i
.byte 46,'c,'o,'m,0
.dbfile E:\avr\usart_mega16\main.c
.dbsym e buffer _buffer A[21:21]kc
.area text(rom, con, rel)
.dbfile E:\avr\usart_mega16\main.c
.dbfunc e USART_Init _USART_Init fV
; tmp -> R10,R11
; baud -> R10,R11
.even
_USART_Init::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 15
; // ICC-AVR application builder : 2007-5-20 17:21:25
; // Target : M16
; // Crystal: 7.3728Mhz
; // AVR mega16 串口测试
;
; #include <iom16v.h>
; #include <macros.h>
;
; #define F_CPU 7372800
; const unsigned char buffer[]="http://www.avrvi.com";
;
; //下面三个函数直接从数据手册上拷贝过来的
;
; void USART_Init( unsigned int baud )
; {
.dbline 18
; unsigned int tmp;
; /* 设置波特率*/
; tmp= F_CPU/baud/16-1;
movw R2,R10
clr R4
clr R5
ldi R20,0
ldi R21,128
ldi R22,112
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall div32s
ldi R20,16
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R23
st -y,R22
st -y,R21
st -y,R20
xcall div32s
movw R2,R16
movw R4,R18
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R10,R2
.dbline 19
; UBRRH = (unsigned char)(tmp>>8);
mov R2,R3
clr R3
out 0x20,R2
.dbline 20
; UBRRL = (unsigned char)tmp;
out 0x9,R10
.dbline 22
; /* 接收器与发送器使能*/
; UCSRB = (1<<RXEN)|(1<<TXEN);
ldi R24,24
out 0xa,R24
.dbline 24
; /* 设置帧格式: 8 个数据位, 2 个停止位*/
; UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
ldi R24,142
out 0x20,R24
.dbline -2
L1:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r tmp 10 i
.dbsym r baud 10 i
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 51
; }
; /* UMSEL 模式选择
; 0 异步操作
; 1 同步操作
;
; USBS 停止位位数
; 0 1
; 1 2
;
; UCSZ2 UCSZ1 UCSZ0 字符长度
; 0 0 0 5 位
; 0 0 1 6 位
; 0 1 0 7 位
; 0 1 1 8 位
; 1 0 0 保留
; 1 0 1 保留
; 1 1 0 保留
; 1 1 1 9 位
; */
; // ICC 生成的初始化
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9600 (0.0%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
.dbline 52
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 53
; UCSRA = 0x00;
out 0xb,R2
.dbline 54
; UCSRC = BIT(URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 55
; UBRRL = 0x2F; //set baud rate lo
ldi R24,47
out 0x9,R24
.dbline 56
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 57
; UCSRB = 0x18;
ldi R24,24
out 0xa,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e USART_Transmit _USART_Transmit fV
; data -> R16
.even
_USART_Transmit::
.dbline -1
.dbline 62
; }
;
; // 数据发送【发送5 到8 位数据位的帧】
; void USART_Transmit( unsigned char data )
; {
L4:
.dbline 65
L5:
.dbline 64
; /* 等待发送缓冲器为空 */
; while ( !( UCSRA & (1<<UDRE)) )
sbis 0xb,5
rjmp L4
.dbline 67
; ;
; /* 将数据放入缓冲器,发送数据 */
; UDR = data;
out 0xc,R16
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e USART_Receive _USART_Receive fc
.even
_USART_Receive::
.dbline -1
.dbline 73
; }
;
;
; // 数据接收【以5 到8 个数据位的方式接收数 据帧】
; unsigned char USART_Receive( void )
; {
L8:
.dbline 76
L9:
.dbline 75
; /* 等待接收数据*/
; while ( !(UCSRA & (1<<RXC)) )
sbis 0xb,7
rjmp L8
.dbline 78
; ;
; /* 从缓冲器中获取并返回数据*/
; return UDR;
in R16,0xc
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.dbfunc e USART_Transmit_2 _USART_Transmit_2 fV
.even
_USART_Transmit_2::
.dbline -1
.dbline 83
; }
;
; //连续发送字符
; void USART_Transmit_2( void )
; {
L12:
.dbline 85
L13:
.dbline 84
; while ( !( UCSRA & (1<<UDRE)) )
sbis 0xb,5
rjmp L12
.dbline 86
; ;
; UDR = 'H';
ldi R24,72
out 0xc,R24
L15:
.dbline 88
L16:
.dbline 87
; while ( !( UCSRA & (1<<UDRE)) )
sbis 0xb,5
rjmp L15
.dbline 89
; ;
; UDR = 'e';
ldi R24,101
out 0xc,R24
L18:
.dbline 91
L19:
.dbline 90
; while ( !( UCSRA & (1<<UDRE)) )
sbis 0xb,5
rjmp L18
.dbline 92
; ;
; UDR = 'l';
ldi R24,108
out 0xc,R24
L21:
.dbline 94
L22:
.dbline 93
; while ( !( UCSRA & (1<<UDRE)) )
sbis 0xb,5
rjmp L21
.dbline 95
; ;
; UDR = 'l';
ldi R24,108
out 0xc,R24
L24:
.dbline 97
L25:
.dbline 96
; while ( !( UCSRA & (1<<UDRE)) )
sbis 0xb,5
rjmp L24
.dbline 98
; ;
; UDR = 'o';
ldi R24,111
out 0xc,R24
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; tmp -> R20
; i -> R22
.even
_main::
.dbline -1
.dbline 103
; }
;
;
; void main(void)
; {
.dbline 104
; unsigned char i=0,tmp=0;
clr R22
.dbline 104
clr R20
.dbline 106
;
; USART_Init(9600); //波特率9600 初始化串口
ldi R16,9600
ldi R17,37
xcall _USART_Init
.dbline 109
; // uart0_init();
;
; for(i=0;i<20;i++) //发送数组里面的字符串
xjmp L31
L28:
.dbline 110
.dbline 111
ldi R24,<_buffer
ldi R25,>_buffer
mov R30,R22
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
xcall _USART_Transmit
.dbline 112
L29:
.dbline 109
inc R22
L31:
.dbline 109
cpi R22,20
brlo L28
.dbline 114
; {
; USART_Transmit(buffer[i]);
; }
;
; USART_Transmit(0x0d); //发送一个回车
ldi R16,13
xcall _USART_Transmit
.dbline 115
; USART_Transmit(0x0a); //发送一个换行
ldi R16,10
xcall _USART_Transmit
xjmp L33
L32:
.dbline 118
;
; while(1)
; {
.dbline 119
; if(UCSRA&(1<<RXC)) //如果接收缓存区有数据
sbis 0xb,7
rjmp L35
.dbline 120
; {
.dbline 121
; tmp=USART_Receive(); //接收数据
xcall _USART_Receive
mov R20,R16
.dbline 122
; USART_Transmit(tmp); //发送数据
xcall _USART_Transmit
.dbline 124
;
; if(tmp=='a') //对接收到的数据进行,如果是a,再发一个OK回来
cpi R20,97
brne L37
.dbline 125
; {
.dbline 126
; USART_Transmit('O');
ldi R16,79
xcall _USART_Transmit
.dbline 127
; USART_Transmit('K');
ldi R16,75
xcall _USART_Transmit
.dbline 128
; }
L37:
.dbline 129
; if(tmp=='A')
cpi R20,65
brne L39
.dbline 130
; {
.dbline 131
; USART_Transmit_2();
xcall _USART_Transmit_2
.dbline 132
; }
L39:
.dbline 133
; }
L35:
.dbline 134
L33:
.dbline 117
xjmp L32
X0:
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbsym r tmp 20 c
.dbsym r i 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -