Temporización: idealmente, usted quiere un perfectamente a tiempo de multiplexación, y entonces pensamos de las interrupciones de temporizador, donde manejar el controlador de pantalla en el ISR. Pero ahí está la Ley: salir de Informes tan pronto como sea posible. Que significa establecer un indicador, para el bucle principal, hacer un par de cosas básicas, y fuera.
La real se llama controlador en el bucle principal. Esto es, básicamente, una lista de los cheques de las tareas que deben realizarse:
if 32ms timer expired then do keypad scan
if display flag set then do display routine
etc.
Dependiendo de su aplicación, esta puede ser una lista larga, y el peor de los casos todos los indicadores se establecen en el mismo tiempo y, a continuación, todas las rutinas deben ser ejecutadas en el mismo bucle principal. Que provocará un bucle principal que de vez en cuando tomar un largo tiempo, y en otros momentos muy corto. Este no es siempre un problema, pero para nuestra pantalla podría significar el parpadeo. Solución: asegúrese de que no todas las rutinas tienen que ser ejecutados al mismo tiempo, por la intercalación de ellos. La primera vez que solo la bandera de larga rutina de Una, la próxima vez que larga rutina de B. Corto rutinas y rutinas con prioridad siempre son verificadas.
De esa manera usted puede mantener el bucle principal tan corto como unos pocos ms, con poca variación. También puede sincronizar el bucle principal a un temporizador, por lo que siempre lleva el mismo tiempo. Esto hará que algunos tiempos muertos, así que tendrás que ver si usted puede permitirse el lujo de que. Si usted puede, usarlo para poner el controlador dormido, entonces usted puede disminuir la potencia un poco. Hacer la rutina de presentación en primer lugar, para que permanezca en sincronía.
Si usted multiplexación de ir a por algunas columnas como sea posible, esto aumentará la multiplexación en frecuencia. Si el bucle principal, que dura de 3 ms y tiene 8 columnas para escanear, haga un escaneo completo tomará 24 ms, que es 41 Hz, que es sólo acaba de ACEPTAR. Si usted puede reordenar la matriz y disminuir el número de columnas a las 6 de la frecuencia aumentará a 56 Hz. Este 4-columna de instalación de actualización en el 83 Hz.
Entonces, ¿qué hacemos? En el tiempo de referencia apagar todos los LEDs, por lo que la fila del puerto de alta o baja, dependiendo de su configuración. Girar la columna de bits a la siguiente columna y establecer que en el puerto de salida. A continuación, busque la fila patrón para que la columna en la pantalla de la tabla, y establece que en la fila del puerto. Y listo. Si es lo único que no podía que se han hecho en el ISR? Posiblemente, pero la configuración de la fila o de la columna de salida (o ambos) puede significar también desplazar los datos a un par de integrado 74hc595 registros de desplazamiento y, a continuación, se tarda mucho más tiempo.
edición de volver a tu comentario
Voy a utilizar los cuatro display de 7 segmentos como un ejemplo. La primera cosa que usted necesita es un 7-segmento de la tabla de búsqueda:
' abcdefg.
sevenseg db 0b11111100 ;0
db 0b01100000 ;1
db 0b11011010 ;2
db 0b11110000 ;3
db 0b01100110 ;4
db 0b10110110 ;5
db 0b10111110 ;6
db 0b11100000 ;7
db 0b11111110 ;8
db 0b11110110 ;9
Entonces el dígito de valores. Si usted generar estos sí mismo es más fácil si se utiliza un byte (contador) para cada dígito. Si se trata de un contador que vas a tener que lidiar con lleva de un dígito a la siguiente, pero eso es todavía más fácil que la conversión de 16 bits binario a BCD. Para un RTC necesitará separar los contadores de horas y minutos de todos modos. Si los datos binarios, por ejemplo procedentes de un sensor digital de temperatura, entonces usted necesita un binario a BCD rutina de conversión. Voy a asumir que usted tiene una de cuatro bytes de la matriz con los dígitos para cada pantalla.
digits ds 4; 4 digits, each 0..9
column ds 1; shifts a "1" through bits 0..3
colcount ds 1; column index, 0..3
Voy a escribir el resto en una especie de pseudo-código, de modo que usted puede convertir fácilmente a C o ensamblador.
; display routine
set port2 to 0b00000000 ; clear display
increment colcount
if colcount > 3 then
colcount = :0
column := 1 shift left colcount bits
set port1 to column ; digit is selected
a := digits[colcount] ; digit value
a := sevenseg[a] ; digit value encoded into 7-segment pattern
set port2 to a ; output 7-segment pattern
return ; all done, go to have a beer
Leer más:
BCD aritmética: Atmel nota de aplicación describe rutinas de conversión de binario a BCD y viceversa. Controlador independiente, así que no sólo AVR.