Cách làm của Arduino là tạo một bảng tra cứu chuyển số pin thành SFR PORTn / DDRn / PINn và bit liên quan. Bạn có thể sử dụng cùng một thủ thuật và làm cho các chân GPIO được đếm một cách thuận tiện như trong gói. Chỉ các thiết bị ngoại vi đặc biệt (như SPI / PWM) không thể được tính theo cách này vì chúng cứng với dây.
Một khởi đầu tốt là Arduino.h
sniplet thư viện dưới đây nếu bạn muốn sử dụng lại khái niệm đó.
// Get the bit location within the hardware port of the given virtual pin.
// This comes from the pins_*.c file for the active board configuration.
#define analogInPinToBit(P) (P)
// On the ATmega1280, the addresses of some of the port registers are
// greater than 255, so we can't store them in uint8_t's.
extern const uint16_t PROGMEM port_to_mode_PGM[];
extern const uint16_t PROGMEM port_to_input_PGM[];
extern const uint16_t PROGMEM port_to_output_PGM[];
extern const uint8_t PROGMEM digital_pin_to_port_PGM[];
// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];
extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];
extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
// Get the bit location within the hardware port of the given virtual pin.
// This comes from the pins_*.c file for the active board configuration.
//
// These perform slightly better as macros compared to inline functions
//
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
#define analogInPinToBit(P) (P)
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
Các pinMode
, digitalWrite
và digitalRead
các chức năng được định nghĩa trong /usr/share/arduino/hardware/arduino/cores/arduino/wiring_digital.c
đó có thể được sử dụng để tìm cảm hứng thêm.