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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uartsw128.c

?? avr應用測試程序
?? C
字號:
/*! \file uartsw2.c \brief Interrupt-driven Software UART Driver. */
//*****************************************************************************
//
// File Name	: 'uartsw2.c'
// Title		: Interrupt-driven Software UART Driver
// Author		: Pascal Stang - Copyright (C) 2002-2004
// Created		: 7/20/2002
// Revised		: 4/27/2004
// Version		: 0.6
// Target MCU	: Atmel AVR Series (intended for the ATmega16 and ATmega32)
// Editor Tabs	: 4
//
// This code is distributed under the GNU Public License
//		which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>

#include "global.h"
#include "timer128.h"
#include "uartsw128.h"

// Program ROM constants

// Global variables

// uartsw transmit status and data variables
static volatile u08 UartswTxBusy;
static volatile u08 UartswTxData;
static volatile u08 UartswTxBitNum;

// baud rate common to transmit and receive
static volatile u08 UartswBaudRateDiv;

// uartsw receive status and data variables
static volatile u08 UartswRxBusy;
static volatile u08 UartswRxData;
static volatile u08 UartswRxBitNum;
// receive buffer
static cBuffer uartswRxBuffer;               ///< uartsw receive buffer
// automatically allocate space in ram for each buffer
static char uartswRxData[UARTSW_RX_BUFFER_SIZE];

// functions

//! enable and initialize the software uart
void uartswInit(void)
{
    // initialize the buffers
	uartswInitBuffers();
	// initialize the ports
	sbi(UARTSW_TX_DDR, UARTSW_TX_PIN);
	cbi(UARTSW_RX_DDR, UARTSW_RX_PIN);
	cbi(UARTSW_RX_PORT, UARTSW_RX_PIN);
	// initialize baud rate
	uartswSetBaudRate(9600);
	
	// setup the transmitter
	UartswTxBusy = FALSE;
	// disable OC2 interrupt
	cbi(TIMSK, OCIE2);
	// attach TxBit service routine to OC2
	timerAttach(TIMER2OUTCOMPARE_INT, uartswTxBitService);
		
	// setup the receiver
	UartswRxBusy = FALSE;
	// disable OC0 interrupt
	cbi(TIMSK, OCIE0);
	// attach RxBit service routine to OC0
	timerAttach(TIMER0OUTCOMPARE_INT, uartswRxBitService);
	// INT2 trigger on rising edge
	sbi(EICRA, ISC20);
	// enable INT2 interrupt
	sbi(EIMSK, INT2);

	// turn on interrupts
	sei();
}

//! create and initialize the uart buffers
void uartswInitBuffers(void)
{
	// initialize the UART receive buffer
	bufferInit(&uartswRxBuffer, uartswRxData, UARTSW_RX_BUFFER_SIZE);
}

//! turns off software UART
void uartswOff(void)
{
	// disable interrupts
	cbi(TIMSK, OCIE2);
	cbi(TIMSK, OCIE0);
	cbi(EIMSK, INT2);
	// detach the service routines
	timerDetach(TIMER2OUTCOMPARE_INT);
	timerDetach(TIMER0OUTCOMPARE_INT);
}

void uartswSetBaudRate(u32 baudrate)
{
	u16 div;

	// set timer prescaler
	if( baudrate > (F_CPU/64L*256L) ) 
	//CHANGE THE ABOVE LINE IF CLOCK FREQ OF AVRLINX BOARD DIFFERS
	//FROM AVRSAT
	{
		// if the requested baud rate is high,
		// set timer prescalers to div-by-64
		timer2SetPrescaler(TIMERRTC_CLK_DIV64);
		timer0SetPrescaler(TIMER_CLK_DIV64);
		div = 64;
	}
	else
	{
		// if the requested baud rate is low,
		// set timer prescalers to div-by-256
		timer2SetPrescaler(TIMERRTC_CLK_DIV256);
		timer0SetPrescaler(TIMER_CLK_DIV256);
		div = 256;
	}

	// calculate division factor for requested baud rate, and set it
	//UartswBaudRateDiv = (u08)(((F_CPU/64L)+(baudrate/2L))/(baudrate*1L));
	//UartswBaudRateDiv = (u08)(((F_CPU/256L)+(baudrate/2L))/(baudrate*1L));
	UartswBaudRateDiv = (u08)(((F_CPU/div)+(baudrate/2L))/(baudrate*1L));
}

//! returns the receive buffer structure 
cBuffer* uartswGetRxBuffer(void)
{
	// return rx buffer pointer
	return &uartswRxBuffer;
}

void uartswSendByte(u08 data)
{
	// wait until uart is ready
	while(UartswTxBusy);
	// set busy flag
	UartswTxBusy = TRUE;
	// save data
	UartswTxData = data;
	// set number of bits (+1 for stop bit)
	UartswTxBitNum = 9;
	
	// set the start bit
	cbi(UARTSW_TX_PORT, UARTSW_TX_PIN);//changed to cbi -JGM
	// schedule the next bit
	outb(OCR2, inb(TCNT2) + UartswBaudRateDiv); 
	// enable OC2 interrupt
	sbi(TIMSK, OCIE2);
}

//! gets a byte (if available) from the uart receive buffer
u08 uartswReceiveByte(u08* rxData)
{
	// make sure we have a receive buffer
	if(uartswRxBuffer.size)
	{
		// make sure we have data
		if(uartswRxBuffer.datalength)
		{
			// get byte from beginning of buffer
			*rxData = bufferGetFromFront(&uartswRxBuffer);
			return TRUE;
		}
		else
		{
			// no data
			return FALSE;
		}
	}
	else
	{
		// no buffer
		return FALSE;
	}
}

void uartswTxBitService(void)
{
	if(UartswTxBitNum)
	{
		// there are bits still waiting to be transmitted
		if(UartswTxBitNum > 1)
		{
			// transmit data bits (inverted, LSB first)
			if( !(UartswTxData & 0x01) )
				cbi(UARTSW_TX_PORT, UARTSW_TX_PIN);//changed to cbi -JGM
			else
				sbi(UARTSW_TX_PORT, UARTSW_TX_PIN);//changed to sbi -JGM
			// shift bits down
			UartswTxData = UartswTxData>>1;
		}
		else
		{
			// transmit stop bit
			sbi(UARTSW_TX_PORT, UARTSW_TX_PIN);//changed to sbi -JGM
		}
		// schedule the next bit
		outb(OCR2, inb(OCR2) + UartswBaudRateDiv); //WHAT IS INB?
		// count down
		UartswTxBitNum--;
	}
	else
	{
		// transmission is done
		// clear busy flag
		UartswTxBusy = FALSE;
		// disable OC2 interrupt
		cbi(TIMSK, OCIE2);
	}
}

void uartswRxBitService(void)
{
	// this function runs on either:
	// - a rising edge interrupt
	// - Timer 0 output compare
	if(!UartswRxBusy)
	{
		// UART was not previously busy,
		// this must be is a start bit
		
		// disable INT2 interrupt
		cbi(EIMSK, INT2);
		// schedule data bit sampling 1.5 bit periods from now
		outb(OCR0, inb(TCNT0) + UartswBaudRateDiv + UartswBaudRateDiv/2);
		// clear OC0 interrupt flag
		sbi(TIFR, OCF0);
		// enable OC0 interrupt
		sbi(TIMSK, OCIE0);
		// set busy flag
		UartswRxBusy = TRUE;
		// reset bit counter
		UartswRxBitNum = 0;
		// reset data
		UartswRxData = 0;
	}
	else
	{
		// start bit has already been received
		// we're in the data bits
		
		// shift data byte to make room for new bit
		UartswRxData = UartswRxData>>1;

		// sample the data line
		if((inb(UARTSW_RX_PORTIN) & (1<<UARTSW_RX_PIN)) ) //Removed ! condition -JGM
		{
			// serial line is low
			// record '1' bit (data inverted)
			UartswRxData |= 0x80;
		}

		// increment bit counter
		UartswRxBitNum++;
		// schedule next bit sample
		outb(OCR0, inb(OCR0) + UartswBaudRateDiv);

		// check if we have a full byte
		if(UartswRxBitNum >= 8)
		{
			// save data in receive buffer
			bufferAddToEnd(&uartswRxBuffer, UartswRxData);
			// disable OC0 interrupt
			cbi(TIMSK, OCIE0);
			// clear INT2 interrupt flag
			sbi(EIFR, INTF2);
			// enable INT interrupt
			sbi(EIMSK, INT2);
			// clear busy flag
			UartswRxBusy = FALSE;
		}
	}
}

SIGNAL(SIG_INTERRUPT2)
{
	// run RxBit service routine
	uartswRxBitService();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线免费观看亚洲| 欧美成人vps| 日韩一区二区免费视频| 国产丝袜在线精品| 日韩高清在线一区| 91一区在线观看| 久久久久久电影| 秋霞影院一区二区| 色综合激情久久| 亚洲欧洲99久久| 国产精品99久久久久久宅男| 欧美一区二视频| 午夜国产精品一区| 91蜜桃传媒精品久久久一区二区| 久久久亚洲精品石原莉奈| 天天综合天天综合色| 在线影院国内精品| 亚洲日穴在线视频| 色综合一区二区| 亚洲色图丝袜美腿| 97久久精品人人爽人人爽蜜臀| 日本一二三四高清不卡| 久久er99热精品一区二区| 欧美一区二区福利在线| 日产欧产美韩系列久久99| 欧美人体做爰大胆视频| 一区二区激情小说| 欧洲精品在线观看| 午夜国产精品一区| 4438x亚洲最大成人网| 日韩精品一二区| 欧美一区二区女人| 国产最新精品免费| 欧美激情综合五月色丁香小说| 久草这里只有精品视频| 久久综合网色—综合色88| 精品一区中文字幕| 久久九九久久九九| 成人精品在线视频观看| 亚洲欧美日韩在线不卡| 日本韩国欧美三级| 日韩精品三区四区| 精品国产网站在线观看| 国产精品1区二区.| 亚洲日本在线天堂| 欧美日韩高清一区二区| 人妖欧美一区二区| 久久色中文字幕| 99亚偷拍自图区亚洲| 亚洲男人的天堂在线aⅴ视频| 色成年激情久久综合| 日韩精品国产精品| 久久久综合九色合综国产精品| 成人免费高清在线观看| 亚洲最大色网站| 日韩欧美第一区| 成人黄色在线视频| 亚洲国产精品嫩草影院| 精品国产1区二区| 91网页版在线| 奇米影视在线99精品| 欧美激情一区二区三区在线| 欧美艳星brazzers| 国产在线日韩欧美| 亚洲人成伊人成综合网小说| 91精品国产高清一区二区三区蜜臀| 精品一区二区在线视频| 亚洲欧美一区二区不卡| 欧美一区二区黄色| 91免费观看视频在线| 麻豆一区二区三| 亚洲少妇30p| 精品乱码亚洲一区二区不卡| 日本道精品一区二区三区| 精品一区二区三区免费视频| 亚洲美女免费视频| 久久人人超碰精品| 91精品国产手机| 91一区二区三区在线观看| 九九热在线视频观看这里只有精品| 中文字幕在线视频一区| 日韩精品专区在线| 在线视频综合导航| 成人激情黄色小说| 久久草av在线| 视频一区视频二区中文| 成人免费一区二区三区视频| 精品第一国产综合精品aⅴ| 在线观看日韩国产| av成人老司机| 国产成人aaaa| 国产一区二区三区不卡在线观看| 亚洲图片欧美综合| 亚洲精品视频一区| 亚洲私人影院在线观看| 久久久精品人体av艺术| 精品精品国产高清一毛片一天堂| 欧美在线不卡视频| 一本高清dvd不卡在线观看 | 久久综合九色综合97婷婷女人| 色综合网色综合| av午夜一区麻豆| 国产精品夜夜嗨| 国产一区二区在线影院| 激情综合色综合久久| 人妖欧美一区二区| 日本一区中文字幕| 婷婷国产v国产偷v亚洲高清| 亚洲精品日日夜夜| 夜夜爽夜夜爽精品视频| 日韩毛片视频在线看| 国产精品美女久久久久久| 欧美国产一区在线| ●精品国产综合乱码久久久久| 日本一区二区久久| 国产精品久久看| 亚洲色图欧美在线| 一区二区免费在线播放| 亚洲午夜久久久| 亚洲国产精品人人做人人爽| 婷婷久久综合九色综合绿巨人| 亚洲一区在线播放| 蜜桃精品视频在线| 国产在线视频不卡二| 成人黄色网址在线观看| 色婷婷香蕉在线一区二区| 欧美少妇bbb| 日韩西西人体444www| 精品国产三级a在线观看| 国产欧美一区二区精品忘忧草| 国产日韩欧美一区二区三区综合| 国产精品无遮挡| 亚洲蜜桃精久久久久久久| 水野朝阳av一区二区三区| 青青青伊人色综合久久| 国产一区欧美一区| av午夜精品一区二区三区| 欧美亚洲国产bt| 日韩美女天天操| 国产精品免费视频观看| 亚洲一区二区三区美女| 久久99国产精品久久99 | 欧美日韩一区高清| 欧美一级在线观看| 国产精品三级视频| 三级成人在线视频| 国产99精品在线观看| 欧美日韩一区二区三区四区| 久久综合九色综合欧美亚洲| 亚洲欧美视频一区| 国产最新精品精品你懂的| 色琪琪一区二区三区亚洲区| xnxx国产精品| 亚洲成av人片在线观看| 国产成人aaaa| 91精品久久久久久蜜臀| 中文字幕中文字幕一区| 久久精品99久久久| 色吊一区二区三区| 日本一区二区三区久久久久久久久不| 亚洲综合视频在线| 成人avav影音| 精品第一国产综合精品aⅴ| 亚洲精品国久久99热| 国产一区二区三区四区五区入口 | 国产精选一区二区三区| 在线观看视频一区二区欧美日韩| 欧美成人精品1314www| 1024成人网| 国产呦萝稀缺另类资源| 欧美高清精品3d| 亚洲精品欧美在线| 懂色av一区二区夜夜嗨| 欧美一区二区三区视频在线| 又紧又大又爽精品一区二区| 国产精品一线二线三线精华| 欧美久久久久免费| 亚洲欧美在线观看| 国产麻豆成人传媒免费观看| 欧美一级黄色大片| 亚洲成av人片在线观看无码| 91在线你懂得| 国产精品无人区| 国产成人免费视频| 欧美成人a视频| 免费在线视频一区| 777奇米四色成人影色区| 亚洲伊人色欲综合网| 色一区在线观看| ●精品国产综合乱码久久久久| 成人免费观看av| 国产精品黄色在线观看| 高清不卡一区二区| 欧美激情一区二区在线| 成人深夜在线观看| 欧美国产一区视频在线观看| 国产成人免费在线| 国产精品视频看| 成人免费观看男女羞羞视频| 国产欧美精品区一区二区三区|