Professional Documents
Culture Documents
Una sola pantalla de 7 segmentos consta de siete (con decimales) y ocho individuales LED en una
carcasa comn. Por razones prcticas, una de las dos conexiones de cada LED est conectado a
las mismas conexiones del otro LED y llev a cabo desde el alojamiento conjunto. Esto ahorra
patillas de la vivienda y ms tarde en la unidad. Por lo tanto, hablamos de pantallas con nodo
comn (ing. nodo comn) o ctodo comn (ctodo eng. Comn).
Pin
asignacin de una de 7 segmentos
de visualizacin
.db
.db
.db
.db
.db
.db
.db
.db
.db
.db
0b11000000;
0b11111001;
0b10100100;
0b10110000;
0b10011001;
0b10010010;
0b10000010;
0b11111000;
0b10000000;
0b10010000;
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
a,
b,
a,
a,
b,
a,
a,
a,
a,
a,
b,
c
b,
b,
c,
c,
c,
b,
b,
b,
c, d, e, f
d,
c,
f,
d,
d,
c
c,
c,
e,
d,
g
f,
e,
g
g
g
f, g
d, e, f, g
d, f, g
Programa [Editar]
El programa de prueba proporciona sucesivamente los nmeros de 0 a 9 estn en el display
de 7 segmentos. El nmero correspondiente se emite en el Registro recuento y se incrementa
en el bucle 1. El registro alcanza el valor de 10, se restablece a 0 de nuevo. Tras el aumento
sigue un patrn de espera, lo que asegura que hasta el prximo nmero pasa de un cierto
tiempo. Normalmente usted no tiene este tipo de colas largas, pero aqu no viene sino para
esperar la activacin de un display de 7 segmentos. Para utilizar un temporizador para esto
sera demasiado esfuerzo al principio.
La salida real y por lo tanto la parte interesante de este artculo, sin embargo, inmediatamente
despus de la etiqueta de bucle en su lugar. La tabla de cdigos ya conocido
por .db Directiva (d efinir b en el YTE) memoria flash set. Puede acceder a ella a travs de la
Z-puntero y el comando lpm. Adems, antes de que el acceso ni el valor del registro
de recuento y por lo tanto el valor del contador actual a la Z-puntero aadido.
Debe tenerse en cuenta nicamente que el valor del contador debe duplicarse. Esto tiene la
siguiente razn: Si la tabla como se muestra aqu por medio de individuales .db.
Instrucciones estructurado, por lo que el ensamblador llama bytes de relleno entre los
bytes individuales de manera que cada .dbdeclaracin se encuentra en una direccin de
memoria recta. Esta es una consecuencia directa del hecho de que la memoria flash como las
palabras (16 bits) y no un byte (8 bits) se organiza. Pero debido a un .db en la tabla a la
siguiente .db hay una diferencia de 2 bytes, esto debe ser considerado en el clculo. En el
segundo ejemplo en esta pgina, esto se hace de manera diferente. All se muestra cmo se
puede solucionar a travs de una ortografa diferente de la mesa la generacin de los bytes de
relleno por el ensamblador.
Por la misma razn, el Z-puntero se carga con el 2 veces de la direccin inicial de la tabla. La
direccin inicial es utilizado por el ensamblador en wordwise abordar lpm quieren que la
direccin de acceso especificada como la direccin del byte.
Tambin es interesante que en el clculo de un registro se requiere, que incluye el 0. Esto se
debe a que no hay un comando en el AVR, puede aadir una constante con la consideracin
simultnea de los bits de acarreo. Por lo tanto, esta constante primero se debe cargar en un
registro y luego la adicin se puede hacer utilizando este registro. Lo interesante ahora es que
esta circunstancia se produce en muchos programas, y es la constante de 0 en las constantes
en la gran mayora de los casos. Muchos programadores se reservan por lo tanto, desde el
primer momento un registro para este propsito y lo llaman el Zero-registro. Lgicamente, su
compromiso con este registro en la zona r0..r15 debido a que estos registros son una segunda
tasa de bits (LDI, IPC, etc. no funcionan con ella).
.include "m8def.inc"
.def zero = r1
.def count = r16
.def temp1 = r17
.org 0x0000
rjmp
main
ldi
out
temp1, HIGH(RAMEND)
SPH, temp1
;
main:
; Reset Handler
ldi
out
temp1, LOW(RAMEND)
SPL, temp1
; Stackpointer initialisieren
ldi
out
temp1, $FF
DDRD, temp1
ldi
mov
count, 0
zero, count
ldi
ZL, LOW(Codes*2)
ldi
mov
temp1, count
add
temp1, count
; bercksichtigen
add
adc
ZL, temp1
ZH, zero
;
loop:
den
Tabelle
berechnen
lpm
r0 laden
out
PORTD, r0
inc
count
cpi
brne
ldi
count, 10
wait
count, 0
ldi
r17, 10
ldi
r18, 0
ldi
dec
brne
dec
brne
dec
brne
r19, 0
r19
wait2
r18
wait1
r17
wait0
;
Zhler
;
wait:
auf
wait0:
die
wait1:
wait2:
;
rjmp
loop
;
Codes:
bis 9
eine bestimmte
.db
.db
.db
.db
.db
.db
.db
.db
.db
.db
0b11000000
0b11111001
0b10100100
0b10110000
0b10011001
0b10010010
0b10000010
0b11111000
0b10000000
0b10010000
;
;
;
;
;
;
;
;
;
;
;
;
a,
b,
a,
a,
b,
a,
a,
a,
a,
a,
b,
c
b,
b,
c,
c,
c,
b,
b,
b,
c, d, e, f
d,
c,
f,
d,
d,
c
c,
c,
e,
d,
g
f,
e,
g
g
g
f, g
d, e, f, g
d, f, g
en el lado seguro, que las imgenes fijas aparecen en calma, cada segmento debe ser impulsado
al menos 100 Hz, por lo que por lo menos cada 10 ms volvi es. En casos excepcionales, sin
embargo, puede fluctuar incluso 100 Hz todava, por. Ejemplo, si el indicador se mueve rpido o
cuando se trata de fenmenos de interferencia con fuentes de luz artificial que funcionan con
corriente alterna.
reducida. Tambin hay que tener en cuenta que el Mega8 no puede proporcionar de manera
arbitraria o disipar mucho poder en la suma de sus pines del puerto y las lneas de
suministro. Tambin aqu, por lo tanto, una vista est unido a la hoja posterior y, opcionalmente, un
transistor debe ser utilizado como un amplificador (o etapas conductor acaba de terminar en forma
IC) de nuevo.
Programa [Editar]
El siguiente programa muestra una forma de multiplexacin. Para ello, se utiliza un temporizador,
uno de desbordamiento peridicamente en interrumpirfactores desencadenantes. Es dentro de la
rutina de interrupcin de desbordamiento
Dado que las funciones de interrupcin deben ser cortos, la rutina de interrupcin obtiene el
modelo dispensado para cada sitio directamente desde la SRAM, donde se ha producido la funcin
de salida. Esto tiene 2 ventajas:
El out_number funcin tampoco es algo inaudito en un formulario similar en otra parte: Utilizaron la
tcnica de continuas sustracciones a un nmero de un solo dgito para desmontar. Una vez que se
establece cada punto, el patrn de bits se busca en la tabla de cdigos, que se almacena para la
funcin de interrupcin en el lugar apropiado en la SRAM.
Atencin: En contraste con la variante mostrada por encima de la tabla de cdigos ha sido
creado sin bytes de relleno. De esta manera, se ha de considerar este tipo de bytes de relleno no
necesarios en la programacin.
El resto es de nuevo el puerto de inicializacin de costumbre, la inicializacin del temporizador y
una aplicacin sencilla usando un contador de 16 bits est aumentando de forma continua y
out_number de salida sobre la funcin. Aumento Contador por 1 y cumplir con las colas de un
cierto tiempo de retardo: Al igual que en el primer ejemplo, ningn esfuerzo ha estado aqu. En una
aplicacin real que, por supuesto, no hacerlo, sino tambin utilizar un temporizador para este
aspecto de la tarea.
Adems, incluso interesante. La funcin de interrupcin de desbordamiento se re-diseado de
manera que puedan funcionar de forma transparente el resto del programa. Esto significa que
todos los registros utilizados estn respaldados funcin cuando se llama a la interrupcin y
restaurados cuando se vaya.ste es en el lado seguro, sin embargo, tiene la desventaja de
"residuo" algn tiempo de la CPU para la copia de seguridad a veces innecesario y limpieza
para. De pie bastante registros gratuitos estn disponibles, entonces, por supuesto, no repetir este
esfuerzo, pero dejar algunos registros exclusivamente con el fin de tratar el display de 7 segmentos
y as ahorrar el costo de registro de ahorro (con la excepcin de SREG supuesto!).
.include "m8def.inc"
.def temp = r16
.def temp1 = r17
.def temp2 = r18
.org 0x0000
rjmp
.org OVF0addr
rjmp
main
; Reset Handler
multiplex
mltiplex ;; *****************************************
***************************; La multiplexacin funcin ;; Objeto de esta
funcin es en cada ejecutar una diferente ubicacin; el display de 7
segmentos para activar y siempre que los patrones; pasar; La funcin se
llama regularmente en un contador de tiempo de interrupcin ;; 6 bytes
utilizado en SRAM (ver .DSEG ms tarde en el programa); Patrones de bits
Digit Siguiente para la activacin de la prxima serie de sesiones;
Nmero de segmento siguiente de la prxima activa segmento; Patrn de
salida Segment0 para el segmento 0; Patrn de salida Segment1 para el
segmento 1; Patrn de salida Segment2 para el segmento 2; Patrn de
salida Segment3 para el segmento 3 ;; Siguiente segmento es simplemente
un contador que con cada llamada a la funcin; est en 1 y continuar el
conteo se restablecer a 0 en. 4; est acostumbrado a partir de la
direccin de Segment0 a que; cada siguiente modelo dispensado de
Segement0, Segment1 ,; Segment2 o acceso Segment3. La direccin de
Segment0 es; carga en el Z-puntero y Siguiente segmento agreg. ;;
Siguiente Dgito contiene el patrn de bits que se emite directamente
hacia el puerto C; es y la siguiente transistor convierte .; Estos
incluyen dgito siguiente al comienzo de el patrn de bits 0b11111110
que; se desplaza con cada llamada 1 lugar a la izquierda. La prxima vez;
Llamando se puede encontrar a continuacin, en 0b11111101 siguiente
temp1, 0
PORTC, temp1
PORTD, temp
temp1, NextDigit
einschalten
out
PORTC, temp1
lds
inc
temp, NextSegment
temp
sec
rol
temp1
cpi
brne
ldi
ldi
temp1, 0b11101111
multi1
temp, 0
temp1, 0b11111110
sts
sts
NextSegment, temp
NextDigit, temp1
reihum die
multi1:
pop
ZH
; die gesicherten Register
wiederherstellen
pop
ZL
pop
temp
out
SREG, temp
pop
temp1
pop
temp
reti
;
;************************************************************************
; 16 Bit-Zahl aus dem Registerpaar temp (=low), temp1 (=high) ausgeben
; die Zahl muss kleiner als 10000 sein, da die Zehntausenderstelle
; nicht bercksichtigt wird.
; Werden mehr als 4 7-Segmentanzeigen eingesetzt, dann muss dies
; natrlich auch hier bercksichtigt werden
;
out_number:
push
temp
push
temp1
ldi
_out_tausend:
inc
subi
sbci
brcc
temp2, -1
ldi
Codemuster fuer
ldi
nachschlagen
add
ZL, low(2*Codes)
ZH, high(2*Codes)
temp2
temp, low(1000)
temp1, high(1000)
_out_tausend
ZL, temp2
; -1000
lpm
sts
Segment3, r0
ablegen
; die OvI Routine sorgt dann duer
die Anzeige
ldi
_out_hundert:
dec
subi
sbci
brcs
ldi
entsprechende
ldi
add
temp2, 10
; die Hunderterstelle bestimmen
temp2
temp, low(-100)
temp1, high(-100)
_out_hundert
; +100
ZL, low(2*Codes)
ZH, high(2*Codes)
ZL, temp2
; Muster nachschlagen
lpm
sts
Segment2, r0
ldi
temp2, -1
_out_zehn:
temp2
temp, low(10)
temp1, high(10)
_out_zehn
ldi
ZL, low(2*Codes)
ldi
add
ZH, high(2*Codes)
ZL, temp2
; aufsuchen
lpm
sts
Segment1, r0
; -10
Codetabelle
ablegen
_out_einer:
subi
sbci
temp, low(-10)
temp1, high(-10)
ldi
ldi
add
ZL, low(2*Codes)
ZH, high(2*Codes)
ZL, temp
; ... Codetabelle
lpm
sts
Segment0, r0
pop
pop
temp1
temp
ret
;
;
*************************************************************************
*
;
main:
ldi
temp, HIGH(RAMEND)
out
SPH, temp
ldi
temp, LOW(RAMEND) ; Stackpointer initialisieren
out
SPL, temp
;
die Segmenttreiber initialisieren
ldi
temp, $FF
out
DDRD, temp
;
die Treiber fr die einzelnen
Stellen
ldi
temp, $0F
out
DDRC, temp
;
initialisieren der Steuerung fr
die
;
Interrupt Routine
ldi
temp, 0b11111110
sts
NextDigit, temp
ldi
sts
temp, 0
NextSegment, temp
ldi
out
ldi
out
sei
ldi
ldi
loop:
temp, 0
temp1, 0
inc
brne
inc
temp
_loop
temp1
_loop:
rcall
wait:
wait0:
wait1:
wait2:
out_number
cpi
brne
cpi
brne
ldi
ldi
temp, 0
temp1, 0
ldi
ldi
ldi
dec
brne
dec
brne
dec
brne
r21, 1
r22, 0
r23, 0
r23
wait2
r22
wait1
r21
wait0
rjmp
loop
Codes:
.db
0b11000000, 0b11111001
.db
0b10100100, 0b10110000
.db
0b10011001, 0b10010010
.db
0b10000010, 0b11111000
.db
0b10000000, 0b10010000
;
;
;
;
;
;
;
;
;
;
.DSEG
NextDigit:
.byte
Segments
NextSegment: .byte
Segment0:
.byte
Segment1:
.byte
Segment2:
.byte
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
a,
b,
a,
a,
b,
a,
a,
a,
a,
a,
b,
c
b,
b,
c,
c,
c,
b,
b,
b,
c, d, e, f
d,
c,
f,
d,
d,
c
c,
c,
e,
d,
g
f,
e,
g
g
g
f, g
d, e, f, g
d, f, g
1
1
1
1
;
;
;
;
Segment3:
.byte 1
; Ausgabemuster fr Segment 3
Espaol:
;---------------------------------------------------------------------------------------------------------------------------------------
.include
"m8def.inc"
pop
registro
pop ZL
pop temp
cabo SREG, temp
pop temp1
temp pop
reti ;; *******************************
*****************************************; Nmero de 16 bits de la temp
par de registro (= bajo), temp1 (= alto) de salida; El nmero debe ser
inferior a 10.000 que ser, porque los diez miles; no est considerado .;
Si ms de 4 displays de 7 segmentos utilizados, entonces esto debe ser;
son, por supuesto, tambin tenido en cuenta aqu;
out_number:
empujar temp
empuje temp1
LDI temp2, - 1; El dgito miles determinar
_out_tausend:
temp2 inc
Subi temperatura, baja (1000); -1000
Temp1 SBCI, alta (1000)
BRCC _out_tausend
LDI ZL, bajos (2 * cdigos); para ese dgito el patrn de
cdigo para
ZH LDI, alta (2 * cdigos); Busque la visualizacin en la
tabla de cdigos
aadir ZL, TEMP 2
lpm
pts Segment3,
R0; y almacenar este patrn en la SRAM;
Ovi rutina proporciona entonces Duer mostrar
LDI temp2, 10
_out_hundert :; el
dgito de las centenas determinar
diciembre temp2
Subi temperatura, baja (- 100); 100
temp1 SBCI, alta (- 100)
BRCS _out_hundert
LDI ZL, bajos (2 * cdigos); de nuevo en la tabla de cdigos
apropiado
LDI ZH, altos (2 * cdigos); Busque patrones
aaden ZL, TEMP 2
lpm
pts Segment2,
R0; y SRAM dejar
LDI temp2, - 1
_out_zehn :; las
decenas determinan
inc temp2
inc temp1
_loop:
rcall out_number
temp cpi, bajo (4000)
Brne esperar
temp1 cpi, alta (4000)
Brne esperar
temp LDI, 0
LDI temp1, 0 de espera:
LDI r21 , 1 WAIT0:
r22 LDI,
0 WAIT1:
r23 LDI, 0 wait2:
diciembre r23
Brne wait2
diciembre r22
Brne WAIT1
diciembre r21
Brne WAIT0
bucle rjmp cdigos: .db 0b11000000, 0b11111001; 0: a, b, c, d,
e, f; 1: b, c .db 0b10100100, 0b10110000; 2: a, b, d, e, g; 3: a, b, c,
d, g .db 0b10011001, 0b10010010; 4: b, c, f, g; 5: a, c, d, f, g .db
0b10000010, 0b11111000; 6: a, c, d, e, f, g; 7: a, b, c .db 0b10000000,
0b10010000; 8: a, b, c, d, e, f, g; 9: a, b, c, d, f, g .DSEG siguiente
dgito: .Byte 1; Patrones de bits para la activacin de la siguiente
segmento
Segmento Siguiente: .Byte 1; Nmero del prximo segmento activo
Segment0:
.Byte 1; Los patrones de gasto para el segmento 0
Segment1:
.Byte 1; Patrones de gastos para el segmento 1
Segment2:
.Byte 1; Patrones de gastos para el segmento 2
Segment3:
.Byte 1; Patrones de gastos para el Segmento 3