Girar una pantalla de 7 segmentos en el firmware

1

Tengo una placa con una pantalla de 7 segmentos controlada por un AVR. Necesito rotar los caracteres de la pantalla en el firmware, para que la pantalla se lea correctamente cuando se gira físicamente 180 grados.

Actualmente, la pantalla tiene una salida definida por:

#define SEVEN_SEGMENT_PATTERN_0     0x7B
#define SEVEN_SEGMENT_PATTERN_1     0x09
#define SEVEN_SEGMENT_PATTERN_2     0xB3
#define SEVEN_SEGMENT_PATTERN_3     0x9B
#define SEVEN_SEGMENT_PATTERN_4     0xC9
#define SEVEN_SEGMENT_PATTERN_5     0xDA
#define SEVEN_SEGMENT_PATTERN_6     0xFa
#define SEVEN_SEGMENT_PATTERN_7     0x0B
#define SEVEN_SEGMENT_PATTERN_8     0xFB
#define SEVEN_SEGMENT_PATTERN_9     0xDB

#define SEVEN_SEGMENT_PATTERN_A     0xEB
#define SEVEN_SEGMENT_PATTERN_B     0xF8
#define SEVEN_SEGMENT_PATTERN_C     0x72
#define SEVEN_SEGMENT_PATTERN_D     0xB9
#define SEVEN_SEGMENT_PATTERN_E     0xF2
#define SEVEN_SEGMENT_PATTERN_F     0xE2

#define SEVEN_SEGMENT_PATTERN_G     0xdb
#define SEVEN_SEGMENT_PATTERN_H     0xE9
#define SEVEN_SEGMENT_PATTERN_I     0x09
#define SEVEN_SEGMENT_PATTERN_J     0x19
#define SEVEN_SEGMENT_PATTERN_L     0x70
#define SEVEN_SEGMENT_PATTERN_O     0x7b
#define SEVEN_SEGMENT_PATTERN_P     0xe3
#define SEVEN_SEGMENT_PATTERN_R     0xa0
#define SEVEN_SEGMENT_PATTERN_S     0xda
#define SEVEN_SEGMENT_PATTERN_U     0x79

#define SEVEN_SEGMENT_PATTERN_DOT   0x04

Por supuesto, podría usar esto para extraer el pinout de la pantalla y descubrir manualmente las nuevas definiciones para los caracteres volteados. Sin embargo, esto llevaría mucho tiempo y creo que debe haber una manera más inteligente.

Algunos permanecerían igual cuando se volteaban, como SEVEN_SEGMENT_PATTERN_0 . Algunos serán fáciles de voltear si supiera el pinout, como SEVEN_SEGMENT_PATTERN_1 .

¿Hay algún algoritmo inteligente o algo que pueda ayudarme a calcular los valores invertidos?

    
pregunta veor

4 respuestas

3

Parece que el pinout es, desde la mayoría hasta el bit menos significativo, G F E D C punto A B.

Podrías escribir un código a lo largo de las líneas de

rotatedChar=0;
if (char & 0x01) rotatedChar|=0x20;
if (char & 0x02) rotatedChar|=0x10;
// six more lines here.
    
respondido por el Chris Johnson
2

El orden inicial de los segmentos es GFEDCPAB y se debe cambiar a GCBAFPDE. G y P se quedan en sus lugares. B, D, F se giran tres posiciones a la derecha. A, C, E se rotan tres posiciones a la izquierda. Los AVR no pueden hacer cambios circulares fácilmente, por lo que los datos se intercambian dos veces para evitar cambios entre LSB y MSB.

unsigned char dataout;
asm volatile("swap %0" : "=r" (datain) : "0" (datain));
dataout = ((datain & 0x15)<<2)|(datain & 0xa2))>>1;
asm volatile("swap %0" : "=r" (datain) : "0" (datain));
dataout |= datain & 0x84;
    
respondido por el venny
0

La respuesta anterior resolvió esto. La función de reasignación se ve así en Python (para pruebas):

def rotate(char):
    rotatedchar = 0
    if (char & 0x01):
        rotatedchar += 0x20
    if (char & 0x02):
        rotatedchar += 0x10
    if (char & 0x04):
        rotatedchar += 0x04
    if (char & 0x08):
        rotatedchar += 0x40
    if (char & 0x10):
        rotatedchar += 0x02
    if (char & 0x20):
        rotatedchar += 0x01
    if (char & 0x40):
        rotatedchar += 0x04
    if (char & 0x80):
        rotatedchar += 0x80
    return rotatedchar
    
respondido por el veor
0

Puede ser una optimización innecesaria, pero en general, & es más rápido que if , por lo tanto, usa la codificación de La respuesta de Chris , podemos obtener:

rotch = ch&0x84 + (ch & 0x0a) << 3 + (ch & 0x50) >> 3 + (ch & 0x01) << 5 + (ch & 0x20) >> 5

Esto viene del hecho de que:

  • para 0x08 y 0x02 en ch (G, punto), los mantenemos
  • para 0x40 y 0x10 en ch (F, D), los cambiamos 3 bits a la derecha en rotch (a C, A)
  • etc.

Esto es más rápido y es de una sola línea. Desde el código en sí, es obvio que es solo un poco, pero aleatorio, pero puede ser conveniente comentarlo bien.

    
respondido por el yo'

Lea otras preguntas en las etiquetas