亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? avr304.asm

?? 該應(yīng)用軟件可以實現(xiàn)大多數(shù)單片機的仿真實驗
?? ASM
字號:
;**** A P P L I C A T I O N   N O T E   A V R 3 0 4 ************************
;*
;* Title:		Half Duplex Interrupt Driven Software UART 
;* Version:		1.0
;* Last updated:	97.07.18
;* Target:		AT90Sxxxx (All AVR Devices)
;*
;* Support E-mail:	avr@atmel.com
;*
;* Code Size		:72 words
;* Low Register Usage	:2
;* High Register Usage	:5
;* Interrupt Usage	:External Interrupt,
;*			 Timer/Counter0 overflow interrupt
;*
;* DESCRIPTION
;*
;* This application note describes how to make a half duplex software UART
;* on any AVR device with the 8-bit Timer/Counter0 and External Interrupt.
;* As a lot of control applications communicate in one direction at a time
;* only, a half duplex UART will limit the usage of MCU resources.
;*
;* The constants N and R determine the data rate. R selects clock frequency
;* as described in the T/C Prescaler in the AVR databook. If the T/C pre-
;* scaling factor is denoted C, the following expression yields the data rate:
;*
;*		 XTAL
;*	 BAUD = ------		min. N*C = 17
;*		 N*C		max. N   = 170
;*
;* Absolute minimum value for N*C is 17 (which causes the interrupt flag to be 
;* set again before the interrupt is finished). Absolute maximum is 170.
;* (Caused by the 1.5bit-lenght that is necessary to receive bits correctly.)
;*
;* The UART uses PD2 as receive pin because it utilizes the external interrupt.
;* The transmit-pin is PD4 in this example, but it can be any other pins.
;*
;* Since the UART is half duplex, it can either send or recieve data. It can't
;* do both simoutaneausly. When idle it will automatically recieve incoming
;* data, but if it is transmitting data while incoming data arrives, it will
;* ignore it. Also, if u_transmit is called without waiting for the 'READY' bit
;* in the 'u_status' register to become cleared, it will abort any pending 
;* reception or transmittal.
;*
;*
;* *** Initialization
;*
;*  1. Call uart_init
;*  2. Enable global interrupts (with 'sei')
;*
;* *** Receive
;*
;*  1. Wait until RDR in 'u_status' becomes set
;*  2. Read 'u_buffer'
;*
;* *** Transmit
;*
;* (0. Initialize the UART by executing uart_init and sei)
;*  1. Wait until READY in 'u_status' becomes clear
;*  2. Set 'u_buffer'
;*  3. Call 'u_transmit'
;*
;**************************************************************************

.include "1200def.inc"

;***** BAUD-rate settings

				;BAUD-RATES @1MHz XTAL AND R=1
;.equ	N=104			; 9600
;.equ	N=52			;19200 
.equ	N=26			;38400
.equ	C=1			;Divisor
.equ	R=1			;R=1 when C=1


;***** UART Global Registers

.def	u_buffer	=r14	;Serial buffer
.def	u_sr		=r15	;Status-register storage
.def	u_tmp		=r16	;Scratchregister
.def	u_bit_cnt	=r17	;Bit counter
.def	u_status	=r18	;Status buffer
.def	u_reload	=r19	;Reload-register (internal - do not use)
.def	u_transmit	=r20	;Data to transmit


;***** Bit positions in the Status-register

.equ	RDR=0			;Receive data ready bit
.equ	TD=6			;Transmitting data (internal - read-only)
.equ	BUSY=7			;Busy-flag (internal - read-only)


;**************************************************************************
;*
;*	PROGRAM START - EXECUTION STARTS HERE
;*
;**************************************************************************
	.cseg

	.org $0000
	rjmp	start			;Reset handler

	.org INT0addr
	rjmp	ext_int0		;External interrupt handler

	.org OVF0addr
	rjmp	tim0_ovf		;Timer0 overflow handler

	.org ACIaddr
	reti				;Analog comparator handler (Not Used)



;**************************************************************************
;*
;* EXT_INT0 - External Interrupt Routine 0
;*
;*
;* DESCRIPTION
;* This routine is executed when a negative edge on the incoming serial
;* signal is detected. It disables further external interrupts and enables
;* timer interrupts (bit-timer) because the UART must now receive the
;* incoming data. 
;*
;* This routine sets bits in the GIMSK, TIFR and TIMSK registers. In this
;* code when the bits are set, it overwrites all other bits. This is done
;* because of the lack of available cycles when it operates at low clock
;* rate and high baudrates.
;*
;*
;* Total number of words	: 12
;* Total number of cycles	: 15 (incl. reti)
;* Low register usage		: 1 (u_sr)
;* High register usage		: 4 (u_bit_cnt,u_tmp,u_status,u_reload)
;*
;**************************************************************************
ext_int0:
	in	u_sr,SREG		;Store Status Register

	ldi	u_status,1<<BUSY	;Set busy-flag (clear all others)

	ldi	u_tmp,(256-(N+N/2)+(29/C));Set timer reload-value (to 1.5
	out	TCNT0,u_tmp		;  bit len). 29 = time delay that
					;  have already been used in this
					;  interrupt plus the time
					;  that will be used by the time
					;  delay between timer interrupt request
					;  and the actual sampling of the first
					;  data bit.

	ldi	u_tmp,1<<TOIE0		;Set bit 1 in u_tmp
	out	TIFR,u_tmp		;   to clear T/C0 overflow flag
	out	TIMSK,u_tmp		;   and enable T/C0 overflow interrupt

	clr	u_bit_cnt		;Clear bit counter
	out	GIMSK,u_bit_cnt		;Disable external interrupt

	ldi	u_reload,(256-N+(8/C))	;Set reload-value (constant).

	out	SREG,u_sr		;Restore SREG
	reti


;**************************************************************************
;*
;* TIM0_OVF - Timer/Counter 0 Overflow Interrupt
;*
;*
;* DESCRIPTION
;* This routine coordinates the transmition and reception of bits. This 
;* routine is automatically executed at a rate equal to the baud-rate. When
;* transmitting, this routine shifts the bits and sends it. When receiving,
;* it samples the bit and shifts it into the buffer.
;*
;* The serial routines uses a status register (u_status): READ-ONLY.
;*		BUSY	This bit indicates whenever the UART is busy
;*		TD	Transmit Data. Set when the UART is transmitting
;*		RDR	Receive Data Ready. Set when new data has arrived
;*			and it is ready for reading.
;*
;* When the RDR flag is set, the (new) data can be read from u_buffer.
;*
;* This routine also sets bits in TIMSK and TIMSK. See ext_int0 description
;*
;* 
;* Total number of words	: 35
;* Total number of cycles	: min. 18, max. 28 - depending on if it is
;*				  receiving or transmitting, what bit is
;*				  pending, etc.
;* Low register usage		: 2 (u_sr,u_buffer)
;* High register usage		: 4 (u_bit_cnt,u_tmp,u_status,u_reload)
;* 
;**************************************************************************
tim0_ovf:
	in	u_sr,SREG		;Store statusregister

	out	TCNT0,u_reload		;Reload timer

	inc	u_bit_cnt		;Increment bit_counter
	sbrs	u_status,TD		;if transmit-bit set
	rjmp	tim0_receive		;    goto receive

	sbrc	u_bit_cnt,3		;if bit 3 in u_bit_cnt (>7) is set
	rjmp	tim0_stopb		;    jump to stop-bit-part

	sbrc	u_buffer,0		;if LSB in buffer is 1
	sbi	PORTD,PD4		;    Set transmit to 1
	sbrs	u_buffer,0		;if LSB in buffer is 0
	cbi	PORTD,PD4		;    Set transmit to 0
	lsr	u_buffer		;Shift buffer right
	
	out	SREG,u_sr		;Restore SREG
	reti

tim0_stopb:
	sbi	PORTD,PD4		;Generate stop-bit

	sbrs	u_bit_cnt,0		;if u_bit_cnt==8 (stop-bit)
	rjmp	tim0_ret		;      jump to exit

tim0_complete:
	ldi	u_tmp,1<<INT0		;(u_bit_cnt==9):
	out	GIMSK,u_tmp		;Enable external interrupt
	clr	u_tmp 
	out	TIMSK,u_tmp		    ;Disable timer interrupt
	cbr	u_status,(1<<BUSY)|(1<<TD)  ;Clear busy-flag and transmit-flag

tim0_ret:
	out	SREG,u_sr		;Restore status register
	reti

tim0_receive:
	sec				;Set carry
	sbis	PIND,2			;if PD2=LOW         <=== SAMPLE HERE
	clc				;    clear carry
	ror	u_buffer		;Shift carry into data
	in	u_tmp,SREG		;Store SREG

	cpi	u_bit_cnt,9		;if u_bit_cnt!=9 (must sample stop-bit)
	brne	tim0_ret		;   exit interrupt

	out	SREG,u_tmp		;Get old SREG
	rol	u_buffer		;Rotate back data (to get rid of the stop-bit)

	sbr	u_status,1<<RDR		;Clear busy-flag
	rjmp	tim0_complete



;**************************************************************************
;*
;* uart_init - Subroutine for UART initialization
;*
;*
;* DESCRIPTION
;* This routine initializes the UART. It sets the timer and enables the
;* external interrupt (receiving). To enable the UART the global interrupt
;* flag must be set (with SEI).
;*
;*
;* Total number of words	: 8
;* Total number of cycles	: 11 (including the RET instructions)
;* Low register usage		: None
;* High register usage		: 2 (u_tmp,u_status)
;* 
;**************************************************************************
uart_init:	
	ldi	u_tmp,R
	out	TCCR0,u_tmp		;Start timer and set clock source
	ldi	u_tmp,1<<INT0
	out	GIMSK,u_tmp		;Enable external interrupt 0
	in	u_tmp,1<<ISC01
	out	MCUCR,u_tmp		;On falling edges
	clr	u_status		;Erase status-byte
	ret



;**************************************************************************
;*
;* uart_transmit - Subroutine for UART transmittal
;*
;*
;* DESCRIPTION
;* This routine initialize the UART to transmit data. The data to be sent
;* must be located in u_transmit. 
;*
;* Warning: This routine cancels all other transmittions or receptions.
;* So be careful. If a byte is being received and the timer interrupt is
;* currently running, the tranmittion may be corrupted. By checking the
;* READY-bit and/or TD-bit in the u_status register for safe transmissions.
;*
;* This routine also sets bits in TIMSK and TIMSK. See ext_int0 description
;*
;*
;* Total number of words	: 13
;* Total number of cycles	: 17 (including RET)
;* Low register usage		: 1 (u_buffer)
;* High register usage		: 4 (u_bit_cnt,u_tmp,u_transmit,u_reload)
;* 
;**************************************************************************
uart_transmit:
	ldi	u_status,(1<<BUSY)|(1<<TD)   ;Set only busy- and transmit flag

	clr	u_tmp
	out	GIMSK,u_tmp		;Disable external interrupt

	ser	u_bit_cnt		;Erase bit-counter (set all bits)
	mov	u_buffer,u_transmit	;Copy transmit-data to buffer

	ldi	u_tmp,1<<TOIE0		;Set bit 1 in u_tmp
	out	TIFR,u_tmp		;  to clear T/C0 overflow flag
	out	TIMSK,u_tmp		;  and enable T/C0 overflow interrupt
	
	ldi	u_reload,(256-N+(8/C))	;Set reload-value
	ldi	u_tmp,(256-N+(14/C))	;Set timer delay to first bit
	out	TCNT0,u_tmp		;Set timer reload-value (1 bit)

	cbi	PORTD,PD4		;Clear output (start-bit)
	ret



;**************************************************************************
;*
;*	Test/Example Program
;*
;* This example program can be used for evaluation of the UART agains a PC
;* running a terminal emulator. If a key is pressed on the PC keyboard, the
;* message 'You typed <characher>' is sent back. The character is also
;* presented on port B.
;*
;**************************************************************************

.def	tmp=r21				;Temp. register
.def	buffer=r22			;Recieved byte
.def	adr=r23				;EEPROM Address

start:	ser	tmp			;Initialize
	out	PORTD,tmp		;Set port D as input with pullups
	sbi	DDRD,DDD4		;    except PD4 -> output with 1's
	out	DDRB,tmp		;Set port B as output with 1's (LED-off)
	out	PORTB,tmp

	rcall	uart_init		;Init UART
	sei				;Enable interrupts

idle:	sbrs	u_status,RDR		;Wait for Character
	rjmp	idle
	mov	buffer,u_buffer		;Get recieved character
	out	PORTB,u_buffer		;Output the byte on port B
	ldi	adr,example_data	;Set/Restore pointer to EEPROM data

loop:	out	EEAR,adr		;Set the EEPROM's address
	sbi	EECR,EERE		;Send the Read strobe
	in	u_transmit,EEDR		;Put the data in the transmit register
	rcall	uart_transmit		;And transmit the data

wait:	sbrc	u_status,TD		;Wait until data is sent
	rjmp	wait

	inc	adr			;Increase pointer
	cpi	adr,example_data+12	;Reached byte 12? (End?)
	breq	idle			;    Yes, wait for new char.

	cpi	adr,example_data+10	;Reached byte 10?
	brne	loop			;    No, jump back

	mov	u_transmit,buffer	;Put data in transmit register
	rcall	uart_transmit		;And transmit it

wait2:	sbrc	u_status,TD		;Wait until data is sent
	rjmp	wait2

	rjmp	loop			;Continue sendig chars


;**************************************************************************
;*
;*	Test/Example program data.
;*
;* This is the data that will be sent back when a character is recieved.
;*
;**************************************************************************
	.eseg
example_data:
	.db	89	;'Y'
	.db	111	;'o'
	.db	117	;'u'
	.db	32	;' '
	.db	116	;'t'
	.db	121	;'y'
	.db	112	;'p'
	.db	101	;'e'
	.db	100	;'d'
	.db	32	;' '
	.db	13	;<CR>
	.db	10	;<LF>

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av在线播放成人| 丰满白嫩尤物一区二区| 一二三四区精品视频| 一区二区三区四区乱视频| 一区二区三区国产精华| 捆绑紧缚一区二区三区视频| 成人一区二区三区| 7777女厕盗摄久久久| 日韩你懂的在线观看| 一区二区三区产品免费精品久久75| 亚洲精品高清在线| 国产精品资源在线看| 欧美亚洲禁片免费| 国产精品理论片| 亚洲欧洲制服丝袜| 美美哒免费高清在线观看视频一区二区 | 九色综合国产一区二区三区| 成人动漫精品一区二区| 欧美一级久久久久久久大片| 亚洲人午夜精品天堂一二香蕉| 日韩高清在线电影| 欧美精品日日鲁夜夜添| 亚洲欧美激情在线| 色婷婷综合久久久久中文一区二区 | 日韩欧美你懂的| 国产一区二区三区黄视频| 日韩国产欧美在线视频| 精品制服美女丁香| 久久久国际精品| 5858s免费视频成人| 国产精品一区二区你懂的| 色天天综合色天天久久| 国产精品蜜臀av| 国内精品免费在线观看| 欧美一区二区日韩| 亚洲三级在线免费| 成人免费黄色在线| 久久久99精品久久| 国产一区二区三区日韩| 欧美电视剧在线看免费| 91老师国产黑色丝袜在线| 国产精品丝袜在线| 91精品国产综合久久福利| 国产精品99久久久| 另类人妖一区二区av| 中文字幕国产一区| 欧美色倩网站大全免费| 久久99国产乱子伦精品免费| 久久久久久久久久久99999| proumb性欧美在线观看| 性做久久久久久免费观看| 国产午夜精品一区二区三区四区 | 欧美亚日韩国产aⅴ精品中极品| 日韩不卡在线观看日韩不卡视频| 国产精品久久久久影院| 国产亚洲污的网站| 亚洲一区二区中文在线| 亚洲精选视频在线| 美腿丝袜亚洲三区| 91丨九色丨国产丨porny| 欧美另类videos死尸| av一二三不卡影片| 99久久久久久| 欧美日韩一区三区四区| 欧美少妇性性性| 欧美男男青年gay1069videost | 亚洲国产日韩精品| 一区二区成人在线视频| 亚洲午夜私人影院| 性做久久久久久免费观看| 三级在线观看一区二区| 亚洲电影一级片| 国产盗摄一区二区三区| 久久99精品久久久久久| 国产乱子轮精品视频| 成人三级伦理片| 欧美精品日日鲁夜夜添| 国产婷婷一区二区| 一区二区三区在线观看欧美| 麻豆91精品视频| 国产成人超碰人人澡人人澡| 91丝袜美腿高跟国产极品老师| 色国产综合视频| 26uuu国产电影一区二区| 中文天堂在线一区| 日本免费新一区视频| av电影天堂一区二区在线| 91精品国产日韩91久久久久久| 日本一区二区三区四区| 久久精工是国产品牌吗| 91精品国产综合久久久久久久久久 | 色哟哟欧美精品| 一区在线中文字幕| 欧美中文字幕亚洲一区二区va在线| 国产精品欧美一区喷水| 日韩高清欧美激情| 91美女片黄在线| 久久免费电影网| 日本免费在线视频不卡一不卡二| 成人丝袜视频网| 国产亚洲美州欧州综合国| 日韩专区在线视频| 精品美女被调教视频大全网站| 亚洲成人自拍网| 欧美三级午夜理伦三级中视频| 亚洲一级电影视频| 欧美日韩精品电影| 久久精品av麻豆的观看方式| 精品裸体舞一区二区三区| 国产91精品免费| 中文在线资源观看网站视频免费不卡 | 99精品久久99久久久久| 国产精品色呦呦| 欧美女孩性生活视频| 狠狠色丁香婷婷综合| 亚洲天堂av一区| 制服丝袜成人动漫| 精品在线播放午夜| 亚洲夂夂婷婷色拍ww47| 欧美成人午夜电影| 色就色 综合激情| 国产精品69久久久久水密桃| 一区二区三区久久久| 久久嫩草精品久久久精品一| 成人激情小说网站| 免费在线看成人av| 亚洲人xxxx| 国产精品三级av在线播放| 日韩一卡二卡三卡国产欧美| 91在线视频播放| 北条麻妃国产九九精品视频| 天天做天天摸天天爽国产一区| 国产女主播视频一区二区| 欧美老年两性高潮| 在线观看www91| 一本一道波多野结衣一区二区| 久久精品国产一区二区三| 亚洲风情在线资源站| 亚洲人成人一区二区在线观看| 久久新电视剧免费观看| 日韩一区二区免费高清| 欧美精品第1页| 91精品国产综合久久精品| 3751色影院一区二区三区| 欧美天天综合网| 欧美日韩夫妻久久| 欧美一区二区日韩| 久久久亚洲午夜电影| 综合色中文字幕| 日本午夜精品视频在线观看| 美日韩一区二区三区| 国产美女精品一区二区三区| 玖玖九九国产精品| 国产成人在线电影| 99精品久久免费看蜜臀剧情介绍| 99久久国产免费看| 777午夜精品视频在线播放| 日韩亚洲国产中文字幕欧美| 久久一区二区视频| 亚洲精品视频免费看| 免费不卡在线视频| 91麻豆福利精品推荐| 欧美一区二区三区精品| 日韩毛片一二三区| 理论电影国产精品| 色88888久久久久久影院野外| 日韩视频一区在线观看| 一区二区三区国产豹纹内裤在线| 极品美女销魂一区二区三区免费| 91色.com| 亚洲丝袜美腿综合| 成人的网站免费观看| 日韩欧美国产精品| 婷婷中文字幕一区三区| 日本精品一区二区三区高清 | 国产精品国产三级国产有无不卡| 亚洲一区二区三区不卡国产欧美| 国产精品亚洲专一区二区三区| 色综合久久六月婷婷中文字幕| 久久久精品免费免费| 韩国精品主播一区二区在线观看| 欧美日韩久久久一区| 亚洲午夜精品17c| 欧美午夜一区二区三区| 亚洲欧美一区二区不卡| 欧美色综合网站| 亚欧色一区w666天堂| 欧美一区二区三区播放老司机| 日韩精品欧美精品| 欧美电视剧免费全集观看| 另类小说一区二区三区| 久久精品一区二区| 91小视频免费观看| 亚洲精品第1页| 欧美一区二区三区系列电影| 蜜臂av日日欢夜夜爽一区| 国产视频亚洲色图| 一本大道久久a久久精二百| 亚洲一区二区三区在线| 欧美一二区视频|