Paso 10: El código Real
26 de diciembre de 2009: Nuevo código! Se registra donde estaba el antiguo código. Muchas gracias a Jacob para la simplificación. Realmente funciona bien.
Aquí está. Gracias por leerme y no olvides votar!
#include < avr/io.h > #include < avr/interrupt.h > #include < util/delay.h > / Establece o borra los bits de registros #define setBit (sfr, bit) (sfr | = (1 << poco)) #define clearBit (sfr, bit) (sfr & = ~ (1 << poco)) flipBit #define (sfr, bit) (sfr ^ = (1 << poco)) #define falso 0 #define cierto 1 #define matrixX(x) (PORTA = (x - 1) << 5) #define matrixGY(y) (PORTD = y) #define matrixRY(y) (PORTB = y) retardo nulo (unsigned int retardo) { } unsigned int x = 0; While(x < Delay) { x++; } } initMatrix() void { } DDRD = 0xFF; / / verde control DDRB = 0xFF; / / control de rojo DDRA = 0xE0; / / control de la tierra } void matrixRowDraw (char greenmask, redmask char, columna char) { } matrixX(column); int i = 0; for(i = 0; i < 8; i++) { } matrixGY (greenmask & (1 << i)); matrixRY (redmask & (1 << i)); _delay_us(150); } matrixGY(0x00); matrixRY(0x00); } matrixLeft() void { } matrixRowDraw (0 x 10, 0, 1); matrixRowDraw (0 x 20, 0, 2); matrixRowDraw (0 x 40, 0, 3); matrixRowDraw (0xFF, 0, 4); matrixRowDraw (0xFF, 0, 5); matrixRowDraw (0 x 40, 6, 0); matrixRowDraw (0 x 20, 7, 0); matrixRowDraw (0 x 10, 8, 0); } matrixRight() void { } matrixRowDraw (0x18, 0, 1); matrixRowDraw (0x18, 0, 2); matrixRowDraw (0x18, 0, 3); matrixRowDraw (0x18, 0, 4); matrixRowDraw (0x99, 0, 5); matrixRowDraw (0x5A, 6, 0); matrixRowDraw (0x3C, 7, 0); matrixRowDraw (0x18, 0, 8); } adcInit() void {} ADMUX = 0x60; ADCSRA = 0 x 80; } adcGet(char chan) char { } ADMUX = 0x60 | chan; ADCSRA | = 0 x 40; mientras que (bit_is_clear (ADCSRA, ADIF)); volver ADCH; } char adcAvg (char chan, char avgnum) / / media sólo hasta 256 muestras { } int i = 0; unsigned int total = 0; for(i = 0; i < avgnum; i++) { += total adcGet(chan); } retorno total/avgnum; } int main() { initMatrix(); adcInit(); while(1) { } mientras que (adcAvg (3, 50) > 0x45 & adcAvg(2,50) > 0x70) / / los valores hexadecimales aquí deben cambiar dependiendo de la configuración de los usuarios para determinar la sensibilidad de los sensores de flexión. { if(adcAvg(1, 50) > 0x4F) { matrixRight(); } if(adcAvg(1, 100) < 0x4F) { matrixLeft(50); } } } return 0; }
Agradecimiento especial a los chambelanes, mis padres y amigos que ayudaron.