0%

Arduino 另一种初始化端口的方式

最近在写 Arduino 的时候发现一种新的初始化方式,通过寄存器来控制端口,这种方法可以更快的完成端口初始化。

使用的开发板是 pro micro(atmega32u4),传统的使用模式:

1
2
3
4
5
6
7
8
9
10
11
uint8_t btn[4] = {A0, A1, A2, A3,};//定义端口列表
for (uint8_t i : btn) {
pinMode(i, INPUT_PULLUP);//用循环依次把端口初始化为输入,高电平
}
for (uint8_t i : btn) {//用循环依次读取端口状态
if(!digitalRead(i)){
Serial.println("按下了");
}else{
Serial.println("松开了");
}
}

然后看一下 pro micro 和 atmega32u4 的针脚定义图:
Arduino_Pro_Micro

可以发现 A0-A3 的寄存器地址是 PF4-PF7,同样属于 PORTF,用寄存器初始化的方法是:

1
2
3
4
5
6
7
8
9
10
11
12
uint8_t LastB;
DDRF = B00000000;//将PF0-PF7设置为输入
PORTF = B11110000;//将PF4-PF7设置为高电平
uint8_t CurrB = PINF;//获取PORTF所有针脚的状态
for (uint8_t i = 4; i < 8; i++) {
if (!(CurrB & _BV(i)) && (LastB & _BV(i))) {
Serial.println("按下了");
} else if ((CurrB & _BV(i)) && !(LastB & _BV(i))) {
Serial.println("松开了");
}
}
LastB = CurrB;

DDRF:用于设置 PORTF 的端口方向,1 为输出,0 为输入,设置的值可以是 2 进制或 16 进制,如二进制 B000 就代表将 0-2 的端口设置为输入。
PORTF:用于设置 PORTF 的高低电平(仅输入),1 为高,0 为低。
PINF:读取 PORTF 的所有针脚状态,取出来的是二进制数值,例如 B010 就代表 PF0 和 PF2 是低电平,PF1 是高电平。

参考资料:
Relationship among PORTX, PINX, DDRX, pinMode(), …. of Arduino
Arduino 板上通过操作端口寄存器来进行控制