<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.ywrobot.net/index.php?action=history&amp;feed=atom&amp;title=Wiring_digital.c</id>
		<title>Wiring digital.c - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.ywrobot.net/index.php?action=history&amp;feed=atom&amp;title=Wiring_digital.c"/>
		<link rel="alternate" type="text/html" href="http://wiki.ywrobot.net/index.php?title=Wiring_digital.c&amp;action=history"/>
		<updated>2026-05-14T11:43:05Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://wiki.ywrobot.net/index.php?title=Wiring_digital.c&amp;diff=66&amp;oldid=prev</id>
		<title>YWrobot CYB：创建页面，内容为“&lt;pre style=&quot;color:blue&quot;&gt; /*   wiring_digital.c - digital input and output functions   Part of Arduino - http://www.arduino.cc/    Copyright (c) 2005-2006 David A. Me...”</title>
		<link rel="alternate" type="text/html" href="http://wiki.ywrobot.net/index.php?title=Wiring_digital.c&amp;diff=66&amp;oldid=prev"/>
				<updated>2016-04-25T02:05:05Z</updated>
		
		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt; /*   wiring_digital.c - digital input and output functions   Part of Arduino - http://www.arduino.cc/    Copyright (c) 2005-2006 David A. Me...”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  wiring_digital.c - digital input and output functions&lt;br /&gt;
  Part of Arduino - http://www.arduino.cc/&lt;br /&gt;
&lt;br /&gt;
  Copyright (c) 2005-2006 David A. Mellis&lt;br /&gt;
&lt;br /&gt;
  This library is free software; you can redistribute it and/or&lt;br /&gt;
  modify it under the terms of the GNU Lesser General Public&lt;br /&gt;
  License as published by the Free Software Foundation; either&lt;br /&gt;
  version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
  This library is distributed in the hope that it will be useful,&lt;br /&gt;
  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU&lt;br /&gt;
  Lesser General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
  You should have received a copy of the GNU Lesser General&lt;br /&gt;
  Public License along with this library; if not, write to the&lt;br /&gt;
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,&lt;br /&gt;
  Boston, MA  02111-1307  USA&lt;br /&gt;
&lt;br /&gt;
  Modified 28 September 2010 by Mark Sproul&lt;br /&gt;
&lt;br /&gt;
  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define ARDUINO_MAIN&lt;br /&gt;
#include &amp;quot;wiring_private.h&amp;quot;&lt;br /&gt;
#include &amp;quot;pins_arduino.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void pinMode(uint8_t pin, uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t bit = digitalPinToBitMask(pin);&lt;br /&gt;
	uint8_t port = digitalPinToPort(pin);&lt;br /&gt;
	volatile uint8_t *reg, *out;&lt;br /&gt;
&lt;br /&gt;
	if (port == NOT_A_PIN) return;&lt;br /&gt;
&lt;br /&gt;
	// JWS: can I let the optimizer do this?&lt;br /&gt;
	reg = portModeRegister(port);&lt;br /&gt;
	out = portOutputRegister(port);&lt;br /&gt;
&lt;br /&gt;
	if (mode == INPUT) { &lt;br /&gt;
		uint8_t oldSREG = SREG;&lt;br /&gt;
                cli();&lt;br /&gt;
		*reg &amp;amp;= ~bit;&lt;br /&gt;
		*out &amp;amp;= ~bit;&lt;br /&gt;
		SREG = oldSREG;&lt;br /&gt;
	} else if (mode == INPUT_PULLUP) {&lt;br /&gt;
		uint8_t oldSREG = SREG;&lt;br /&gt;
                cli();&lt;br /&gt;
		*reg &amp;amp;= ~bit;&lt;br /&gt;
		*out |= bit;&lt;br /&gt;
		SREG = oldSREG;&lt;br /&gt;
	} else {&lt;br /&gt;
		uint8_t oldSREG = SREG;&lt;br /&gt;
                cli();&lt;br /&gt;
		*reg |= bit;&lt;br /&gt;
		SREG = oldSREG;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Forcing this inline keeps the callers from having to push their own stuff&lt;br /&gt;
// on the stack. It is a good performance win and only takes 1 more byte per&lt;br /&gt;
// user than calling. (It will take more bytes on the 168.)&lt;br /&gt;
//&lt;br /&gt;
// But shouldn't this be moved into pinMode? Seems silly to check and do on&lt;br /&gt;
// each digitalread or write.&lt;br /&gt;
//&lt;br /&gt;
// Mark Sproul:&lt;br /&gt;
// - Removed inline. Save 170 bytes on atmega1280&lt;br /&gt;
// - changed to a switch statment; added 32 bytes but much easier to read and maintain.&lt;br /&gt;
// - Added more #ifdefs, now compiles for atmega645&lt;br /&gt;
//&lt;br /&gt;
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));&lt;br /&gt;
//static inline void turnOffPWM(uint8_t timer)&lt;br /&gt;
static void turnOffPWM(uint8_t timer)&lt;br /&gt;
{&lt;br /&gt;
	switch (timer)&lt;br /&gt;
	{&lt;br /&gt;
		#if defined(TCCR1A) &amp;amp;&amp;amp; defined(COM1A1)&lt;br /&gt;
		case TIMER1A:   cbi(TCCR1A, COM1A1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		#if defined(TCCR1A) &amp;amp;&amp;amp; defined(COM1B1)&lt;br /&gt;
		case TIMER1B:   cbi(TCCR1A, COM1B1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		&lt;br /&gt;
		#if defined(TCCR2) &amp;amp;&amp;amp; defined(COM21)&lt;br /&gt;
		case  TIMER2:   cbi(TCCR2, COM21);      break;&lt;br /&gt;
		#endif&lt;br /&gt;
		&lt;br /&gt;
		#if defined(TCCR0A) &amp;amp;&amp;amp; defined(COM0A1)&lt;br /&gt;
		case  TIMER0A:  cbi(TCCR0A, COM0A1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		&lt;br /&gt;
		#if defined(TIMER0B) &amp;amp;&amp;amp; defined(COM0B1)&lt;br /&gt;
		case  TIMER0B:  cbi(TCCR0A, COM0B1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		#if defined(TCCR2A) &amp;amp;&amp;amp; defined(COM2A1)&lt;br /&gt;
		case  TIMER2A:  cbi(TCCR2A, COM2A1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		#if defined(TCCR2A) &amp;amp;&amp;amp; defined(COM2B1)&lt;br /&gt;
		case  TIMER2B:  cbi(TCCR2A, COM2B1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		&lt;br /&gt;
		#if defined(TCCR3A) &amp;amp;&amp;amp; defined(COM3A1)&lt;br /&gt;
		case  TIMER3A:  cbi(TCCR3A, COM3A1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		#if defined(TCCR3A) &amp;amp;&amp;amp; defined(COM3B1)&lt;br /&gt;
		case  TIMER3B:  cbi(TCCR3A, COM3B1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		#if defined(TCCR3A) &amp;amp;&amp;amp; defined(COM3C1)&lt;br /&gt;
		case  TIMER3C:  cbi(TCCR3A, COM3C1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
&lt;br /&gt;
		#if defined(TCCR4A) &amp;amp;&amp;amp; defined(COM4A1)&lt;br /&gt;
		case  TIMER4A:  cbi(TCCR4A, COM4A1);    break;&lt;br /&gt;
		#endif					&lt;br /&gt;
		#if defined(TCCR4A) &amp;amp;&amp;amp; defined(COM4B1)&lt;br /&gt;
		case  TIMER4B:  cbi(TCCR4A, COM4B1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
		#if defined(TCCR4A) &amp;amp;&amp;amp; defined(COM4C1)&lt;br /&gt;
		case  TIMER4C:  cbi(TCCR4A, COM4C1);    break;&lt;br /&gt;
		#endif			&lt;br /&gt;
		#if defined(TCCR4C) &amp;amp;&amp;amp; defined(COM4D1)&lt;br /&gt;
		case TIMER4D:	cbi(TCCR4C, COM4D1);	break;&lt;br /&gt;
		#endif			&lt;br /&gt;
			&lt;br /&gt;
		#if defined(TCCR5A)&lt;br /&gt;
		case  TIMER5A:  cbi(TCCR5A, COM5A1);    break;&lt;br /&gt;
		case  TIMER5B:  cbi(TCCR5A, COM5B1);    break;&lt;br /&gt;
		case  TIMER5C:  cbi(TCCR5A, COM5C1);    break;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digitalWrite(uint8_t pin, uint8_t val)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timer = digitalPinToTimer(pin);&lt;br /&gt;
	uint8_t bit = digitalPinToBitMask(pin);&lt;br /&gt;
	uint8_t port = digitalPinToPort(pin);&lt;br /&gt;
	volatile uint8_t *out;&lt;br /&gt;
&lt;br /&gt;
	if (port == NOT_A_PIN) return;&lt;br /&gt;
&lt;br /&gt;
	// If the pin that support PWM output, we need to turn it off&lt;br /&gt;
	// before doing a digital write.&lt;br /&gt;
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);&lt;br /&gt;
&lt;br /&gt;
	out = portOutputRegister(port);&lt;br /&gt;
&lt;br /&gt;
	uint8_t oldSREG = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
&lt;br /&gt;
	if (val == LOW) {&lt;br /&gt;
		*out &amp;amp;= ~bit;&lt;br /&gt;
	} else {&lt;br /&gt;
		*out |= bit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	SREG = oldSREG;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int digitalRead(uint8_t pin)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timer = digitalPinToTimer(pin);&lt;br /&gt;
	uint8_t bit = digitalPinToBitMask(pin);&lt;br /&gt;
	uint8_t port = digitalPinToPort(pin);&lt;br /&gt;
&lt;br /&gt;
	if (port == NOT_A_PIN) return LOW;&lt;br /&gt;
&lt;br /&gt;
	// If the pin that support PWM output, we need to turn it off&lt;br /&gt;
	// before getting a digital reading.&lt;br /&gt;
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);&lt;br /&gt;
&lt;br /&gt;
	if (*portInputRegister(port) &amp;amp; bit) return HIGH;&lt;br /&gt;
	return LOW;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>YWrobot CYB</name></author>	</entry>

	</feed>