📄 usart1.lis
字号:
.module USART1.c
.area vector(rom, abs)
.org 120
0078 0C940000 jmp _uart1_rx_isr
.area text(rom, con, rel)
; data -> R16
; status -> R18
.even
0000 _uart1_rx_isr::
0000 2A92 st -y,R2
0002 0A93 st -y,R16
0004 2A93 st -y,R18
0006 8A93 st -y,R24
0008 9A93 st -y,R25
000A EA93 st -y,R30
000C FA93 st -y,R31
000E 2FB6 in R2,0x3f
0010 2A92 st -y,R2
0012 ; /*******************************************************************************
0012 ; **--------------File Info-------------------------------------------------------
0012 ; ** 文 件 名: USART1.c
0012 ; ** 最后修改日期: 2008-3-26
0012 ; ** 版 本: V1.0
0012 ; ** 描 述: M64串口一驱动 header file
0012 ; **------------------------------------------------------------------------------
0012 ; ** Created by:
0012 ; ** Created date:
0012 ; **------------------------------------------------------------------------------
0012 ;
0012 ; *******************************************************************************/
0012 ; #include <USART1.h>
0012 ;
0012 ; #if USART1_EN==1
0012 ;
0012 ; INT8U rx_buffer1[RX_BUFFER_SIZE1];
0012 ; #if RX_BUFFER_SIZE1<256
0012 ; INT8U rx_wr_index1,rx_rd_index1,rx_counter1;
0012 ; #else
0012 ; INT16U rx_wr_index1,rx_rd_index1,rx_counter1;
0012 ; #endif
0012 ; INT8U rx_buffer_overflow1;
0012 ;
0012 ;
0012 ; INT8U tx_buffer1[TX_BUFFER_SIZE1];
0012 ; #if TX_BUFFER_SIZE1<256
0012 ; INT8U tx_wr_index1,tx_rd_index1,tx_counter1;
0012 ; #else
0012 ; INT16U tx_wr_index1,tx_rd_index1,tx_counter1;
0012 ; #endif
0012 ;
0012 ;
0012 ; #pragma interrupt_handler uart1_rx_isr:31
0012 ; void uart1_rx_isr(void)
0012 ; {
0012 ; INT8U status,data;
0012 ; status=UCSR1A;
0012 20919B00 lds R18,155
0016 ; data=UDR1;
0016 00919C00 lds R16,156
001A ; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
001A 822F mov R24,R18
001C 8C71 andi R24,28
001E 09F5 brne L2
0020 ; {
0020 ; rx_buffer1[rx_wr_index1]=data;
0020 80E0 ldi R24,<_rx_buffer1
0022 90E0 ldi R25,>_rx_buffer1
0024 E0910A00 lds R30,_rx_wr_index1
0028 FF27 clr R31
002A E80F add R30,R24
002C F91F adc R31,R25
002E 0083 std z+0,R16
0030 ; if (++rx_wr_index1 == RX_BUFFER_SIZE1)
0030 80910A00 lds R24,_rx_wr_index1
0034 8F5F subi R24,255 ; addi 1
0036 282E mov R2,R24
0038 20920A00 sts _rx_wr_index1,R2
003C 8230 cpi R24,2
003E 19F4 brne L4
0040 ; rx_wr_index1=0;
0040 2224 clr R2
0042 20920A00 sts _rx_wr_index1,R2
0046 L4:
0046 ; if (++rx_counter1 == RX_BUFFER_SIZE1)
0046 80910800 lds R24,_rx_counter1
004A 8F5F subi R24,255 ; addi 1
004C 282E mov R2,R24
004E 20920800 sts _rx_counter1,R2
0052 8230 cpi R24,2
0054 31F4 brne L6
0056 ; {
0056 ; rx_counter1=0;
0056 2224 clr R2
0058 20920800 sts _rx_counter1,R2
005C ; rx_buffer_overflow1=1;
005C 81E0 ldi R24,1
005E 80930700 sts _rx_buffer_overflow1,R24
0062 ; }
0062 L6:
0062 ; }
0062 L2:
0062 L1:
0062 2990 ld R2,y+
0064 2FBE out 0x3f,R2
0066 F991 ld R31,y+
0068 E991 ld R30,y+
006A 9991 ld R25,y+
006C 8991 ld R24,y+
006E 2991 ld R18,y+
0070 0991 ld R16,y+
0072 2990 ld R2,y+
0074 .dbline 0 ; func end
0074 1895 reti
.area vector(rom, abs)
.org 128
0080 0C943B00 jmp _uart1_tx_isr
.area text(rom, con, rel)
.even
0076 _uart1_tx_isr::
0076 2A92 st -y,R2
0078 8A93 st -y,R24
007A 9A93 st -y,R25
007C EA93 st -y,R30
007E FA93 st -y,R31
0080 2FB6 in R2,0x3f
0082 2A92 st -y,R2
0084 ; }
0084 ;
0084 ;
0084 ; #pragma interrupt_handler uart1_tx_isr:33
0084 ; void uart1_tx_isr(void)
0084 ; {
0084 ; if (tx_counter1)
0084 20900000 lds R2,_tx_counter1
0088 2220 tst R2
008A C9F0 breq L9
008C ; {
008C ; --tx_counter1;
008C 822D mov R24,R2
008E 8150 subi R24,1
0090 80930000 sts _tx_counter1,R24
0094 ; UDR1=tx_buffer1[tx_rd_index1];
0094 80E0 ldi R24,<_tx_buffer1
0096 90E0 ldi R25,>_tx_buffer1
0098 E0910100 lds R30,_tx_rd_index1
009C FF27 clr R31
009E E80F add R30,R24
00A0 F91F adc R31,R25
00A2 2080 ldd R2,z+0
00A4 20929C00 sts 156,R2
00A8 ; if (++tx_rd_index1 == TX_BUFFER_SIZE1)
00A8 80910100 lds R24,_tx_rd_index1
00AC 8F5F subi R24,255 ; addi 1
00AE 282E mov R2,R24
00B0 20920100 sts _tx_rd_index1,R2
00B4 8430 cpi R24,4
00B6 19F4 brne L11
00B8 ; tx_rd_index1=0;
00B8 2224 clr R2
00BA 20920100 sts _tx_rd_index1,R2
00BE L11:
00BE ; }
00BE L9:
00BE L8:
00BE 2990 ld R2,y+
00C0 2FBE out 0x3f,R2
00C2 F991 ld R31,y+
00C4 E991 ld R30,y+
00C6 9991 ld R25,y+
00C8 8991 ld R24,y+
00CA 2990 ld R2,y+
00CC .dbline 0 ; func end
00CC 1895 reti
00CE ; c -> R16
.even
00CE _putchar1::
00CE ; }
00CE ;
00CE ; //#pragma used+
00CE ; void putchar1(INT8U c)
00CE ; {
00CE L14:
00CE L15:
00CE ; while (tx_counter1 == TX_BUFFER_SIZE1);
00CE 80910000 lds R24,_tx_counter1
00D2 8430 cpi R24,4
00D4 E1F3 breq L14
00D6 ; asm("cli");
00D6 F894 cli
00D8 ; if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
00D8 8823 tst R24
00DA 21F4 brne L19
00DC 20909B00 lds R2,155
00E0 25FC sbrc R2,5
00E2 19C0 rjmp L17
00E4 L19:
00E4 ; {
00E4 ; tx_buffer1[tx_wr_index1]=c;
00E4 80E0 ldi R24,<_tx_buffer1
00E6 90E0 ldi R25,>_tx_buffer1
00E8 E0910200 lds R30,_tx_wr_index1
00EC FF27 clr R31
00EE E80F add R30,R24
00F0 F91F adc R31,R25
00F2 0083 std z+0,R16
00F4 ; if (++tx_wr_index1 == TX_BUFFER_SIZE1)
00F4 80910200 lds R24,_tx_wr_index1
00F8 8F5F subi R24,255 ; addi 1
00FA 282E mov R2,R24
00FC 20920200 sts _tx_wr_index1,R2
0100 8430 cpi R24,4
0102 19F4 brne L20
0104 ; tx_wr_index1=0;
0104 2224 clr R2
0106 20920200 sts _tx_wr_index1,R2
010A L20:
010A ; ++tx_counter1;
010A 80910000 lds R24,_tx_counter1
010E 8F5F subi R24,255 ; addi 1
0110 80930000 sts _tx_counter1,R24
0114 ; }
0114 02C0 xjmp L18
0116 L17:
0116 ; else
0116 ; UDR1=c;
0116 00939C00 sts 156,R16
011A L18:
011A ; asm("sei");
011A 7894 sei
011C L13:
011C .dbline 0 ; func end
011C 0895 ret
011E ; data -> R16
.even
011E _getchar1::
011E ; }
011E ; //#pragma used-
011E ;
011E ; //#pragma used+
011E ; INT8U getchar1(void)
011E ; {
011E L23:
011E L24:
011E ; INT8U data;
011E ;
011E ; while (rx_counter1==0);
011E 20900800 lds R2,_rx_counter1
0122 2220 tst R2
0124 E1F3 breq L23
0126 ; data=rx_buffer1[rx_rd_index1];
0126 80E0 ldi R24,<_rx_buffer1
0128 90E0 ldi R25,>_rx_buffer1
012A E0910900 lds R30,_rx_rd_index1
012E FF27 clr R31
0130 E80F add R30,R24
0132 F91F adc R31,R25
0134 0081 ldd R16,z+0
0136 ; if (++rx_rd_index1 == RX_BUFFER_SIZE1)
0136 80910900 lds R24,_rx_rd_index1
013A 8F5F subi R24,255 ; addi 1
013C 282E mov R2,R24
013E 20920900 sts _rx_rd_index1,R2
0142 8230 cpi R24,2
0144 19F4 brne L26
0146 ; rx_rd_index1=0;
0146 2224 clr R2
0148 20920900 sts _rx_rd_index1,R2
014C L26:
014C ; asm("cli");
014C F894 cli
014E ; --rx_counter1;
014E 80910800 lds R24,_rx_counter1
0152 8150 subi R24,1
0154 80930800 sts _rx_counter1,R24
0158 ; asm("sei");
0158 7894 sei
015A ; return data;
015A L22:
015A .dbline 0 ; func end
015A 0895 ret
.even
015C _Uart1_Init::
015C ; }
015C ; //#pragma used-
015C ;
015C ; void Uart1_Init(void)
015C ; {
015C ; // USART1 initialization
015C ; // Communication Parameters: 8 Data, 1 Stop, No Parity
015C ; // USART1 Receiver: On
015C ; // USART1 Transmitter: On
015C ; // USART1 Mode: Asynchronous
015C ; // USART1 Baud rate: 38400 16M osc
015C ; UCSR1A=0x00;
015C 2224 clr R2
015E 20929B00 sts 155,R2
0162 ; UCSR1B=0xD8;
0162 88ED ldi R24,216
0164 80939A00 sts 154,R24
0168 ; UCSR1C=0x06;
0168 86E0 ldi R24,6
016A 80939D00 sts 157,R24
016E ;
016E ; UBRR1H=0x00;
016E 20929800 sts 152,R2
0172 ; UBRR1L=0x19;
0172 89E1 ldi R24,25
0174 80939900 sts 153,R24
0178 L28:
0178 .dbline 0 ; func end
0178 0895 ret
017A ; pt -> R20,R21
.even
017A _Uart1_SendString::
017A 0E940000 xcall push_gset1
017E A801 movw R20,R16
0180 ; }
0180 ;
0180 ; void Uart1_SendString(INT8U *pt)
0180 ; {
0180 04C0 xjmp L31
0182 L30:
0182 FA01 movw R30,R20
0184 0191 ld R16,Z+
0186 AF01 movw R20,R30
0188 A2DF xcall _putchar1
018A L31:
018A ; while(*pt)
018A FA01 movw R30,R20
018C 2080 ldd R2,z+0
018E 2220 tst R2
0190 C1F7 brne L30
0192 L29:
0192 0E940000 xcall pop_gset1
0196 .dbline 0 ; func end
0196 0895 ret
0198 ; temp2 -> R20
0198 ; temp1 -> R22
0198 ; Hex -> R20
.even
0198 _PUT_INT8U_HexTOString::
0198 0E940000 xcall push_gset2
019C 402F mov R20,R16
019E ; {
019E ; putchar1(*pt++);
019E ; }
019E ; }
019E ;
019E ;
019E ; //格式转换函数,十六进制转换为字符串 eg:输入0x5A,输出5A
019E ; void PUT_INT8U_HexTOString(INT8U Hex)
019E ; {
019E ; INT8U temp1,temp2;
019E ;
019E ; temp1=(Hex>>4)&0x0F;
019E 642F mov R22,R20
01A0 6295 swap R22
01A2 6F70 andi R22,#0x0F
01A4 6F70 andi R22,15
01A6 ; temp2=Hex&0x0F;
01A6 4F70 andi R20,15
01A8 ;
01A8 ; if(temp1<10)
01A8 6A30 cpi R22,10
01AA 20F4 brsh L34
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -