Étape 10 : Le Code réel
26 décembre 2009: Nouveau CODE ! Il est posté où était l’ancien code. Merci à Jacob de simplification. Il fonctionne vraiment bien.
C’est ici. Merci pour la lecture et n’oubliez pas de voter !
#include < avr/io.h > #include < avr/interrupt.h > #include < util/delay.h > / / Active ou désactive les bits dans les registres #define setBit (sfr, bit) (sfr | = (1 << bit)) #define clearBit (sfr, bit) (sfr & = ~ (1 << bit)) #define flipBit (sfr, bit) (sfr ^ = (1 << bit)) #define faux 0 #define vrai 1 #define matrixX(x) (PORTA = (x - 1) << 5) #define matrixGY(y) (PORTD = y) #define matrixRY(y) (PORTB = y) Sub delay (retard unsigned int) { } unsigned int x = 0; while(x < Delay) { x++; { } initMatrix() void { DDDR = 0xFF; / / vert contrôle DDRB = 0xFF; / / Red control DDRA = 0xE0; / / Ground control } Sub matrixRowDraw (colonne de type char, char greenmask, char redmask) { } 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, 0, 6); matrixRowDraw (0 x 20, 0, 7); matrixRowDraw (0 x 10, 0, 8); } matrixRight() void { matrixRowDraw (0 x 18, 0, 1); matrixRowDraw (0 x 18, 0, 2); matrixRowDraw (0 x 18, 0, 3); matrixRowDraw (0 x 18, 0, 4); matrixRowDraw (0x99, 0, 5); matrixRowDraw (0x5A, 0, 6); matrixRowDraw (0x3C, 0, 7); matrixRowDraw (0 x 18, 0, 8); } adcInit() void { ADMUX = 0 x 60 ; ADCSRA = 0 x 80 ; } char adcGet(char chan) { ADMUX = 0 x 60 | chan ; ADCSRA | = 0 x 40 ; tandis que (bit_is_clear (ADCSRA, ADIF)) ; retour ADCH ; } char adcAvg (chan de char, char avgnum) / / moyen seulement jusqu'à 256 échantillons { int i = 0; total unsigned int = 0; for(i = 0; i < avgnum; i++) { total += adcGet(chan) ; } retour total/avgnum ; } int main() { initMatrix(); adcInit() ; while(1) { tandis que (adcAvg (3, 50) 0 x 45 > & adcAvg(2,50) > 0 x 70) / / les valeurs hexadécimales ici devraient être changés selon le paramétrage des utilisateurs pour déterminer la sensibilité des capteurs flex. { if(adcAvg(1, 50) > 0x4F) { matrixRight(); } if(adcAvg(1, 100) < 0x4F) { matrixLeft(50); } } } return 0; }
Remerciements les eunuques, mes parents et amis qui ont aidé.