Newer
Older
matrix / matrix.c
/**
 *   @file matrix.c
 *
 *   @date 04.03.2013
 * @author Pascal Gollor
 *     web http://www.pgollor.de
 *
 * @copyright Dieses Werk ist unter einer Creative Commons Lizenz vom Typ
 * Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Deutschland zugänglich.
 * Um eine Kopie dieser Lizenz einzusehen, konsultieren Sie
 * http://creativecommons.org/licenses/by-nc-sa/3.0/de/ oder wenden Sie sich
 * brieflich an Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
 *
 * -- englisch version --
 * @n This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Germany License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
 *
 */

#include "matrix.h"
#include "adc.h"

#include <util/delay.h>			// delay_ms


/**
 * @brief gedrueckte Taste
 * @return Taste
 *
 * ADC 4x4 Matrix
 *
 * @n Pin: U/mV
 * @n 1: 1019
 * @n 2: 509
 * @n 3: 339
 * @n 4: 817
 * @n 5: 453
 * @n 6: 313
 * @n 7: 683
 * @n 8: 408
 * @n 9: 291
 * @n 0: 371
 * @n A: 254
 * @n B: 239
 * @n C: 226
 * @n D: 214
 * @n *: 586
 * @n #: 271
 */
uint8_t matrix_getKey(void)
{
	uint8_t taste = 'x';

	uint16_t adc = adc_read_avg(MATRIX_PIN, 3);
	if (adc > 200)
	{
		// Zeit zum Entprellen
		_delay_ms(10);

		// Anschliessend Wert zum verwerten einlesen
		uint16_t wert = adc_read_avg(MATRIX_PIN, 3);

		// wenn der Wert < 200 ist, dann wurde eine Taste zu kurz gedrueckt
		if (wert < 200)
			return 'x';

		// solange warten bis die Taste wieder losgelassen wurde
		while (adc != 0)
		{
			adc = adc_read_avg(MATRIX_PIN, 3);
		}

		// Taste auf der 4x4 Matrix
		if (wert > 998)
			taste = '1';
		else if (wert > 800)
			taste = '4';
		else if (wert > 668)
			taste = '7';
		else if (wert > 573)
			taste = '*';
		else if (wert > 498)
			taste = '2';
		else if (wert > 443)
			taste = '5';
		else if (wert > 399)
			taste = '8';
		else if (wert > 363)
			taste = '0';
		else if (wert > 331)
			taste = '3';
		else if (wert > 306)
			taste = '6';
		else if (wert > 284)
			taste = '9';
		else if (wert > 265)
			taste = '#';
		else if (wert > 248)
			taste = 'A';
		else if (wert > 233)
			taste = 'B';
		else if (wert > 220)
			taste = 'C';
		else if (wert > 209)
			taste = 'D';
	}

	// Taste ausgeben
	return taste;
}