📄 uart.lis
字号:
00D0 .dbline 70
00D0 ; }
00D0 .dbline 71
00D0 ; }
00D0 03C0 rjmp L8
00D2 L7:
00D2 .dbline 72
00D2 ; else rx_error0 = 1 ;
00D2 81E0 ldi R24,1
00D4 80930C00 sts _rx_error0,R24
00D8 L8:
00D8 .dbline -2
00D8 L6:
00D8 .dbline 0 ; func end
00D8 4991 ld R20,y+
00DA A990 ld R10,y+
00DC 0990 ld R0,y+
00DE 0FBE out 0x3f,R0
00E0 F991 ld R31,y+
00E2 E991 ld R30,y+
00E4 B991 ld R27,y+
00E6 A991 ld R26,y+
00E8 9991 ld R25,y+
00EA 8991 ld R24,y+
00EC 4991 ld R20,y+
00EE 3991 ld R19,y+
00F0 2991 ld R18,y+
00F2 1991 ld R17,y+
00F4 0991 ld R16,y+
00F6 A990 ld R10,y+
00F8 9990 ld R9,y+
00FA 8990 ld R8,y+
00FC 7990 ld R7,y+
00FE 6990 ld R6,y+
0100 5990 ld R5,y+
0102 4990 ld R4,y+
0104 3990 ld R3,y+
0106 2990 ld R2,y+
0108 1990 ld R1,y+
010A 0990 ld R0,y+
010C 1895 reti
010E .dbsym r data 10 c
010E .dbsym r status 20 c
010E .dbend
010E .dbfunc e getchar _getchar fc
010E ; data -> R16
010E ; IisOn -> R18
.even
010E _getchar::
010E .dbline -1
010E .dbline 79
010E ; }
010E ;
010E ;
010E ;
010E ; // Get a character from the USART0 Receiver buffer
010E ; char getchar(void)
010E ; {
010E .dbline 81
010E ; char data;
010E ; char IisOn = 1;
010E 21E0 ldi R18,1
0110 .dbline 82
0110 ; if((SREG & 0x80) == 0x00) //I之前是否置位
0110 2FB6 in R2,0x3f
0112 27FC sbrc R2,7
0114 01C0 rjmp L19
0116 X6:
0116 .dbline 83
0116 ; IisOn = 0;
0116 2227 clr R18
0118 L18:
0118 .dbline 85
0118 ;
0118 ; while (rx_counter0==0);
0118 L19:
0118 .dbline 85
0118 20900D00 lds R2,_rx_counter0
011C 2220 tst R2
011E E1F3 breq L18
0120 X7:
0120 .dbline 86
0120 ; data=rx_buffer0[rx_rd_index0];
0120 80E0 ldi R24,<_rx_buffer0
0122 90E0 ldi R25,>_rx_buffer0
0124 E0910E00 lds R30,_rx_rd_index0
0128 FF27 clr R31
012A E80F add R30,R24
012C F91F adc R31,R25
012E 0081 ldd R16,z+0
0130 .dbline 87
0130 ; if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
0130 80910E00 lds R24,_rx_rd_index0
0134 8F5F subi R24,255 ; addi 1
0136 282E mov R2,R24
0138 20920E00 sts _rx_rd_index0,R2
013C 8830 cpi R24,8
013E 19F4 brne L21
0140 X8:
0140 .dbline 87
0140 2224 clr R2
0142 20920E00 sts _rx_rd_index0,R2
0146 L21:
0146 .dbline 88
0146 ; CLI();
0146 F894 cli
0148 .dbline 89
0148 ; --rx_counter0;
0148 80910D00 lds R24,_rx_counter0
014C 8150 subi R24,1
014E 80930D00 sts _rx_counter0,R24
0152 .dbline 90
0152 ; if(IisOn)
0152 2223 tst R18
0154 09F0 breq L23
0156 X9:
0156 .dbline 91
0156 ; SEI();
0156 7894 sei
0158 L23:
0158 .dbline 92
0158 ; return data;
0158 .dbline -2
0158 L15:
0158 .dbline 0 ; func end
0158 0895 ret
015A .dbsym r data 16 c
015A .dbsym r IisOn 18 c
015A .dbend
.area vector(rom, abs)
.org 40
0028 ADC0 rjmp _uart0_tx_isr
.area text(rom, con, rel)
015A .dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
015A .dbfunc e uart0_tx_isr _uart0_tx_isr fV
.even
015A _uart0_tx_isr::
015A 2A92 st -y,R2
015C 8A93 st -y,R24
015E 9A93 st -y,R25
0160 EA93 st -y,R30
0162 FA93 st -y,R31
0164 2FB6 in R2,0x3f
0166 2A92 st -y,R2
0168 .dbline -1
0168 .dbline 101
0168 ; }
0168 ;
0168 ;
0168 ;
0168 ;
0168 ; // USART0 Transmitter interrupt service routine
0168 ; #pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
0168 ; void uart0_tx_isr(void)
0168 ; {
0168 .dbline 102
0168 ; if (tx_counter0)
0168 20900000 lds R2,_tx_counter0
016C 2220 tst R2
016E D1F0 breq L26
0170 X10:
0170 .dbline 103
0170 ; {
0170 .dbline 104
0170 ; --tx_counter0;
0170 80910000 lds R24,_tx_counter0
0174 8150 subi R24,1
0176 80930000 sts _tx_counter0,R24
017A .dbline 105
017A ; UDR0=tx_buffer0[tx_rd_index0];
017A 80E0 ldi R24,<_tx_buffer0
017C 90E0 ldi R25,>_tx_buffer0
017E E0910100 lds R30,_tx_rd_index0
0182 FF27 clr R31
0184 E80F add R30,R24
0186 F91F adc R31,R25
0188 2080 ldd R2,z+0
018A 2092C600 sts 198,R2
018E .dbline 106
018E ; if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
018E 80910100 lds R24,_tx_rd_index0
0192 8F5F subi R24,255 ; addi 1
0194 282E mov R2,R24
0196 20920100 sts _tx_rd_index0,R2
019A 8830 cpi R24,8
019C 19F4 brne L28
019E X11:
019E .dbline 106
019E 2224 clr R2
01A0 20920100 sts _tx_rd_index0,R2
01A4 L28:
01A4 .dbline 107
01A4 ; };
01A4 L26:
01A4 .dbline 107
01A4 .dbline -2
01A4 L25:
01A4 .dbline 0 ; func end
01A4 2990 ld R2,y+
01A6 2FBE out 0x3f,R2
01A8 F991 ld R31,y+
01AA E991 ld R30,y+
01AC 9991 ld R25,y+
01AE 8991 ld R24,y+
01B0 2990 ld R2,y+
01B2 1895 reti
01B4 .dbend
01B4 .dbfunc e putchar _putchar fV
01B4 ; IisOn -> R20
01B4 ; c -> R16
.even
01B4 _putchar::
01B4 4A93 st -y,R20
01B6 .dbline -1
01B6 .dbline 114
01B6 ; }
01B6 ;
01B6 ;
01B6 ;
01B6 ; // Write a character to the USART0 Transmitter buffer
01B6 ; void putchar(char c)
01B6 ; {
01B6 .dbline 115
01B6 ; char IisOn = 1;
01B6 41E0 ldi R20,1
01B8 .dbline 116
01B8 ; if((SREG & 0x80) == 0x00) //I之前是否置位
01B8 2FB6 in R2,0x3f
01BA 27FC sbrc R2,7
01BC 01C0 rjmp L34
01BE X12:
01BE .dbline 117
01BE ; IisOn = 0;
01BE 4427 clr R20
01C0 L33:
01C0 .dbline 118
01C0 ; while (tx_counter0 == TX_BUFFER_SIZE0);
01C0 L34:
01C0 .dbline 118
01C0 80910000 lds R24,_tx_counter0
01C4 8830 cpi R24,8
01C6 E1F3 breq L33
01C8 X13:
01C8 .dbline 119
01C8 ; CLI();
01C8 F894 cli
01CA .dbline 120
01CA ; if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
01CA 20900000 lds R2,_tx_counter0
01CE 2220 tst R2
01D0 21F4 brne L38
01D2 X14:
01D2 2090C000 lds R2,192
01D6 25FC sbrc R2,5
01D8 19C0 rjmp L36
01DA X15:
01DA L38:
01DA .dbline 121
01DA ; {
01DA .dbline 122
01DA ; tx_buffer0[tx_wr_index0]=c;
01DA 80E0 ldi R24,<_tx_buffer0
01DC 90E0 ldi R25,>_tx_buffer0
01DE E0910200 lds R30,_tx_wr_index0
01E2 FF27 clr R31
01E4 E80F add R30,R24
01E6 F91F adc R31,R25
01E8 0083 std z+0,R16
01EA .dbline 123
01EA ; if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
01EA 80910200 lds R24,_tx_wr_index0
01EE 8F5F subi R24,255 ; addi 1
01F0 282E mov R2,R24
01F2 20920200 sts _tx_wr_index0,R2
01F6 8830 cpi R24,8
01F8 19F4 brne L39
01FA X16:
01FA .dbline 123
01FA 2224 clr R2
01FC 20920200 sts _tx_wr_index0,R2
0200 L39:
0200 .dbline 124
0200 ; ++tx_counter0;
0200 80910000 lds R24,_tx_counter0
0204 8F5F subi R24,255 ; addi 1
0206 80930000 sts _tx_counter0,R24
020A .dbline 125
020A ; }
020A 02C0 rjmp L37
020C L36:
020C .dbline 127
020C ; else
020C ; UDR0=c;
020C 0093C600 sts 198,R16
0210 L37:
0210 .dbline 128
0210 ; if(IisOn)
0210 4423 tst R20
0212 09F0 breq L41
0214 X17:
0214 .dbline 129
0214 ; SEI();
0214 7894 sei
0216 L41:
0216 .dbline -2
0216 L30:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -