﻿<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.yfrobot.com.cn/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
		<id>https://www.yfrobot.com.cn/wiki/index.php?action=history&amp;feed=atom&amp;title=Cores%3Awiring_analog.c</id>
		<title>Cores:wiring analog.c - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="https://www.yfrobot.com.cn/wiki/index.php?action=history&amp;feed=atom&amp;title=Cores%3Awiring_analog.c"/>
		<link rel="alternate" type="text/html" href="https://www.yfrobot.com.cn/wiki/index.php?title=Cores:wiring_analog.c&amp;action=history"/>
		<updated>2026-05-09T14:37:30Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>https://www.yfrobot.com.cn/wiki/index.php?title=Cores:wiring_analog.c&amp;diff=339&amp;oldid=prev</id>
		<title>Admin：以“&lt;font color=&quot;quartz&quot; size =&quot;+2&quot;&gt; '''analog.c''' &lt;/font&gt;  &lt;pre style=&quot;color:royalblue&quot;&gt; /*   wiring_analog.c - analog input and output   Part of Arduino - http://www....”为内容创建页面</title>
		<link rel="alternate" type="text/html" href="https://www.yfrobot.com.cn/wiki/index.php?title=Cores:wiring_analog.c&amp;diff=339&amp;oldid=prev"/>
				<updated>2015-07-10T11:40:42Z</updated>
		
		<summary type="html">&lt;p&gt;以“&amp;lt;font color=&amp;quot;quartz&amp;quot; size =&amp;quot;+2&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;analog.c&amp;#039;&amp;#039;&amp;#039; &amp;lt;/font&amp;gt;  &amp;lt;pre style=&amp;quot;color:royalblue&amp;quot;&amp;gt; /*   wiring_analog.c - analog input and output   Part of Arduino - http://www....”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;font color=&amp;quot;quartz&amp;quot; size =&amp;quot;+2&amp;quot;&amp;gt; '''analog.c''' &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:royalblue&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  wiring_analog.c - analog input and output&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;
#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;
uint8_t analog_reference = DEFAULT;&lt;br /&gt;
&lt;br /&gt;
void analogReference(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	// can't actually set the register here because the default setting&lt;br /&gt;
	// will connect AVCC and the AREF pin, which would cause a short if&lt;br /&gt;
	// there's something connected to AREF.&lt;br /&gt;
	analog_reference = mode;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int analogRead(uint8_t pin)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t low, high;&lt;br /&gt;
&lt;br /&gt;
#if defined(analogPinToChannel)&lt;br /&gt;
#if defined(__AVR_ATmega32U4__)&lt;br /&gt;
	if (pin &amp;gt;= 18) pin -= 18; // allow for channel or pin numbers&lt;br /&gt;
#endif&lt;br /&gt;
	pin = analogPinToChannel(pin);&lt;br /&gt;
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)&lt;br /&gt;
	if (pin &amp;gt;= 54) pin -= 54; // allow for channel or pin numbers&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
	if (pin &amp;gt;= 18) pin -= 18; // allow for channel or pin numbers&lt;br /&gt;
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)&lt;br /&gt;
	if (pin &amp;gt;= 24) pin -= 24; // allow for channel or pin numbers&lt;br /&gt;
#else&lt;br /&gt;
	if (pin &amp;gt;= 14) pin -= 14; // allow for channel or pin numbers&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(ADCSRB) &amp;amp;&amp;amp; defined(MUX5)&lt;br /&gt;
	// the MUX5 bit of ADCSRB selects whether we're reading from channels&lt;br /&gt;
	// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).&lt;br /&gt;
	ADCSRB = (ADCSRB &amp;amp; ~(1 &amp;lt;&amp;lt; MUX5)) | (((pin &amp;gt;&amp;gt; 3) &amp;amp; 0x01) &amp;lt;&amp;lt; MUX5);&lt;br /&gt;
#endif&lt;br /&gt;
  &lt;br /&gt;
	// set the analog reference (high two bits of ADMUX) and select the&lt;br /&gt;
	// channel (low 4 bits).  this also sets ADLAR (left-adjust result)&lt;br /&gt;
	// to 0 (the default).&lt;br /&gt;
#if defined(ADMUX)&lt;br /&gt;
	ADMUX = (analog_reference &amp;lt;&amp;lt; 6) | (pin &amp;amp; 0x07);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	// without a delay, we seem to read from the wrong channel&lt;br /&gt;
	//delay(1);&lt;br /&gt;
&lt;br /&gt;
#if defined(ADCSRA) &amp;amp;&amp;amp; defined(ADCL)&lt;br /&gt;
	// start the conversion&lt;br /&gt;
	sbi(ADCSRA, ADSC);&lt;br /&gt;
&lt;br /&gt;
	// ADSC is cleared when the conversion finishes&lt;br /&gt;
	while (bit_is_set(ADCSRA, ADSC));&lt;br /&gt;
&lt;br /&gt;
	// we have to read ADCL first; doing so locks both ADCL&lt;br /&gt;
	// and ADCH until ADCH is read.  reading ADCL second would&lt;br /&gt;
	// cause the results of each conversion to be discarded,&lt;br /&gt;
	// as ADCL and ADCH would be locked when it completed.&lt;br /&gt;
	low  = ADCL;&lt;br /&gt;
	high = ADCH;&lt;br /&gt;
#else&lt;br /&gt;
	// we dont have an ADC, return 0&lt;br /&gt;
	low  = 0;&lt;br /&gt;
	high = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	// combine the two bytes&lt;br /&gt;
	return (high &amp;lt;&amp;lt; 8) | low;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Right now, PWM output only works on the pins with&lt;br /&gt;
// hardware support.  These are defined in the appropriate&lt;br /&gt;
// pins_*.c file.  For the rest of the pins, we default&lt;br /&gt;
// to digital output.&lt;br /&gt;
void analogWrite(uint8_t pin, int val)&lt;br /&gt;
{&lt;br /&gt;
	// We need to make sure the PWM output is enabled for those pins&lt;br /&gt;
	// that support it, as we turn it off when digitally reading or&lt;br /&gt;
	// writing with them.  Also, make sure the pin is in output mode&lt;br /&gt;
	// for consistenty with Wiring, which doesn't require a pinMode&lt;br /&gt;
	// call for the analog output pins.&lt;br /&gt;
	pinMode(pin, OUTPUT);&lt;br /&gt;
	if (val == 0)&lt;br /&gt;
	{&lt;br /&gt;
		digitalWrite(pin, LOW);&lt;br /&gt;
	}&lt;br /&gt;
	else if (val == 255)&lt;br /&gt;
	{&lt;br /&gt;
		digitalWrite(pin, HIGH);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		switch(digitalPinToTimer(pin))&lt;br /&gt;
		{&lt;br /&gt;
			// XXX fix needed for atmega8&lt;br /&gt;
			#if defined(TCCR0) &amp;amp;&amp;amp; defined(COM00) &amp;amp;&amp;amp; !defined(__AVR_ATmega8__)&lt;br /&gt;
			case TIMER0A:&lt;br /&gt;
				// connect pwm to pin on timer 0&lt;br /&gt;
				sbi(TCCR0, COM00);&lt;br /&gt;
				OCR0 = val; // set pwm duty&lt;br /&gt;
				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:&lt;br /&gt;
				// connect pwm to pin on timer 0, channel A&lt;br /&gt;
				sbi(TCCR0A, COM0A1);&lt;br /&gt;
				OCR0A = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR0A) &amp;amp;&amp;amp; defined(COM0B1)&lt;br /&gt;
			case TIMER0B:&lt;br /&gt;
				// connect pwm to pin on timer 0, channel B&lt;br /&gt;
				sbi(TCCR0A, COM0B1);&lt;br /&gt;
				OCR0B = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR1A) &amp;amp;&amp;amp; defined(COM1A1)&lt;br /&gt;
			case TIMER1A:&lt;br /&gt;
				// connect pwm to pin on timer 1, channel A&lt;br /&gt;
				sbi(TCCR1A, COM1A1);&lt;br /&gt;
				OCR1A = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR1A) &amp;amp;&amp;amp; defined(COM1B1)&lt;br /&gt;
			case TIMER1B:&lt;br /&gt;
				// connect pwm to pin on timer 1, channel B&lt;br /&gt;
				sbi(TCCR1A, COM1B1);&lt;br /&gt;
				OCR1B = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR1A) &amp;amp;&amp;amp; defined(COM1C1)&lt;br /&gt;
			case TIMER1C:&lt;br /&gt;
				// connect pwm to pin on timer 1, channel B&lt;br /&gt;
				sbi(TCCR1A, COM1C1);&lt;br /&gt;
				OCR1C = val; // set pwm duty&lt;br /&gt;
				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:&lt;br /&gt;
				// connect pwm to pin on timer 2&lt;br /&gt;
				sbi(TCCR2, COM21);&lt;br /&gt;
				OCR2 = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR2A) &amp;amp;&amp;amp; defined(COM2A1)&lt;br /&gt;
			case TIMER2A:&lt;br /&gt;
				// connect pwm to pin on timer 2, channel A&lt;br /&gt;
				sbi(TCCR2A, COM2A1);&lt;br /&gt;
				OCR2A = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR2A) &amp;amp;&amp;amp; defined(COM2B1)&lt;br /&gt;
			case TIMER2B:&lt;br /&gt;
				// connect pwm to pin on timer 2, channel B&lt;br /&gt;
				sbi(TCCR2A, COM2B1);&lt;br /&gt;
				OCR2B = val; // set pwm duty&lt;br /&gt;
				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:&lt;br /&gt;
				// connect pwm to pin on timer 3, channel A&lt;br /&gt;
				sbi(TCCR3A, COM3A1);&lt;br /&gt;
				OCR3A = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR3A) &amp;amp;&amp;amp; defined(COM3B1)&lt;br /&gt;
			case TIMER3B:&lt;br /&gt;
				// connect pwm to pin on timer 3, channel B&lt;br /&gt;
				sbi(TCCR3A, COM3B1);&lt;br /&gt;
				OCR3B = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR3A) &amp;amp;&amp;amp; defined(COM3C1)&lt;br /&gt;
			case TIMER3C:&lt;br /&gt;
				// connect pwm to pin on timer 3, channel C&lt;br /&gt;
				sbi(TCCR3A, COM3C1);&lt;br /&gt;
				OCR3C = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR4A)&lt;br /&gt;
			case TIMER4A:&lt;br /&gt;
				//connect pwm to pin on timer 4, channel A&lt;br /&gt;
				sbi(TCCR4A, COM4A1);&lt;br /&gt;
				#if defined(COM4A0)		// only used on 32U4&lt;br /&gt;
				cbi(TCCR4A, COM4A0);&lt;br /&gt;
				#endif&lt;br /&gt;
				OCR4A = val;	// set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
			&lt;br /&gt;
			#if defined(TCCR4A) &amp;amp;&amp;amp; defined(COM4B1)&lt;br /&gt;
			case TIMER4B:&lt;br /&gt;
				// connect pwm to pin on timer 4, channel B&lt;br /&gt;
				sbi(TCCR4A, COM4B1);&lt;br /&gt;
				OCR4B = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR4A) &amp;amp;&amp;amp; defined(COM4C1)&lt;br /&gt;
			case TIMER4C:&lt;br /&gt;
				// connect pwm to pin on timer 4, channel C&lt;br /&gt;
				sbi(TCCR4A, COM4C1);&lt;br /&gt;
				OCR4C = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
				&lt;br /&gt;
			#if defined(TCCR4C) &amp;amp;&amp;amp; defined(COM4D1)&lt;br /&gt;
			case TIMER4D:				&lt;br /&gt;
				// connect pwm to pin on timer 4, channel D&lt;br /&gt;
				sbi(TCCR4C, COM4D1);&lt;br /&gt;
				#if defined(COM4D0)		// only used on 32U4&lt;br /&gt;
				cbi(TCCR4C, COM4D0);&lt;br /&gt;
				#endif&lt;br /&gt;
				OCR4D = val;	// set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
							&lt;br /&gt;
			#if defined(TCCR5A) &amp;amp;&amp;amp; defined(COM5A1)&lt;br /&gt;
			case TIMER5A:&lt;br /&gt;
				// connect pwm to pin on timer 5, channel A&lt;br /&gt;
				sbi(TCCR5A, COM5A1);&lt;br /&gt;
				OCR5A = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR5A) &amp;amp;&amp;amp; defined(COM5B1)&lt;br /&gt;
			case TIMER5B:&lt;br /&gt;
				// connect pwm to pin on timer 5, channel B&lt;br /&gt;
				sbi(TCCR5A, COM5B1);&lt;br /&gt;
				OCR5B = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			#if defined(TCCR5A) &amp;amp;&amp;amp; defined(COM5C1)&lt;br /&gt;
			case TIMER5C:&lt;br /&gt;
				// connect pwm to pin on timer 5, channel C&lt;br /&gt;
				sbi(TCCR5A, COM5C1);&lt;br /&gt;
				OCR5C = val; // set pwm duty&lt;br /&gt;
				break;&lt;br /&gt;
			#endif&lt;br /&gt;
&lt;br /&gt;
			case NOT_ON_TIMER:&lt;br /&gt;
			default:&lt;br /&gt;
				if (val &amp;lt; 128) {&lt;br /&gt;
					digitalWrite(pin, LOW);&lt;br /&gt;
				} else {&lt;br /&gt;
					digitalWrite(pin, HIGH);&lt;br /&gt;
				}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arduino核心代码|返回核心代码首页]]&lt;br /&gt;
&lt;br /&gt;
更多建议和问题欢迎反馈至 [http://www.yfrobot.com YFRobot论坛]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>