hslockmk2/software/keypad/main.c

60 lines
1.5 KiB
C

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
/////////////////////
// I/O ports setup //
/////////////////////
typedef struct
{
volatile uint8_t *DDR;
volatile uint8_t *PORT;
volatile uint8_t *PIN;
uint8_t Bitmap;
} TIOPort;
#define DECLARE_IO(name, port, bit) TIOPort g_IO_##name = { &DDR##port, &PORT##port, &PIN##port, (1 << bit) }
#define IO_SET_OUTPUT(name) do { *g_IO_##name.DDR |= g_IO_##name.Bitmap; } while(0)
#define IO_SET_INPUT(name) do { *g_IO_##name.DDR &= ~g_IO_##name.Bitmap; } while(0)
#define IO_INPUT_PULLUP(name) do { *g_IO_##name.PORT |= g_IO_##name.Bitmap; } while(0)
#define IO_OUT(name, value) do { if (value) \
*g_IO_##name.PORT |= g_IO_##name.Bitmap; \
else \
*g_IO_##name.PORT &= ~g_IO_##name.Bitmap; } while(0)
#define IO_TOGGLE(name) do { *g_IO_##name.PORT ^= g_IO_##name.Bitmap; } while(0)
#define IO_IN(name) (*g_IO_##name.PIN & g_IO_##name.Bitmap)
// Buzzer on PC2
DECLARE_IO(BUZZER, C, 2);
// Red LED pn PC1
DECLARE_IO(LED_RED, C, 1);
// Green LED on PC0
DECLARE_IO(LED_GREEN, C, 0);
// Keypad
DECLARE_IO(KPAD_COL3, D, 0);
DECLARE_IO(KAPD_ROW3, D, 1);
DECLARE_IO(KPAD_COMMON, D, 2);
DECLARE_IO(KPAD_COL2, D, 3);
DECLARE_IO(KPAD_ROW1, D, 4);
DECLARE_IO(KPAD_ROW2, D, 5);
DECLARE_IO(KPAD_ROW4, D, 6);
DECLARE_IO(KPAD_COL1, D, 7);
int main (void)
{
// Setup outputs
IO_SET_OUTPUT(BUZZER);
IO_SET_OUTPUT(LED_RED);
IO_SET_OUTPUT(LED_GREEN);
IO_OUT(LED_GREEN, 1);
IO_OUT(LED_RED, 1);
for (;;) {}
return 0;
}