📄 usart2.lis
字号:
.module usart2.c
.area vector(rom, abs)
.org 44
002C 0C940000 jmp _uart0_rx_isr
.area text(rom, con, rel)
0000 .dbfile F:\LX\USART\usart2.c
0000 .dbfunc e uart0_rx_isr _uart0_rx_isr fV
0000 ; dat -> R20
.even
0000 _uart0_rx_isr::
0000 0E940000 xcall push_lset
0004 0E940000 xcall push_gset1
0008 .dbline -1
0008 .dbline 12
0008 .dbline 13
0008 5F9B sbis 0xb,7
000A 03C0 rjmp L2
000C .dbline 13
000C .dbline 14
000C 4CB1 in R20,0xc
000E .dbline 15
000E 042F mov R16,R20
0010 2AD0 xcall _USART_Transmit
0012 .dbline 16
0012 L2:
0012 .dbline -2
0012 L1:
0012 0E940000 xcall pop_gset1
0016 0E940000 xcall pop_lset
001A .dbline 0 ; func end
001A 1895 reti
001C .dbsym r dat 20 c
001C .dbend
001C .dbfunc e main _main fV
001C ; rec -> <dead>
.even
001C _main::
001C .dbline -1
001C .dbline 20
001C ; #include<iom16v.h>
001C ; #include <macros.h>
001C ; #define key (PIND&0x04) //定义按键PD2
001C ; /*****************函数原型声明************************/
001C ; void USART_Init(unsigned int baud);
001C ; void USART_Transmit(unsigned char dat);
001C ; void delayms(unsigned int t);
001C ; unsigned char USART_Receive(void);
001C ; /******************接收中断函数****************************/
001C ; #pragma interrupt_handler uart0_rx_isr:12
001C ; void uart0_rx_isr(void)
001C ; { unsigned char dat;
001C ; if(UCSRA&(1<<RXC)){ //把要接收的数据全部接收
001C ; dat=UDR;
001C ; USART_Transmit(dat);
001C ; }
001C ; }
001C ; /*****************************************************/
001C ; void main(void)
001C ; { unsigned char rec;
001C .dbline 21
001C ; PORTB=0xff;
001C 8FEF ldi R24,255
001E 88BB out 0x18,R24
0020 .dbline 22
0020 ; DDRB=0xff;
0020 87BB out 0x17,R24
0022 .dbline 23
0022 ; PORTD=0x07;
0022 87E0 ldi R24,7
0024 82BB out 0x12,R24
0026 .dbline 24
0026 ; DDRD=0x02;
0026 82E0 ldi R24,2
0028 81BB out 0x11,R24
002A .dbline 25
002A ; UCSRA=0x00;
002A 2224 clr R2
002C 2BB8 out 0xb,R2
002E .dbline 26
002E ; USART_Init(71); //波特为9600,外部晶振11.0592
002E 07E4 ldi R16,71
0030 10E0 ldi R17,0
0032 0FD0 xcall _USART_Init
0034 .dbline 27
0034 ; SEI();
0034 7894 sei
0036 0BC0 xjmp L6
0038 L5:
0038 .dbline 29
0038 ; while(1)
0038 ; {
0038 .dbline 30
0038 ; if(key==0)
0038 8299 sbic 0x10,2
003A 09C0 rjmp L8
003C .dbline 31
003C ; { //按键按下发送一字节数据
003C .dbline 32
003C ; delayms(10);
003C 0AE0 ldi R16,10
003E 10E0 ldi R17,0
0040 1AD0 xcall _delayms
0042 .dbline 33
0042 ; if(key==0){
0042 8299 sbic 0x10,2
0044 04C0 rjmp L10
0046 .dbline 33
0046 L12:
0046 .dbline 34
0046 L13:
0046 .dbline 34
0046 ; while(!key);
0046 829B sbis 0x10,2
0048 FECF rjmp L12
004A .dbline 35
004A ; USART_Transmit(0x22);
004A 02E2 ldi R16,34
004C 0CD0 xcall _USART_Transmit
004E .dbline 36
004E ; }
004E L10:
004E .dbline 37
004E ; }
004E L8:
004E .dbline 38
004E L6:
004E .dbline 28
004E F4CF xjmp L5
0050 X0:
0050 .dbline -2
0050 L4:
0050 .dbline 0 ; func end
0050 0895 ret
0052 .dbsym l rec 1 c
0052 .dbend
0052 .dbfunc e USART_Init _USART_Init fV
0052 ; baud -> R16,R17
.even
0052 _USART_Init::
0052 .dbline -1
0052 .dbline 43
0052 ; }
0052 ; }
0052 ;
0052 ; /******************USART初始化***********************/
0052 ; void USART_Init(unsigned int baud)
0052 ; {
0052 .dbline 44
0052 ; UBRRH=(unsigned char)(baud>>8);
0052 1801 movw R2,R16
0054 232C mov R2,R3
0056 3324 clr R3
0058 20BC out 0x20,R2
005A .dbline 45
005A ; UBRRL=(unsigned char)baud; //设定波特率
005A 09B9 out 0x9,R16
005C .dbline 46
005C ; UCSRB=0x98; //使能接收和发送,开接收中断
005C 88E9 ldi R24,152
005E 8AB9 out 0xa,R24
0060 .dbline 47
0060 ; UCSRC=0x8e; //设置帧格式8数据位,2停止位
0060 8EE8 ldi R24,142
0062 80BD out 0x20,R24
0064 .dbline -2
0064 L15:
0064 .dbline 0 ; func end
0064 0895 ret
0066 .dbsym r baud 16 i
0066 .dbend
0066 .dbfunc e USART_Transmit _USART_Transmit fV
0066 ; dat -> R16
.even
0066 _USART_Transmit::
0066 .dbline -1
0066 .dbline 51
0066 ; }
0066 ; /************发送函数****************************/
0066 ; void USART_Transmit(unsigned char dat)
0066 ; {
0066 L17:
0066 .dbline 52
0066 L18:
0066 .dbline 52
0066 ; while(!(UCSRA&(1<<UDRE)));
0066 5D9B sbis 0xb,5
0068 FECF rjmp L17
006A .dbline 53
006A ; UDR=dat;
006A 0CB9 out 0xc,R16
006C .dbline -2
006C L16:
006C .dbline 0 ; func end
006C 0895 ret
006E .dbsym r dat 16 c
006E .dbend
006E .dbfunc e USART_Receive _USART_Receive fc
.even
006E _USART_Receive::
006E .dbline -1
006E .dbline 57
006E ; }
006E ; /************接收函数*****************************/
006E ; unsigned char USART_Receive(void)
006E ; {
006E L21:
006E .dbline 58
006E L22:
006E .dbline 58
006E ; while(!(UCSRA&(1<<RXC)));
006E 5F9B sbis 0xb,7
0070 FECF rjmp L21
0072 .dbline 59
0072 ; return UDR;
0072 0CB1 in R16,0xc
0074 .dbline -2
0074 L20:
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbend
0076 .dbfunc e delayms _delayms fV
0076 ; i -> R20,R21
0076 ; j -> R22,R23
0076 ; t -> R16,R17
.even
0076 _delayms::
0076 0E940000 xcall push_gset2
007A .dbline -1
007A .dbline 63
007A ; }
007A ; /**********延时*********************************/
007A ; void delayms(unsigned int t)
007A ; {
007A .dbline 65
007A ; unsigned int i,j;
007A ; for(i=0;i<t;i++)
007A 4427 clr R20
007C 5527 clr R21
007E 0BC0 xjmp L28
0080 L25:
0080 .dbline 66
0080 6627 clr R22
0082 7727 clr R23
0084 02C0 xjmp L32
0086 L29:
0086 .dbline 66
0086 L30:
0086 .dbline 66
0086 6F5F subi R22,255 ; offset = 1
0088 7F4F sbci R23,255
008A L32:
008A .dbline 66
008A 6436 cpi R22,100
008C E0E0 ldi R30,0
008E 7E07 cpc R23,R30
0090 D0F3 brlo L29
0092 L26:
0092 .dbline 65
0092 4F5F subi R20,255 ; offset = 1
0094 5F4F sbci R21,255
0096 L28:
0096 .dbline 65
0096 4017 cp R20,R16
0098 5107 cpc R21,R17
009A 90F3 brlo L25
009C .dbline -2
009C L24:
009C 0E940000 xcall pop_gset2
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r i 20 i
00A2 .dbsym r j 22 i
00A2 .dbsym r t 16 i
00A2 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -