Paso 3: Cuatro dígitos de siete segmentos y manipulación de puertos
Añadir una pantalla de 4 dígitos siete segmentos para mostrar los valores a cambiar con codificadores. Decidí utilizar los dos primeros dígitos para mostrar el número de pasos por octava y los dos últimos dígitos de la base MIDI Nota.
He adquirido un cuatro común ánodo siete segmento dígitos. Según la hoja de datos de pines 6, 9, 10 y 12 son las patillas de dígitos. Estos pines se utilizan para la selección de cada uno de los cuatro dígitos. Los otros 8 pines son para siete segmentos más un punto decimal.
Puse resistencias de limitación actuales en cada uno de los pasadores de dígitos porque hay sólo 4. (Necesitaría 8 resistencias si pongo en los alfileres de segmento). La hoja de datos especifica una corriente constante máxima de 25 mA con un típico 2,2 voltios hacia adelante. He usado resistencias de 220 ohmios. Entonces usando la ley de Ohm las resistencias limitará la corriente a voltios (5-2, 2) 220 Ohmios = 12.7 mA, que está dentro del rango aceptable.
Conecté los pines de siete segmentos a los pines de Arduino solos digitales 12 2-13. Simplemente les conectado en un orden que facilita al alambre de arriba. Entonces usando la asignación de pines de la hoja de datos que especifica el Arduino pin en mi código con un montón de declaraciones de #define. Pensé que es más fácil adaptar el código que to un lío enredado de cables entre la pantalla y Arduino.
// arduino pin numbers for the seven segments and decimal point #define PIN_A 12 #define PIN_B 8 #define PIN_C 4 #define PIN_D 6 #define PIN_E 7 #define PIN_F 11 #define PIN_G 3 #define PIN_DP 5
// arduino pin numbers for the 4 digits #define PIN_1 13 #define PIN_2 10 #define PIN_3 9 #define PIN_4 2
Originalmente comencé usando la biblioteca SevSeg de arduino.cc. Trabajó también para la visualización de números, pero encontré que introdujo una cantidad significativa de la latencia con todas las llamadas digitalWrite()--7 segmentos y punto decimal veces 4 = 32 total. Así que decidí escribir mi propio código para escribir en las clavijas más eficientemente.
Para eso necesitaba conocer manipulación puerto. Los registros de dos datos PORTD y PORTB mapa a Arduino alfileres 0-7 y 8-15, respectivamente. Cuando el modo pin es configurado como salida, luego escribiendo un 0 o un 1 para estos registros resultado ajuste la clavija de baja o alta. Así que escribí el siguiente código para establecer rápidamente pernos de alto o bajo por escrito directamente al puerto correspondiente sin ninguna comprobación de errores.
pinHigh(int pin) { if (pin >= 2 && pin <= 7) { PORTD |= 1 << pin; } else if (pin >= 8 && pin <= 13) { PORTB |= 1 << (pin - 8); } }
pinLow(int pin) { if (pin >= 2 && pin <= 7) { PORTD &= ~(1 << pin); } else if (pin >= 8 && pin <= 13) { PORTB &= ~(1 << (pin - 8)); } }