Код
//---- Макросы для чтения портов ввода
// читаем порт по адресу addr; пример: ReadSFR((BYTE)(&PINB))
#define ReadSFR(addr) (*(volatile BYTE *)((WORD)addr))
// читаем бит из порта по адресу addr; пример: ReadSFRbit((BYTE)(&PINB),1<<PINB3)
#define ReadSFRbit(addr,mask) ((*(volatile BYTE *)((WORD)addr))&mask ? 1 : 0)
//---- Макросы для записи портов вывода
// пишем в порт по адресу addr, data - значение; пример: WriteSFR((BYTE)(&PORTB), 0xAA)
#define WriteSFR(addr,data) (*(volatile BYTE *)((WORD)addr)=(BYTE)data)
// записываем биты в порт по адресу addr, mask - биты записать;
// пример: WriteSFRsetbit((BYTE)(&PORTB),1<<PORTB3)
#define WriteSFRsetbit(addr,mask) ((*(volatile BYTE *)((WORD)addr))|=mask)
// стираем биты в порту по адресу addr, mask - биты стереть;
// пример: WriteSFRclrbit((BYTE)(&PORTB),1<<PORTB3)
#define WriteSFRclrbit(addr,mask) ((*(volatile BYTE *)((WORD)addr))&=~mask)
соответственно можете переделать на функции
только макросами быстрее