⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soft_uart.lis

📁 一个关于AVR单片机的例程
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 0002            CPHA	=2
 0001            SPR1	=1
 0000            SPR0	=0
 0000           ;
 000C           UDR		=0x0c
 000B           UCSRA	=0x0b
 0007            RXC	=7
 0006            TXC	=6
 0005            UDRE	=5
 0004            FE		=4
 0003            DOR	=3		; original bit name
 0003            OVR	=3		; bit name used in C header
 0002            PE		=2
 0001            U2X	=1
 0000            MPCM	=0
 000A           UCSRB	=0x0a
 0007            RXCIE	=7
 0006            TXCIE	=6
 0005            UDRIE	=5
 0004            RXEN	=4
 0003            TXEN	=3
 0002            UCSZ2	=2
 0001            RXB8	=1
 0000            TXB8	=0
 0009           UBRR	=0x09
 0000           ;
 0008           ACSR	=0x08
 0007            ACD	=7
 0006            ACBG	=6
 0005            ACO 	=5
 0004            ACI 	=4
 0003            ACIE	=3
 0002            ACIC	=2
 0001            ACIS1	=1
 0000            ACIS0	=0
 0000           ;
 0007           ADMUX	=0x07
 0007            REFS1	=7
 0006            REFS0	=6
 0005            ADLAR	=5
 0004            MUX4 	=4
 0003            MUX3	=3
 0002            MUX2	=2
 0001            MUX1	=1
 0000            MUX0	=0
 0006           ADCSRA	=0x06
 0006           ADCSR	=0x06
 0007            ADEN	=7
 0006            ADSC	=6
 0005            ADFR	=5
 0005            ADATE	=5
 0004            ADIF	=4
 0003            ADIE	=3
 0002            ADPS2	=2
 0001            ADPS1	=1
 0000            ADPS0	=0
 0005           ADCH	=0x05
 0004           ADCL	=0x04
 0004           ADC		=0x04	; 16 bit base address
 0000           ;
 0003           TWDR	=0x03
 0002           TWAR	=0x02
 0000            TWGCE 	=0
 0001           TWSR	=0x01
 0001            TWPS1 	=1
 0000            TWPS0 	=0
 0000           TWBR	=0x00
 0000           ;
 0000           ;-------------------------------------------------
 0000           ; fuse and lock bit definitions
 0000           ;
 0000           ;				; lock byte
 0005            BLB12	=5
 0004            BLB12	=4
 0003            BLB02	=3
 0002            BLB01	=2
 0001            LB2	=1
 0000            LB1	=0
 0000           ;
 0000           ;				; fuses high byte
 0007            OCDEN	=7
 0006            JTAGEN	=6
 0005            SPIEN	=5
 0004            CKOPT	=4
 0003            EESAVE	=3
 0002            BOOTSZ1=2
 0001            BOOTSZ0=1
 0000            BOOTRST=0
 0000           ;				; fuses low byte
 0007            BODLEVEL=7
 0006            BODEN	=6
 0005            SUT1	=5
 0004            SUT0	=4
 0003            CKSEL3	=3
 0002            CKSEL2	=2
 0001            CKSEL1	=1
 0000            CKSEL0	=0
 0000           ;
 0000           ;-------------------------------------------------
 0000           ; macros creating int vectors
 0000           ;
 0000           .macro set_vector_table
 0000            .area vector (abs)
 0000            .org   4
 0000             jmp   EXT_INT0
 0000             jmp   EXT_INT1
 0000             jmp   TIM2_COMP
 0000             jmp   TIM2_OVF
 0000             jmp   TIM1_CAPT
 0000             jmp   TIM1_COMPA
 0000             jmp   TIM1_COMPB
 0000             jmp   TIM1_OVF
 0000             jmp   TIM0_OVF
 0000             jmp   SPI_STC
 0000             jmp   USART_RXC
 0000             jmp   USART_UDRE
 0000             jmp   USART_TXC
 0000             jmp   ADC
 0000             jmp   EE_RDY
 0000             jmp   ANA_COMP
 0000             jmp   TWSI
 0000             jmp   EXT_INT2
 0000             jmp   TIM0_COMP
 0000             jmp   SPM_RDY
 0000            .area text
 0000           .macro set_vector_INT0
 0000            .area vector (abs)
 0000            .org   4
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_INT1
 0000            .area vector (abs)
 0000            .org   8
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER2_COMP
 0000            .area vector (abs)
 0000            .org   12
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER2_OVF
 0000            .area vector (abs)
 0000            .org   16
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER1_CAPT
 0000            .area vector (abs)
 0000            .org   20
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER1_COMPA
 0000            .area vector (abs)
 0000            .org   24
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER1_COMPB
 0000            .area vector (abs)
 0000            .org   28
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER1_OVF
 0000            .area vector (abs)
 0000            .org   32
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER0_OVF
 0000            .area vector (abs)
 0000            .org   36
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_SPI_STC
 0000            .area vector (abs)
 0000            .org   40
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_USART_RX
 0000            .area vector (abs)
 0000            .org   44
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_USART_RXC
 0000            .area vector (abs)
 0000            .org   44
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_USART_DRE
 0000            .area vector (abs)
 0000            .org   48
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_USART_UDRE
 0000            .area vector (abs)
 0000            .org   48
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_USART_TX
 0000            .area vector (abs)
 0000            .org   52
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_USART_TXC
 0000            .area vector (abs)
 0000            .org   52
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_ADC
 0000            .area vector (abs)
 0000            .org   56
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_EE_RDY
 0000            .area vector (abs)
 0000            .org   60
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_EE_READY
 0000            .area vector (abs)
 0000            .org   60
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_ANA_COMP
 0000            .area vector (abs)
 0000            .org   64
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_ANALOG_COMP
 0000            .area vector (abs)
 0000            .org   64
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TWI
 0000            .area vector (abs)
 0000            .org   68
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TWSI
 0000            .area vector (abs)
 0000            .org   68
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_INT2
 0000            .area vector (abs)
 0000            .org   72
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_TIMER0_COMP
 0000            .area vector (abs)
 0000            .org   76
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_SPM_RDY
 0000            .area vector (abs)
 0000            .org   80
 0000             jmp   @0
 0000            .area text
 0000           .macro set_vector_SPM_READY
 0000            .area vector (abs)
 0000            .org   80
 0000             jmp   @0
 0000            .area text
 0000           .define bitcnt  R24 
 0000           .define temp    R25
 0000           .define txbyte  R26
 0000           .define rxbyte  R27
 0000           
 0000           ; ****** Customizable settings BEGIN ******
 0000           ;change here if wanted/required !!!
 0000           
 0000           .define out_port  PORTD ;PORTC is used for TxD here
 0000           .define dir       DDRD  ;DDRC is used here
 0000           .define in_port   PIND  ;PINC is used for RxD here 
 0001           TxD = 1	   		  		; Px7 pin is used for sending 
 0000           RxD = 0	   				; Px6 pin is used for receiving 
 0001           sb = 1	   				; 1 stop bit
 708000           FOSC = 7372800 			; Crystal frequency
 2580           BAUD = 9600    		    ; Serial bitrate in bps : 0.0% error
 0000            
 0000           ; ****** Customizable settings END ******
 0000           
 0000           ; The b value corresponds to the table on last page 
 0000           ; of Application Note AVR 305: Software UART
 007C           b = (((FOSC/BAUD)-22)/6) 
 0000           
 0000           ;function to init PORTx and DDRx for sending and receiving
 0000           _init_soft_uart::
 0000           ;for sending
 0000 919A      sbi out_port,TxD ;TxD is high 
 0002 899A      sbi dir,TxD      ;TxD is output
 0004           ;for receiving
 0004 909A      sbi out_port,RxD ;RxD is pull up 
 0006 8898      cbi dir,RxD      ;RxD is input
 0008 0895      ret
 000A           
 000A           ;function to send a byte :first argument is in R16
 000A A02F      _putit::    mov txbyte,R16      ;given char to txbyte
 000C 8AE0                  ldi bitcnt,9+sb         ;1+8+sb (sb is # of stop bits)
 000E A095                  com txbyte              ;inverte everything
 0010 0894                  sec                         ;start bit
 0012           
 0012 10F4      putchar0:       brcc    putchar1        ;if carry set
 0014 9198                          cbi     out_port,TxD;send a '0'
 0016 02C0                          rjmp        putchar2        ;else   
 0018           
 0018 919A      putchar1:       sbi     out_port,TxD    ;send a '1'
 001A 0000                          nop
 001C           
 001C 05D0      putchar2:       rcall UART_delay        ;one bit delay
 001E 04D0                          rcall UART_delay
 0020           
 0020 A695                          lsr  txbyte             ;get next bit
 0022 8A95                          dec  bitcnt             ;if not all bit sent
 0024 B1F7                          brne        putchar0    ;send next
 0026                                                               ;else
 0026 0895                          ret                         ;done return
 0028                                   
 0028           ;function for delay
 0028 9CE7      UART_delay:         ldi temp,b
 002A 9A95      UART_delay1:    dec     temp
 002C F1F7                              brne    UART_delay1
 002E 0895                              ret
 0030           ;
 0030           
 0030           ;function to receive a byte and return in R16
 0030           _getit::
 0030 89E0                          ldi         bitcnt,9        ;8 data bit + 1 stop bit
 0032           
 0032 8099      getchar1:       sbic    in_port,RxD     ;wait for start bit
 0034 FECF                          rjmp        getchar1
 0036 F8DF                      rcall UART_delay        ;0.5 bit delay
 0038           
 0038 F7DF      getchar2:       rcall UART_delay        ;1 bit delay
 003A F6DF                          rcall UART_delay            
 003C           
 003C 8894                          clc                         ;clear carry
 003E 8099                          sbic        in_port,RxD     ;if RX pin high
 0040 0894                          sec                         ;set carry flag in SREG
 0042           
 0042 8A95                          dec         bitcnt          ;if bit is stop bit
 0044 11F0                          breq        getchar3        ;return
 0046                                                   ;else
 0046 B795                          ror         rxbyte          ;shift bit into rxbyte
 0048 F7CF                          rjmp        getchar2        ;go get next
 004A           
 004A 0B2F      getchar3:       mov R16,rxbyte      ;move rxbyte to R16
 004C 0895                  ret                             ;return from function call            
 004E           
 004E            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -