Logika dasarnya register DDRx, PORTx, dan PINx juga memiliki alamat register, jadi inilah yang seharusnya kita simpan kedalam library yang akan kita buat. berikut ini contoh register ATMega32
#define INPUT 0
#define OUTPUT 1
#define INPUT_PULLUP
Selanjutnya karena ATMega32 memiliki 32 pin IO maka buatlah kedalam sebuah array yang setiap 8 byte menyimpan alamat registernya. untuk lebih mudahnya, susun sesuai dengan mapping IO ATMega32 (DIP Package) sehingga akan berurutan PORTB, PORTD, PORTC, PORTA. sehingga array untuk register DDR akan menjadi
const uint8_t DDRx[32]={0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, //DDRB0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, //DDRD0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, //DDRC0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,//DDRA};
Setelah mendapatkan array dari register, dua fungsi yang harus di ketahui yaitu _BV(x) dan _SFR_IO8(registerAddress), dua fungsi ini biasanya dipakai pada macro sbi(register,bit) dan cbi(register,bit). oleh karena itu fungsi yang akan dibuat kurang lebih akan sama dengan sbi dan cbi. berikut fungsi pinMode(pinNumber,modePin).const uint8_t PORTx[32]={0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,//PORTB0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,//PORTD0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,//PORTC0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,//PORTA};
#define INPUT 0
#define OUTPUT 1
#define INPUT_PULLUP
void pinMode(uint8_t pin, uint8_t mode){uint8_t num_pin = pin%8;if(mode==OUTPUT){_SFR_BYTE(_SFR_IO8(DDRx[pin]))|=_BV(num_pin);}else if(mode==INPUT){_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));}else{_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));_SFR_BYTE(_SFR_IO8(PORTx[pin]))|=_BV(num_pin);}}