Keypad support for the keypad. Woo!

master
q3k 2013-09-17 14:34:36 +02:00
parent a6643a83fb
commit 30c4841562
7 changed files with 138 additions and 20 deletions

View File

@ -1,5 +1,5 @@
PRG = uart_hello
OBJ = main.o buzzer.o
OBJ = main.o buzzer.o keypad.o
PROGRAMMER = buspirate
PORT = /dev/ttyACM0
MCU_TARGET = atmega8
@ -8,7 +8,7 @@ OPTIMIZE = -Os
DEFS =
LIBS =
HZ = 2000000
HZ = 8000000
# You should not have to change anything below here.
@ -81,7 +81,7 @@ install: $(PRG).hex
fuse:
avrdude -p $(AVRDUDE_TARGET) -c $(PROGRAMMER) -P $(PORT) -v \
-U lfuse:w:0xc6:m -U hfuse:w:0xd9:m
-U lfuse:w:0xe4:m -U hfuse:w:0xd9:m
ddd: gdbinit
ddd --debugger "avr-gdb -x $(GDBINITFILE)"

View File

@ -22,7 +22,7 @@ void buzzer_start(uint16_t ticks)
cli();
TIMSK &= ~_BV(OCIE1A);
OCR1A = ticks;
TIMSK = _BV(OCIE1A);
TIMSK |= _BV(OCIE1A);
TCNT1 = 0;
sei();
}
@ -42,10 +42,10 @@ ISR(TIMER1_COMPA_vect)
void buzzer_signal_boot(void)
{
buzzer_start(TONE_LOW);
_delay_ms(100);
_delay_ms(200);
buzzer_start(TONE_MID);
_delay_ms(100);
_delay_ms(200);
buzzer_start(TONE_HIGH);
_delay_ms(100);
_delay_ms(200);
buzzer_stop();
}

View File

@ -3,8 +3,8 @@
void buzzer_init(void);
#define TONE_LOW 8
#define TONE_MID 4
#define TONE_HIGH 2
#define TONE_LOW 128
#define TONE_MID 64
#define TONE_HIGH 32
#endif

View File

@ -6,21 +6,21 @@ typedef struct
volatile uint8_t *DDR;
volatile uint8_t *PORT;
volatile uint8_t *PIN;
uint8_t Bitmap;
uint8_t BitShift;
} TIOPort;
#define DECLARE_IO(name, port, bit) TIOPort g_IO_##name = { &DDR##port, &PORT##port, &PIN##port, (1 << bit) }
#define DECLARE_IO(name, port, bit) TIOPort g_IO_##name = { &DDR##port, &PORT##port, &PIN##port, bit }
#define IMPORT_IO(name) extern TIOPort g_IO_##name
#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_SET_OUTPUT(name) do { *g_IO_##name.DDR |= (1 << g_IO_##name.BitShift); } while(0)
#define IO_SET_INPUT(name) do { *g_IO_##name.DDR &= ~(1 << g_IO_##name.BitShift); } while(0)
#define IO_INPUT_PULLUP(name) do { *g_IO_##name.PORT |= (1<< g_IO_##name.BitShift); } while(0)
#define IO_OUT(name, value) do { if (value) \
*g_IO_##name.PORT |= g_IO_##name.Bitmap; \
*g_IO_##name.PORT |= (1 << g_IO_##name.BitShift); \
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)
*g_IO_##name.PORT &= ~(1 << g_IO_##name.BitShift); } while(0)
#define IO_TOGGLE(name) do { *g_IO_##name.PORT ^= (1 << g_IO_##name.BitShift); } while(0)
#define IO_IN(name) ((*g_IO_##name.PIN >> g_IO_##name.BitShift) & 1)
#endif

97
software/keypad/keypad.c Normal file
View File

@ -0,0 +1,97 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#include "io.h"
IMPORT_IO(KPAD_ROW1);
IMPORT_IO(KPAD_ROW2);
IMPORT_IO(KPAD_ROW3);
IMPORT_IO(KPAD_ROW4);
IMPORT_IO(KPAD_COL1);
IMPORT_IO(KPAD_COL2);
IMPORT_IO(KPAD_COL3);
IMPORT_IO(LED_RED);
IMPORT_IO(LED_GREEN);
void _keypad_update_column(void);
void keypad_init(void)
{
TCCR0 = _BV(CS02);
TCNT0 = 0;
TIMSK |= _BV(TOIE0);
IO_OUT(KPAD_ROW1, 1);
IO_OUT(KPAD_ROW2, 1);
IO_OUT(KPAD_ROW3, 1);
IO_OUT(KPAD_ROW4, 1);
}
uint8_t g_KeypadColumn = 0;
void _keypad_update_column(void)
{
g_KeypadColumn++;
if (g_KeypadColumn > 2)
g_KeypadColumn = 0;
switch(g_KeypadColumn)
{
case 0:
IO_SET_OUTPUT(KPAD_COL1);
IO_SET_INPUT(KPAD_COL2);
IO_SET_INPUT(KPAD_COL3);
IO_OUT(KPAD_COL1, 0);
IO_OUT(KPAD_COL2, 1);
IO_OUT(KPAD_COL3, 1);
break;
case 1:
IO_SET_INPUT(KPAD_COL1);
IO_SET_OUTPUT(KPAD_COL2);
IO_SET_INPUT(KPAD_COL3);
IO_OUT(KPAD_COL1, 1);
IO_OUT(KPAD_COL2, 0);
IO_OUT(KPAD_COL3, 1);
break;
case 2:
IO_SET_INPUT(KPAD_COL1);
IO_SET_INPUT(KPAD_COL2);
IO_SET_OUTPUT(KPAD_COL3);
IO_OUT(KPAD_COL1, 1);
IO_OUT(KPAD_COL2, 1);
IO_OUT(KPAD_COL3, 0);
break;
}
}
// all the buttons of the matrix in a bitfield
uint16_t g_KeypadState = 0;
uint16_t g_NewKeypadState = 0;;
uint8_t _keypad_read_rows(void)
{
uint8_t Result = 0;
Result |= (IO_IN(KPAD_ROW1) << 0);
Result |= (IO_IN(KPAD_ROW2) << 1);
Result |= (IO_IN(KPAD_ROW3) << 2);
Result |= (IO_IN(KPAD_ROW4) << 3);
Result |= 0b11110000;
return ~Result;
}
ISR(TIMER0_OVF_vect)
{
_keypad_update_column();
if (g_KeypadColumn == 0)
{
g_KeypadState = g_NewKeypadState;
g_NewKeypadState = 0;
}
uint8_t State = _keypad_read_rows();
g_NewKeypadState |= (State << (4 * g_KeypadColumn));
IO_OUT(LED_GREEN, (g_KeypadState >> 0) & 1);
IO_OUT(LED_RED, (g_KeypadState >> 1) & 1);
}

19
software/keypad/keypad.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef __KEYPAD_H__
#define __KEYPAD_H__
void keypad_init(void);
#define KEY_3 0
#define KEY_6 1
#define KEY_9 2
#define KEY_P 3
#define KEY_2 4
#define KEY_5 5
#define KEY_8 6
#define KEY_0 7
#define KEY_1 8
#define KEY_4 9
#define KEY_7 10
#define KEY_S 11
#endif

View File

@ -5,6 +5,7 @@
#include "io.h"
#include "buzzer.h"
#include "keypad.h"
/////////////////////
// I/O ports setup //
@ -19,7 +20,7 @@ DECLARE_IO(LED_GREEN, C, 0);
// Keypad
DECLARE_IO(KPAD_COL3, D, 0);
DECLARE_IO(KAPD_ROW3, D, 1);
DECLARE_IO(KPAD_ROW3, D, 1);
DECLARE_IO(KPAD_COMMON, D, 2);
DECLARE_IO(KPAD_COL2, D, 3);
DECLARE_IO(KPAD_ROW1, D, 4);
@ -36,6 +37,7 @@ int main (void)
IO_SET_OUTPUT(LED_GREEN);
buzzer_init();
keypad_init();
sei();
// Flash LEDs and buzz buzzer for debug