Beruflich Dokumente
Kultur Dokumente
Hardware 8031
1. Enunciat
Això significa que hem seleccionat la persona 2 i que li falten per comprar 2
unitats del producte 3, 3 del producte 1 i 5 del producte 2. El format per
escriure la informació ho podeu fer com vulgueu, però si no cap tot a la
pantalla haureu de fer lletres amb desplaçament o anar canviant a una
segona pantalla, etc...
2.1. Hardware
Per a fer-ho possible s’han utilitzat com a adreces falses de la flash des
de 15...18 gràcies als bits baixos del P1 del 8031 (veure apartat 2.1.4).
Des de les dades hem de veure tots els perifèrics que utilitzem a més de
la flash ja que en aquesta hi guardem totes les mostres. Per tant el
mapa queda de la següent forma:
!A15 CS_FASH
CS_FASH
CS_FASH
Placa 8031 4
Per a generar tots els senyals de control de la pràctica hem usat una
GAL22V10. No és l’ús més recomenat en muntatge de plaques però pel
cas que ens ocupa li hem de veure 3 factors a favor:
1. És la primera pràctica amb un 8031 i per tant els errors són
possibles. La GAL permet regrabar.
2. És una pràctica i per tant el comput de hardware surt clarament
inferior a utilitzar portes lògiques. Menys a soldar, menys temps.
3. Un cop acabada la pràctica, tot es desmunta i cap a la capsa de
nou. No existeix problema de fallida a la GAL
+5
U3
24
2 14
A15 AF18
VCC
3 I1 I/O0 15
A14 I2 I/O1 AF17
4 16
A13 I3 I/O2 AF16
5 17
!RD I4 I/O3 AF15
6 18
!PSEN I5 I/O4 !OE_FLASH
7 19
!WR I6 I/O5 !CS_BOTON
8 20
A15_FALSA I7 I/O6 !CS_DAC
9 21
A16_FALSA I8 I/O7 CS_LCD
10 22
A17_FALSA I9 I/O8 !CS_FLASH
11 23
A18_FALSA I10 I/O9 !CS_ROM
13
I11
GND
1
CLK/I0
12
PALCE22V10
PIN 23 NO_CSROM
PIN 22 NO_CSFLASH
PIN 21 CSLCD
PIN 20 NO_CSDAC
PIN 19 NO_CSBOTON
PIN 18 NO_OEFLASH
PIN 17 A15_FLASH
PIN 16 A16_FLASH
Placa 8031 5
PIN 15 A17_FLASH
PIN 14 A18_FLASH
2.1.4. El Microprocessador
Per multiplexar la part baixa de les direccions usem un 573 que és més
útil que el 373 per la disposició dels pins.
2.1.5. La memoria
L’Output Enable de la flash está format per !PSEN i !RD per a fer
possible que aquesta la veiem tant des del mapa de codi com del de
dades.
0x00000h
Telecàrrega
EPROM (32Kb)
0x08000h
Codi programa
principal
(32Kb)
0x28000h
Mostres àudio
“0”
FLASH
…
0xCA000h
Mostres àudio
“20”
0x??000h
Placa 8031 6
S’ha configurat el port sèrie en Mode 1. Amb aquest mode el baud rate
és variable.
K ·Cristall
TH 1 = 256 −
384·Baud Rate
Per a adaptar els nivells de tensions del RS232 del PC i la placa hem
utilitzat un MAX232.
2.1.7. Perifèrics
2.1.7.1. Teclat
El teclat consta de 10 tecles (del 0 al 9). Fem ús d’un buffer 244
que ens permetrà, amb un sol batec de clock, posar i llegir files i
columnes.
Per a fer-ho possible conectem les adreces a les files i les dades
a les columnes. Quan llegim d’una columna, els bits d’adreces
corresponents a aquesta columna estaran a “1” i només haurem
de mirar el valor del bus de dades. Òbviament la columna haurà
d’anar rotant. Tota aquesta feina sense inteferir la resta de
programa.
Cal tenir en compte, que aquest teclat produeix rebots, per tal
d’evitar-los, hem fet servir el timer intern per deixar un petit
temps d’espera i així evitar-los.
botonera:
lcall programa_timer_0_botonera
mov dph, #port_boton
mov dpl, columna_actual
movx a, @dptr ; Aixequen les Ai i llegim les Di
anl a, #0Fh
cjne a, #00h, hay_boton
mov flag_boton, #00h
sjmp botonera_fin
Placa 8031 7
hay_boton:
lcall espera_timer_0
lcall espera_timer_0
lcall espera_timer_0
mov fila_actual, a
lcall decodifica_tecla
mov flag_boton, #01h
botonera_fin:
lcall incrementa_columna
ret
2.1.7.2. LCD
Es un display de 16 caracters x 2 files. El controlem com a
qualsevol perifèric mitjançant un Chip Select que funciona per
lògica positiva.
.org 6C00h
;* Post Pone una letra en el LCD
;* Necesita: letra en registro A
;* Modifica: a,dptr
pon_letra:
mov dptr, #port_lcd_wd
movx @dptr, a
lcall espera_respuesta_display
ret
...
mov dptr,#mensaje_lcd
lcall outstr
...
mensaje_lcd: db 'Mensaje en el Lcd\',0
...
pon_mensaje_lcd_sigue:
push dph
push dpl
lcall envia_caracter
lcall espera_respuesta_display
pop dpl
Placa 8031 8
pop dph
inc dptr
sjmp outstr
pon_mensaje_lcd_fin:
ret
2.1.7.3. DAC
Donat que hem de reproduir diferents sons per un altaveu hem
fet ús d’un conversor digital analògic de 8 bits. La seva
freqüència de treball és més que suficient per a aplicacions
d’àudio com la nostra.
Per aixó hem fet servir el timer 0 (ja que el timer 1 es utilitzat pel
port sèrie), tant per controlar aquest temps com el temps
d’espera del rebots del teclat. Les funcions són:
init_timer_0:
mov tmod, modo_timer
mov th0, espera_timer_0_h
mov tl0, espera_timer_0_l
clr tr0
ret
D0
D1
D2
D3
D4
D5
+5
D6
D7
+5
40
20
U1 U2
31 39 2 19
A0
VCC
VCC
EA/VP P0.0 38 3 D1 Q1 18
P0.1 D2 Q2 A1
+5 19 37 4 17
X1 P0.2 D3 Q3 A2
Y 36 5 16
P0.3 D4 Q4 A3
35 6 15
11.05M P0.4 D5 Q5 A4
PUSH1 18 34 7 14
X2 P0.5 D6 Q6 A5
RESET COSC2 33 8 13
P0.6 D7 Q7 A6
COSC1 32 9 12
22p P0.7 D8 Q8 A7
CReset 9
22p RESET 21 11
GND
33n P2.0 A8 ALE C
22 1
P2.1 A9 OC
12 23
INT0 P2.2 A10
13 24 54ABT573
INT1 P2.3 A11
10
14 25
T0 P2.4 A12
R1 +5 15 26
T1 P2.5 A13
27
33k P2.6 A14
1 28
AF15 P1.0 P2.7 A15
2
AF16 P1.1
R2 3 17
AF17 P1.2 RD !RD
4 16
10k AF18 P1.3 WR !WR
5 29
P1.4 PSEN PSEN
6 30
P1.5 ALE/P ALE
2
7 11
P1.6 P1.6 TXD TX
VSS
+5 J2 8 10
P1.7 P1.7 RXD RX
B2S
80C31
20
+9 J1
R3
1
1
10k 2
+5 CON2
U3 +5
24
2
J3 2 14 U4
A15 AF18
VCC
3 I1 I/O0 15 +9 D1 UPC7805 D2
B2S A14 I2 I/O1 AF17
4 16 1 2
GND
A13 I3 I/O2 AF16 IN OUT
5 17 CReg
!RD I4 I/O3 AF15 D1N4001
6 18 RLED
1
3
A15_FALSA I7 I/O6 !CS_DAC
9 21
A16_FALSA I8 I/O7 CS_LCD
10 22
A17_FALSA I9 I/O8 !CS_FLASH
11 23
A18_FALSA I10 I/O9 !CS_ROM
13
I11
GND
1
CLK/I0
12
PALCE22V10
Title
80C31 i Chip Selects
U5
10 11
A0 A0 O0 D0
9 12
A1 A1 O1 D1
8 13
A2 A2 O2 D2
7 15
A3 A3 O3 D3
6 16
A4 A4 O4 D4
5 17
A5 A5 O5 D5
4 18
A6 A6 O6 D6
3 19
A7 A7 O7 D7
25
A8 A8
24
A9 A9
21 +5
A10 A10
23
A11 A11
2 28
A12 A12 VCC
26 14
A13 A13 GND
27
A14 A14
20
!CS_EPROM CE
22
!PSEN OE
1
VPP
27C256
+5
32
U6
12 13
A0
VCC
11 A0 DQ0 14
A1 A1 DQ1
10 15
A2 A2 DQ2
9 17
A3 A3 DQ3
8 18
A4 A4 DQ4
7 19
A5 A5 DQ5
6 20
A6 A6 DQ6
5 21
A7 A7 DQ7
27
A8 A8
26
A9 A9
23
A10 A10
25
A11 A11
4
A12 A12
28
A13 A13
29
A14 A14
3
AF15 A15
2
AF16 A16
30
AF17 A17
1
AF18 A18
24
!OE_FLASH OE
22
!CS_FLASH CE
VSS
31
!WR WE
16
AM29F040/LCC
Title
Memòries
+5
16
U7
13 12
TXD RX
VCC
8 R1IN R1OUT 9
11 R2IN R2OUT 14
TX T1IN T1OUT RXD
10 7
T2IN T2OUT
1u CMax1
1
C+
3
1u CMax2 C1-
4
C2+
+5 5
CMax3 C2-
2
V+
6
GND
CMax5 V-
10u
15
MAX232
P1
1
6
2
RXD
7
3
TXD
8
4
9
5
CONNECTOR DB9
+5
CBy pass_1 CBy pass_2 CBy pass_3 CBy pass_4 CBy pass_5 CBy pass_6 CBy pass_7
22n 22n 22n 22n 22n 22n 22n
Title
RS232
U10
+5 AUDIO
+5 2 18 +5
AUDIO OUTA VDD
RCon J5
+5 1 6 RVOL
1 OUTB DGND
10K 2 U4
6
1
20 3 10K
3 OUTC VSS 3 Calt2
A1 + J1
4 19 5 7 5
A0 5 OUTD AGND 1
+5 2
!CS_LCD 6 - 250u 2
14 4 LM386
D0 7 D0 D0 REF
13 Calt1 CON2
D1 8 D1 D1
12
4
8
D2 9 D2 D2 0.05u
11
D3 10 D3 D3
10 15 Ralt1
D4 11 D4 D4 !WR !CS_DAC
9
D5 12 D5 D5 1k
8
D6 13 D6 D6
7
A0
A1
D7 14 D7 D7
LCD TLC7226 17
16
Title
Perif èrics
2.2. Software
a) Códi:
:04800000029C373275
Atoi(‘A’)=65
Atoi(‘B’)=66
Transferència sèrie de ‘65’
Placa 8031 14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PORT SERIE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.org 6400h
;* Post: Inicializa puerto serie a 9600 bps
init_serie:
mov scon, #50h
mov tmod, #20h
mov th1, #fdh
setb tr1
setb ti
ret
.org 6500h
;* Post: Espera hasta que recibe un byte por el puerto serie.
;* Devuelve el valor en A.
inchar:
jnb ri, inchar
clr ri
mov a, sbuf
ret
.org 6600h
;* Post: Tx por el bit serie un byte en ascii
;* Necesita: dada_a_tx_serie
outchar:
jnb ti, outchar
clr ti
mov sbuf, dada_a_tx_serie
ret
.org 6700h
;* Post:Coge dos caracteres del puerto serie y forma un byte hexa
;* Retorna en A
;* Modifica: a,r0
gethex:
push dptr
lcall inchar
lcall outchar
lcall atoh
swap a
mov r0, a
lcall inchar
lcall outchar
lcall atoh
orl a, r0
lcall calcula_checksum
pop dptr
ret
b) Telecàrrega de mostres:
Placa 8031 15
Caràcter
Pasos 1 2 3 4 5
1 1 8 0 0 0
2 0 E C E
3 8 0
... ... ...
5 1 2
6 F 3
#include "mercado.h"
#include "graficos.h"
#include "placa.h"
extern "C"{
#include "tadsio.h"
}
int EstadoSerie,valor;
int *Codes;
int persona;
int Producto;
//////////////////////////////////////////////////////////////
// INICIALIRZA EL PORT SERIE //
//////////////////////////////////////////////////////////////
void PL_init(){
if(Si_Init(SI_COM1,b_9600,SI_WORD_8,SI_PAR_NONE)==SI_NO_SIO)
GR_PintaEstatPort(0);
else GR_PintaEstatPort(1);
EstadoSerie=0;
}
////////////////////////////////////////////////////
// MOTOR DE LA SIO //
////////////////////////////////////////////////////
void PL_motor(void){
switch(EstadoSerie){
case 0:{// Miramos si tenemos algun valor por el puerto serie
if (Si_CharAvail()!=0) EstadoSerie=1;
break;}
case 1:{// Cogemos el valor del puerto
valor=Si_GetChar();
if(valor==VALOR_INICIO){
EstadoSerie=2;
Si_PutChar(VALOR_OK);
}
else {
Si_PutChar(VALOR_KO);
EstadoSerie=0;
}
break;}
case 2:{// Esperamos las decenas de la persona
if (Si_CharAvail()!=0){
EstadoSerie=3;
valor=Si_GetChar();
Si_PutChar(VALOR_OK);
persona=valor*10;
}
break;}
case 3:{// Esperamos las unidades de la persona
if (Si_CharAvail()!=0){
valor=Si_GetChar();
persona=persona+valor;
if (ME_ExistePersona(persona)==VALOR_OK){
Si_PutChar(VALOR_OK);
EstadoSerie=4;
}
else{
Si_PutChar(VALOR_KO);
EstadoSerie=0;
}
}
break;}
case 4:{// Buscamos la persona y cogemos sus paquetes
Codes=ME_IluminaPersona(persona);
Producto=0;
EstadoSerie=5;
Placa 8031 17
break;}
case 5:{// Enviamos los productos
if(Producto==8){
EstadoSerie=8;
}
else{
if (Codes[Producto]!=0){
Si_PutChar(Producto+1);
EstadoSerie=6;
}
else{
Producto++;
}
}
break;}
case 6:{//Seguimos enviando los productos
if (Si_CharAvail()!=0){
valor=Si_GetChar();
Si_PutChar(Codes[Producto]);
EstadoSerie=7;
}
break;}
case 7:{//Esto dura demasiado
if (Si_CharAvail()!=0){
valor=Si_GetChar();
Producto++;
EstadoSerie=5;
}
break;}
case 8:{//Envia final de tx
Si_PutChar(0x09);
EstadoSerie=9;
break;}
case 9:{//rRecibe constestacion
if (Si_CharAvail()!=0){
valor=Si_GetChar();
EstadoSerie=0;
}
break;}
}
}
/////////////////////////////////
// Se cierra el tema
/////////////////////////////////
void PL_End(void){
Si_ResetRx();
Si_End();
}
Placa 8031 18
• La primera CPU que vam comprar va ser una INTEL. El resultat va ser que
no donava suficient corrent i les senyals que anaven a parar a la GAL
s’amorraven. La solució va ser incloure pull-ups als bits del P1 i al !RD i
!WR. Les dues últimes setmanes abans de l’entrega la vam cambiar per
una PHILIPS. Tot va començar a funcionar millor, psicològic però part de
raó tenim.
• Hem aprés, després de patir molt, que quan es monta la placa és
indispensable testejar-la amb el Reset soldat, la CPU i la EPROM. Per no
dir alimentació i massa. En cas de que no hi hagi EPROM la CPU salta a
executar “no sabem que” i executa HALT el que fan que pari l’oscil·lació i el
més important, que es pugui confondre amb un problema del circuit de
clock. Ull!
• Muntar una placa des de 0 és un bon camí d’aprenentatge, bravo! Només
dir que les plaques wriwrap són un niu d’errors i els cables només fan que
portar problemes. De totes formes és també una manera de trobar averies.
• Hem de destacar que l’assembler del 8031 és molt agraït. Es nota l’evolució
des del Z80 amb estructures com “cjne” entre d’altres. Hem provat
compiladors de C però per la feina a desenvolupar no ha estat necessari.
• S’ha hagut de fer servir un timer per evitar el rebots que produeix el teclat.
D’aquesta manera s’eviten repeticions inexistents d’una tecla.
• Hem tingut problemes amb el LCD, no pel desconeixement del chip (ja ho
havíem fet servir) sinó perquè en principi no anava bé, i més tard, interferia
en el bus de dades a causa d’un mal contacte causat per col·locar-lo
malament en un zòcal.
Placa 8031 19
lcall incrementa_adreca_flash
; Final Escritura flash
TELECARGA_FICHEROS:
mov a,numero_bytes mov a,#numero_de_ficheros
dec a mov fichero_actual, a
mov numero_bytes,a ;lcall esborra_tots_sectors
cjne a,#0h, recibe_valores_de_datos
bucle_telecarga_audio:
recibe_checksum: lcall resetea_lcd
lcall gethex ; cogemos el valor del checksum lcall MUESTRA_MENU_TELECARGA_AUDIO
mov a, suma_checksum mov a, #valor_ok_transferencia
jz continua ; si la suma no es zero (parte baja) el mov dada_a_tx_serie, a
checksum está mal
ljmp error coge_pagina_fichero:
lcall inchar
continua: lcall outchar
lcall outchar ; paso de línea lcall atoh
ljmp inicio_lee_linea anl a, #0fh
mov pagina_fichero, a
final_de_transferencia: mov p1, a
lcall gethex ; De la ultima linia falta el checksum
lcall outchar coge_direccion_fichero:
ljmp SALTA_FLASH ; Parte alta
lcall gethex
error: mov adreca_escriure_alt, a
mov a, #valor_no_ok_transferencia
mov dada_a_tx_serie, a ; Parte baja
lcall outchar lcall gethex
ljmp MAIN mov adreca_escriure_baix, a
coge_longitud_fichero:
; Parte alta
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; lcall gethex
; TELECARGA FICHEROS mov r1, a
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Parte baja
;* Post: Realiza toda la telecarga de los ficheros de audio lcall gethex
;* Modifica: a,b,dptr,r0 clr c
; addc a, adreca_escriure_baix
; Formato TEXTO & WAV mov final_fichero_baja, a
;1(0) 8(0) 0(0) 0(0) 0(0)
; 49(0) 56(0) 48(0) 48(0) 48(0) ; Parte alta con el carry de la baja si tiene
;0(0) 0(0) 0(0) A(0) mov a, r1
; 48(0) 48(0) 48(0) 65(0) addc a, adreca_escriure_alt
;55(0) 70(0) mov final_fichero_alta, a
;56(0) 48(0)
Placa 8031 22
mov a, #ESPACIO
coge_bytes: lcall pon_letra
lcall gethex mov a, #ESPACIO
mov dada_a_escriure, a lcall pon_letra
mov a, #LETRA_TCAPS
; Escribimos en la flash lcall pon_letra
lcall escriu_dada_flash mov a, #LETRA_e
lcall incrementa_adreca_flash lcall pon_letra
; Final Escritura flash mov a, #LETRA_l
lcall pon_letra
; Miramos si hemos enviado todos los bytes mov a, #LETRA_e
mov a, adreca_escriure_alt lcall pon_letra
cjne a, final_fichero_alta, coge_bytes mov a, #LETRA_c
mov a, adreca_escriure_baix lcall pon_letra
cjne a, final_fichero_baja, coge_bytes mov a, #LETRA_a
lcall pon_letra
mov dada_a_escriure, #13h mov a, #LETRA_r
lcall escriu_dada_flash lcall pon_letra
lcall incrementa_adreca_flash mov a, #LETRA_g
mov dada_a_escriure, #69h lcall pon_letra
lcall escriu_dada_flash mov a, #LETRA_a
lcall incrementa_adreca_flash lcall pon_letra
mov dada_a_escriure, #ffh mov a, #LETRA_n
lcall escriu_dada_flash lcall pon_letra
lcall incrementa_adreca_flash mov a, #LETRA_d
mov dada_a_escriure, #aah lcall pon_letra
lcall escriu_dada_flash mov a, #LETRA_o
lcall incrementa_adreca_flash lcall pon_letra
lcall pasa_linia
siguiente_archivo:
mov a, fichero_actual mov a, #ESPACIO
dec a lcall pon_letra
mov fichero_actual, a mov a, #ESPACIO
cjne a,#0h, bucle_telecarga_audio lcall pon_letra
ljmp SALTA_FLASH mov a, #ESPACIO
lcall pon_letra
mov a, #LETRA_CCAPS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; lcall pon_letra
; RUTINAS LCD mov a, #LETRA_o
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; lcall pon_letra
mov a, #LETRA_d
;* Post: Muestra por display que estamos telecargando código lcall pon_letra
;* Pre: Haber reseteado el LCD mov a, #LETRA_i
;* Modifica: a, dptr lcall pon_letra
MUESTRA_MENU_TELECARGA_CODIGO: mov a, #LETRA_g
Placa 8031 23
lcall pon_letra
mov a, #LETRA_o lcall pasa_linia
lcall pon_letra
mov a, #ESPACIO mov a, #ESPACIO
lcall pon_letra lcall pon_letra
mov a, #PUNTO mov a, #ESPACIO
lcall pon_letra lcall pon_letra
mov a, #PUNTO mov a, #LETRA_ACAPS
lcall pon_letra lcall pon_letra
mov a, #PUNTO mov a, #LETRA_u
lcall pon_letra lcall pon_letra
ret mov a, #LETRA_d
lcall pon_letra
;* Post: Muestra por display que estamos telecargando audio mov a, #LETRA_i
;* Pre: Haber reseteado el LCD lcall pon_letra
;* Necesita: en B el valor actual del fichero telecargado mov a, #LETRA_o
;* Modifica: a, dptr lcall pon_letra
MUESTRA_MENU_TELECARGA_AUDIO: mov a, #ESPACIO
mov a, #ESPACIO lcall pon_letra
lcall pon_letra mov a, #LETRA_PAR_A
mov a, #ESPACIO lcall pon_letra
lcall pon_letra mov a, #numero_de_ficheros
mov a, #LETRA_TCAPS mov b, fichero_actual
lcall pon_letra subb a, b
mov a, #LETRA_e inc a
lcall pon_letra mov r0,a
mov a, #LETRA_l anl a,#11110000b
lcall pon_letra swap a
mov a, #LETRA_e orl a, #30h
lcall pon_letra lcall pon_letra
mov a, #LETRA_c
lcall pon_letra mov a, r0
mov a, #LETRA_a anl a,#00001111b
lcall pon_letra orl a, #30h
mov a, #LETRA_r lcall pon_letra
lcall pon_letra
mov a, #LETRA_g mov a, #BARRITA
lcall pon_letra lcall pon_letra
mov a, #LETRA_a mov a, #NUMERO_FICHEROS_ALTO
lcall pon_letra lcall pon_letra
mov a, #LETRA_n mov a, #NUMERO_FICHEROS_BAJO
lcall pon_letra lcall pon_letra
mov a, #LETRA_d
lcall pon_letra mov a, #LETRA_PAR_C
mov a, #LETRA_o lcall pon_letra
lcall pon_letra ret
Placa 8031 24
MOVX A,@DPTR
.org 6000h
;* Post: ESCRIPTURA BYTE A LA FLASH bucle_espera_escriptura:
;* Necesita: dada_a_escriure, adreca_escriure_alt, adreca_escriure_baix MOV R0,A
;* Modifica: a,dptr, r0 MOVX A, @DPTR
escriu_dada_flash: ANL A, #44h
push dptr CJNE A, 0,bucle_espera_escriptura
push a
ret
lcall prepara_escriptura_flash
.org 6200h
Placa 8031 25
setb ti clr c
ret mov suma_checksum, a
pop a
.org 6500h ret
;* Post: Espera hasta que recibe un byte por el puerto serie.
;* Devuelve el valor en A. ;* Post: Convierte ASCII to HEX
inchar: ;* Necesita: A
jnb ri, inchar atoh:
clr ri clr acc.7
mov a, sbuf cjne a, #3ah, next
ret next:
jc atoh2
.org 6600h add a, #9
;* Post: Tx por el bit serie un byte en ascii atoh2:
;* Necesita: dada_a_tx_serie anl a, #0fh
outchar: ret
jnb ti, outchar
clr ti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov sbuf, dada_a_tx_serie ; LCD
ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
resetea_lcd:
mov a, #01h ; Carguem dades "RESET DISPLAY"
mov dptr, #port_lcd_wc
movx @dptr, a
lcall espera_respuesta_display
ret
.org 6C00h
;* Post Pone una letra en el LCD
;* Necesita: letra en registro A
;* Modifica: a,dptr
pon_letra:
mov dptr, #port_lcd_wd
movx @dptr, a
lcall espera_respuesta_display
ret
.org 6D00h
;* Post:Salta linia en el display
;* Modifica: a, dptr
pasa_linia:
mov a, #11000000b ; Cambia de línea
mov dptr, #port_lcd_wc
movx @dptr, a
lcall espera_respuesta_display
ret
.org 6E00h
;* Post: Espera a que LCD acabi d'escriure les dades
;* Modifica: a,dptr
espera_respuesta_display:
mov dptr, #port_lcd_rc
movx a, @dptr
jb acc.7, espera_respuesta_display
ret
.END
Placa 8031 28
decodifica_boton_0:
mov tecla_actual, #LETRA_0 ; Esperamos a que se presione una tecla
sjmp decodifica_tecla_fin presiona_para_continuar:
decodifica_boton_1: mov tecla_actual, #00h
mov tecla_actual, #LETRA_1 mov flag_boton, #00h
sjmp decodifica_tecla_fin lcall botonera
decodifica_boton_2: mov a, flag_boton
mov tecla_actual, #LETRA_2 jz presiona_para_continuar
sjmp decodifica_tecla_fin mov tecla_actual, #00h
decodifica_boton_3: mov flag_boton, #00h
mov tecla_actual, #LETRA_3 ret
sjmp decodifica_tecla_fin
decodifica_boton_4:
mov tecla_actual, #LETRA_4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sjmp decodifica_tecla_fin ; TIMER
decodifica_boton_5: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov tecla_actual, #LETRA_5
sjmp decodifica_tecla_fin ; modo_timer
decodifica_boton_6: ; espera_timer_0_h
mov tecla_actual, #LETRA_6 ; espera_timer_0_l
sjmp decodifica_tecla_fin init_timer_0:
decodifica_boton_7: mov tmod, modo_timer
mov tecla_actual, #LETRA_7 mov th0, espera_timer_0_h
sjmp decodifica_tecla_fin mov tl0, espera_timer_0_l
decodifica_boton_8: clr tr0
mov tecla_actual, #LETRA_8 ret
sjmp decodifica_tecla_fin
decodifica_boton_9: espera_timer_0:
mov tecla_actual, #LETRA_9 setb tr0
jnb tf0, espera_timer_0
Placa 8031 38
lcall pon_letra
mov a, #LETRA_e
lcall pon_letra
mov a, #LETRA_r
lcall pon_letra
mov a, #LETRA_s
lcall pon_letra
mov a, #LETRA_o
lcall pon_letra
mov a, #LETRA_n
lcall pon_letra
mov a, #LETRA_a
lcall pon_letra
lcall pasa_linia
mov a, #ESPACIO
lcall pon_letra
mov a, #ESPACIO
lcall pon_letra
mov a, #LETRA_n
lcall pon_letra
mov a, #LETRA_o
lcall pon_letra
mov a, #ESPACIO
lcall pon_letra
mov a, #LETRA_e
lcall pon_letra
mov a, #LETRA_x
lcall pon_letra
mov a, #LETRA_i
lcall pon_letra
mov a, #LETRA_s
lcall pon_letra
mov a, #LETRA_t
lcall pon_letra
mov a, #LETRA_e
lcall pon_letra
ret
.END