Эта вся беда оттого, что в С работы с железом нету как таковой, а людям хочется
Запись PORTC.1 ошибочна с точки зрения С, любой _стандартный_ С компилятор должен выдавать ошибку. Но в некоторых компиляторах, заточенных именно под АВРки, как минимум в CVAVR, такое прокатывает. При этом это уже магия компилятора, соответственно поддержка "указателей на ножку" - тоже вопрос нестандартного расширения языка, насколько я знаю - такого нету.
Что касается все же передачи ножки в функцию - отдельно ссылку на порт можно передать как обычный указатель, поскольку в АВР порты - это ячейки памяти. Т.е. обращение к такому порту будет выглядеть например так:
- Код: Выделить всё • Развернуть
void SetPinTo1(volatile unsigned char *port, unsigned char bit)
{
*port |= (1<<bit);
}
void SetPinTo0(volatile unsigned char *port, unsigned char bit)
{
*port &= ~(1<<bit);
}
void SetPin(volatile unsigned char *port, unsigned char bit, unsigned char val)
{
*port = (*port&~(1<<bit))|((val&1)<<bit);
}
вызываться это дело должно как SetPinTo1(&PORTA,0) и работать чисто теоретически должно на любом компиляторе, разве что тип указателя может придется подкрутить.
как-то так, на WinAVR (компилятор gcc) компилится, будет ли работать - не проверял, не на чем.