Sposób, w jaki Arduino to robi, polega na tworzeniu tabeli odnośników, która tłumaczy numer pinu na PORTn / DDRn / PINn SFR i powiązany bit. Możesz użyć tej samej sztuczki i sprawić, by piny GPIO liczyły się w wygodny sposób, tak jak są w opakowaniu. Tylko specjalne urządzenia peryferyjne (takie jak SPI / PWM) nie mogą być rozliczane w ten sposób, ponieważ są na stałe podłączone do pinu.
Na dobry początek poniżej znajduje się fragment biblioteki Arduino.h
jeśli chcesz ponownie użyć tej koncepcji.
// Pobierz lokalizację bitu w porcie sprzętowym danego wirtualnego pinu. // Pochodzi z pliku pinów _ *. c dla aktywnego konfiguracja płytki. # define analogInPinToBit (P) (P) // W ATmega1280 adresy niektórych rejestrów portów są // większe niż 255, więc nie możemy ich przechowywać w uint8_t's.extern const uint16_t PROGMEM port_to_mode_PGM [] ; zewnętrzny const uint16_t PROGMEM port_to_input_PGM []; zewnętrzny const uint16_t PROGMEM port_to_output_PGM []; zewnętrzny const uint8_t PROGMEM digital_pin_to_port_PGM [] // zewnętrzny const uint8_t PROGMEM digital_pin_to_bit_PGM []; zewnętrzny const uint8_t PROGMEM digital_pin_to_bit_mask_PGM []; zewnętrzny const uint8_t PROGMEM digital_pin_to_timer_PGM [] ; // Pobierz lokalizację bitu w porcie sprzętowym danego wirtualnego pinu. // To c omes z pinów _ *. c plik dla konfiguracji aktywnej płyty. // // Działają one nieco lepiej jako makra w porównaniu do funkcji inline // # 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 u analogInPinToBit (P) (P) #define_pput) (volvo_timer) 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_input_PGM + (P)))) #define portModeRegister (P) ((* volatile uint8_t *) (pgm_read_word (port_to_input_PGM + (P)))) (P))))
Funkcje pinMode
, digitalWrite
i digitalRead
są zdefiniowane w / usr / share / arduino / hardware / arduino / cores / arduino / cables_digital.c
, które można wykorzystać do dalszych inspiracji.