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

📄 soft_uart.s

📁 一个关于AVR单片机的例程
💻 S
字号:
;+++ Software Uart according to Atmel +++
;+++ application note AVR 305         +++
;+++ Adapted for Imagecraft ICCAVR    +++

.area text

;include correct file here ................................ 
.include "aiom16.s"  ;see path磗,same directory as *.h !!!
;..........................................................

;volatile registers (not needed to restore)						   
.define bitcnt  R24 
.define temp    R25
.define txbyte  R26
.define rxbyte  R27

; ****** Customizable settings BEGIN ******
;change here if wanted/required !!!

.define out_port  PORTD ;PORTD is used for TxD here
.define dir       DDRD  ;DDRD is used here
.define in_port   PIND  ;PIND is used for RxD here 
TxD = 1	   		  		; Px1 pin is used for sending 
RxD = 0	   				; Px0 pin is used for receiving 
sb = 1	   				; 1 stop bit
FOSC = 7372800 			; Crystal frequency
BAUD = 9600    		    ; Serial bitrate in bps : 0.0% error
 
; ****** Customizable settings END ******

; The b value corresponds to the table on last page 
; of Application Note AVR 305: Software UART
b = (((FOSC/BAUD)-22)/6) 

;function to init PORTx and DDRx for sending and receiving
_init_soft_uart::
;for sending
sbi out_port,TxD ;TxD is high 
sbi dir,TxD      ;TxD is output
;for receiving
sbi out_port,RxD ;RxD is pull up 
cbi dir,RxD      ;RxD is input
ret

;function to send a byte :first argument is in R16
_putit::    mov	txbyte,R16  	;given char to txbyte
            ldi	bitcnt,9+sb	    ;1+8+sb (sb is # of stop bits)
            com	txbyte		    ;inverte everything
            sec			        ;start bit

putchar0:	brcc	putchar1	;if carry set
		    cbi	    out_port,TxD;send a '0'
		    rjmp	putchar2	;else	

putchar1:	sbi	out_port,TxD	;send a '1'
		    nop

putchar2:	rcall UART_delay	;one bit delay
		    rcall UART_delay

		    lsr  txbyte		    ;get next bit
		    dec	 bitcnt		    ;if not all bit sent
		    brne	putchar0    ;send next
					            ;else
		    ret			        ;done return
			
;function for delay
UART_delay:	    ldi	temp,b
UART_delay1:	dec	temp
		        brne	UART_delay1
		        ret
;

;function to receive a byte and return in R16
_getit::
		    ldi 	bitcnt,9	;8 data bit + 1 stop bit

getchar1:	sbic 	in_port,RxD	;wait for start bit
		    rjmp 	getchar1
    		rcall UART_delay	;0.5 bit delay

getchar2:	rcall UART_delay	;1 bit delay
		    rcall UART_delay		

		    clc			        ;clear carry
		    sbic 	in_port,RxD	;if RX pin high
		    sec			        ;set carry flag in SREG

		    dec 	bitcnt		;if bit is stop bit
		    breq 	getchar3	;return
					;else
		    ror 	rxbyte		;shift bit into rxbyte
		    rjmp 	getchar2	;go get next

getchar3:	mov R16,rxbyte      ;move rxbyte to R16
            ret				    ;return from function call		  

 

⌨️ 快捷键说明

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