/*
Reference: https://arbaranwal.github.io/tutorial/2017/06/23/atmega328-register-reference.html
https://playground.arduino.cc/Code/BitMath/
*/
void demo1() {
for (int i = 0; i <= 7; i++) pinMode(i, OUTPUT);
//DDR - Data Direction Register
//DDR - 1 OUTPUT, 0 INPUT
//等价于 pinMode();
//DDRD = 0b11111111;
for (int i = 0; i <= 7; i++) digitalWrite(i, HIGH);
//PORT - Defines state of Output Pins
//PORT - 1 HIGH, 0 LOW
//等价于 digitalWrite
//PORTD = 0b10101011;
Serial.print("0b");
for (int i = 0; i <= 7; i++) Serial.print(digitalRead(i));
//PIN - Reads state of Input Pins
//等价于 digitalRead
//Serial.println(PIND,BIN);
}
void demo2() {
Serial.println("-----------------");
Serial.println("INPUT_PULLUP DEMO");
//A0 - 14 A5-19
for (int i = 14; i <= 18; i++) pinMode(i, INPUT_PULLUP);
//INPUT_PULLUP 可以用 DDRC 和 PORTC组合实现
//DDRC = 0b00000000;
//PORTC = 0b00111111;
Serial.print("A0-A5 0b");
Serial.println(PINC, BIN);
}
void demo3() {
// 使用 二进制 OR 操作 仅将A5 设置为OUTPUT HIGH
DDRC = DDRC | 0b00100000;
PORTC = PORTC | 0b00100000;
// 使用 AND 和 NOT 的组合 仅将A5 设置OUTPUT LOW
delay(3000);
PORTC = PORTC & ~(0b00100000);
// 使用 二进制 AND 操作 仅获得A5 的状态
if (PINC & 0b00100000) {
Serial.print("A5 Status is HIGH");
} else {
Serial.print("A5 Status is LOW");
}
}
void demo4() {
//二进制高阶
PORTD &= ~(1 << 3); //D3 = LOW
PORTD &= ~(7 << 3); //D3,D4和D5 = LOW
PORTD |= (1 << 4); //D4 = HIGH
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//demo1(); //basic
demo2(); //INPUT_PULLUP
//demo3(); //二进制运算基础
//demo4(); //二进制运算高阶
}
void loop() {
// put your main code here, to run repeatedly:
// 使用 NOT 进行反转
//PORTD = ~PORTD;
//delay(500);
}