1
+ #ifndef GPIO_H
2
+ #define GPIO_H
3
+
4
+ #include "defs.h"
5
+
6
+ #define GPIO_BIT (_b ) (1 << (_b))
7
+ #define GPIO_BITUL (_b ) (1UL << (_b))
8
+
9
+ #define GPIO_SET_BIT (port , bit ) ((port) |= GPIO_BIT(bit))
10
+ #define GPIO_CLEAR_BIT (port , bit ) ((port) &= ~(GPIO_BIT(bit)))
11
+ #define GPIO_TOGGLE_BIT (statePort , bit ) ((statePort) ^= GPIO_BIT(bit))
12
+ #define GPIO_READ_BIT (port , bit ) ((port) & GPIO_BIT(bit))
13
+
14
+ #define GPIO_IS_VALID (pin ) ((pin) >= PIN_D0 && (pin) <= PIN_D13) || ((pin) >= PIN_A0 && (pin) <= PIN_A5)
15
+
16
+ #define GPIO_GET_DDR_PORT (pin ) \
17
+ ((pin) >= PIN_D8 && (pin) <= PIN_D13) ? (&DDRB) : \
18
+ ((pin) >= PIN_D0 && (pin) <= PIN_D7) ? (&DDRD) : \
19
+ (&DDRC)
20
+
21
+
22
+ #define GPIO_PIN_TO_BIT (pin ) \
23
+ ( ((pin ) >= PIN_D8 && (pin ) <= PIN_D13 ) ? (pin - PIN_D8 ) : \
24
+ ((pin ) >= PIN_D0 && (pin ) <= PIN_D7 ) ? (pin - PIN_D0 ) : \
25
+ ((pin ) - PIN_A0 ) )
26
+
27
+
28
+ #define GPIO_GET_STATE_PORT (_DDRport ) ((_DDRport) == &DDRB ? (&PORTB) : (_DDRport) == (&DDRD) ? (&PORTD) : (&PORTC))
29
+
30
+ #define _SetOutput (pin ) GPIO_SET_BIT(*(volatile uint8_t*)(GPIO_GET_DDR_PORT(pin)), GPIO_PIN_TO_BIT(pin))
31
+ #define _SetInput (pin ) GPIO_CLEAR_BIT(*(volatile uint8_t*)(GPIO_GET_DDR_PORT(pin)), GPIO_PIN_TO_BIT(pin))
32
+
33
+ #define _SetPinHigh (pin ) GPIO_SET_BIT(*(volatile uint8_t*)(GPIO_GET_STATE_PORT(GPIO_GET_DDR_PORT(pin))), GPIO_PIN_TO_BIT(pin))
34
+ #define _SetPinLow (pin ) GPIO_CLEAR_BIT(*(volatile uint8_t*)(GPIO_GET_STATE_PORT(GPIO_GET_DDR_PORT(pin))), GPIO_PIN_TO_BIT(pin))
35
+
36
+
37
+ #define DigitalWritePin (pin , state ) ((state) ? _SetPinHigh(pin) : _SetPinLow(pin))
38
+
39
+ #define PinMode (pin , mode ) ((mode) ? (_SetOutput(pin)) : (_SetInput(pin)))
40
+
41
+ #define TogglePin (pin ) GPIO_TOGGLE_BIT(*(volatile uint8_t*)(GPIO_GET_STATE_PORT(GPIO_GET_DDR_PORT(pin))), GPIO_PIN_TO_BIT(pin))
42
+
43
+
44
+
45
+ #endif /*PORT_MANIPULATION_H*/
0 commit comments