分享

有关模拟量引脚的定义

 宽宽r700 2016-09-25
int analogPin = 3;等价于#define analogPin 3吗?
它是定义板子的3号引脚还是A3引脚呢?


(1)都可以! 都可能 ! 可能是 digital pin 3, 可能是  A3, 看你怎麼用!
  因為:
   int analogPin = 3;  // 找個位置(2 byte), 命名 analogPin, 放入 3
但是 #define analogPin 3  意思是以後看到 analogPin 就換成 3
所以, 其實不太一樣, 但用起來很像一樣 !!
----
(2)寫 int analogPin =3;
   稍後還可寫 analogPin =5;
   但是寫 #define analogPin 3
   之後如果寫 analogPin = 3;  
  會被編譯為 3 = 3;  然後就報錯 !!
(3)寫 int analogPin =3;
    int kk = digitalRead(analogPin); 則此時 analogPin 是 3
  但寫
    int yy = analogRead(analogPin); 此時 analogPin 是代表 A3
  可是其實 A3 在 UNO 其實就是 14+3 = 17
  因為 #define A0 14
      //...
       #define A3 17

** 注意, A3 不可寫成 a3
   大小寫不同意義就不同 !!

(1)都可以! 都可能 ! 可能是 digital pin 3, 可能是  A3, 看你怎麼用!
  因為:
   int analogPin = 3;  // ...

感谢~~不过我试了一下,int analogPin = 3;后面再加 int analogPin = 5;会出错,报重复定义

你那樣寫當然錯啦!
我是說 int  ggyy = 3;
  然後在 setup( ) { 內或在 loop( ) {內可寫 ggyy=5;
  但用 #define 的不行!
這時在 setup( ){  或 loop( 內用的就是前面那個 int ggyy;
稱為全局變量, 代表記憶體某個位置;
倒是用 #define 的只是一個"符號", 稍後用到就直接換掉, 跟人直接寫相同 !
不過, 如果在seup( ){ 或 loop( ){ 或任何函數內又寫 int ggyy=5; 並不會報錯,
因為那樣是局部變量, 裡面的 ggyy 暫時用另一個位置, 例如:
int ggyy=38;
void setup( ) {
    Serial.begin(9600);
    int ggyy = 49;
    Serial.print("inner ggyy=");
    Serial.println(ggyy);
    Serial.print("Outer ggyy=");
    Serial.println(  ::ggyy );  // 這是外面那個 ggyy
    int kkk = ::ggyy;  // 外面的 ggyy, 若不寫 :: 則是裡面的 ggyy
    Serial.println( String("kkk=") + kkk);    // 印出 kkk=38
}
void loop( ) {
}

補充一下
就是說以下三句其實意思都一樣:

int ans = analogRead(3);
int ans = analogRead(A3);
int ans = analogRead(17);

不論寫哪一句, 都是讀取 A3 腳的模擬值 0 ~ 1023
因為 analogRead( ) 只能用在 A0 ~ A5,
所以會自動檢查並想辦法更正 !
但是用 analogWrite( ) 就不是這樣喔!
UNO 上 analogWrite( )只對 3, 5, 6, 9, 10, 11 這些 pin 有效 !
不是這些 pin 就改用 digitalWrite( ),
可是 digitalWrite(3, HIGH); 和 digitalWrite(A3, HIGH);
是分別對 pin3 和 pin A3
(Analog 的 pin 可以拿來做 digital 輸出, 反之不行!)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约