Вы находитесь на странице: 1из 34

KIT S51 V1.

2008

Requisitos

KIT S51
Kit didtico para microcontrolador AT89S51/52
-

Placa de circuito impresso KIT S51 V1.1.


Componentes para montagem da placa.
Cabo para gravao.
Fonte DC.
Aplicativo RIDE para 8051, no qual sero desenvolvidos os programas a
serem gravados no microcontrolador.
- Aplicativo para gravao Aec_isp.exe (DOS).

1. Placa

Lista de componentes:
17 resistores 10k
9 resistores 470
1 resistor 1k5
1 trimpot multivoltas 10k vertical
2 capacitores cermicos 100nF
2 capacitores eletrolticos 10uF x 16V ou 25V
2 capacitores cermicos 33pF
1 capacitor polister 330nF
1 display de 7 segmentos anodo comum vermelho
1 cristal 11,059200 MHz
1 CI AT89S51 ou AT89S52
1 CI ULN2803
1 7805 (regulador de tenso)
25 micro-swich NA para PCI (ver foto da placa)
Barra de pinos 1800 [4 pinos]
Barra de pinos fmea para PCI (mini modul
para PCI) [19 pinos]
Barra de pinos fmea torneado [42 pinos]
1 soquete torneado 40 pinos
1 soquete torneado 18 pinos
1 display LCD 16 x 2 sem backlight

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

Com o display

Dica para
montagem do
display de 7
segmentos:
soquete com
barra de pinos
fmea.

1/34

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

1
2
3
4
5

1
2
3
4
5
6
7
8

2/34

1
2
3
4

Alimentao

+V

GRAVADOR

P1.5
P1.6
P1.7
RST
GND

CABO

P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

P0

0.33uF

C10

+V

R14
1k5

7805

VIN

U6

GND

VOUT

R4
10K

14
13
12
11
10
9
8
7
6
5
4
3
2
1

DISPLAY

DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
E
R/W
RS
Vo
Vdd
Vss

R3
10K

0.1uF

C11

R5
10K

33pF

C1

R1
10k

GND

470
RESET

8051

GND

VCC

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

U1

10uF

20

40

1
2
3
4
5
6
7
8

39
38
37
36
35
34
33
32

R10
10K

R2

+5V

+5V

R9
10K

0.1uF

C9

R8
10K

C3

R7
10K

10uF

C12

+5V

10k
R11

+5V

R6
10K

+5V

X1
19

31

30
29

10
11
12
13
14
15
16
17

21
22
23
24
25
26
27
28

+5V

CH7

CH6

CH5

CH4

CH3

CH2

CH1

CH0

33pF

CRY STAL
11,0592MHz C2

RST

EA

ALE
PSEN

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

X2
18

10uF

C5

10uF

C4

10k 10k 10k 10k 10k 10k 10k 10k

R15 R16 R17 R18 R19 R20 R21 R22

1
3
4
5

11
10

12
9

MAX232

C1+
C1C2+
C2-

T1IN
T2IN

GND

V+
V-

VCC

T1OUT
T2OUT

15

2
6

16

14
7

Title

470
470

R27
R28

10uF

C8

470

R26

Size
Document Number
Custom
V1.1
Date:

470

470

R25

470

R24

470

470

R23

R13

R12

+5V
g f + a b

8
7
6
5
4
3
2
1

1
2
3

1
6
2
7
3
8
4
9
5

SERIAL

FMEA

DB9

+5V
1
2
3
4
5
6
7
8

e d + c dp

P3

P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7

7SEG

U4

P2.7D
P2.6D
P2.5D
P2.4D
P2.3D
P2.2D
P2.1D
P2.0D
P2D

Sheet

of

Fernando E. Gazzoni / Gustavo B. Borba


KIT S51

C7
10uF

10uF

C6

+5V

13
8

18
17
16
15
14
13
12
11

P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7

R1IN
R2IN

1
2
3
4
5
6
7
8

P2

GND

OUT1
OUT2
OUT3
OUT4
OUT5
OUT6
OUT7
OUT8

ULN2803

COM

R1OUT
R2OUT

U3

DK

10

IN1
IN2
IN3
IN4
IN5
IN6
IN7
IN8

U2

10
9
8
7
6
1
2
3
4
5

1
2
3
4
5
6
7
8

Rev
-

KIT S51 V1.1

2. Circuito

KIT S51 V1.1

3. Cabo para gravao


Pinagem
DB25 (porta paralela)

7
10
8
6
18-25

Conector CABO da placa

(D5)
(ACK)
(D6)
(D4)
(GND)

P1.5
P1.6
P1.7
RST
GND

Montagem
- Componentes: aproximadamante 60 cm. de cabo de rede (8 vias, 4 pares tranados);
conector DB25 macho para cabo;
barra de pinos 1800 [5 pinos];
- Uma via (fio) de cada par tranado para cada sinal (D5, ACK, D6, D4).
- GNDs em um nico ponto.

Cabo
conectado na
placa.

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

3/34

KIT S51 V1.1

4. Aplicativos
- Para o desenvolvimento dos programas a serem gravados no microcontrolador:
RIDE - IDE Raisonance para 8051
1 Faa o download em http://www.raisonance.com/download/index.php, clicando em
Eval51. necessrio um pequeno cadastro.
2 Instale. O aplicativo chama-se RIDE. uma verso de avaliao com todas as
funcionalidades da verso completa, porm limitada a 4k de cdigo.
- Para a gravao do programa no microcontrolador:
Aec_isp.exe
Faa o Download em http://www.aec-electronics.co.nz/index.php?page_id=18.
necessrio um pequeno cadastro.
Roda em linha de comando (DOS) e grava os microcontroladores 8051 ATMEL da linha
AT89S, modelos AT89S51/52/53/8252. Comunica-se com o microcontrolador pela porta
paralela, utilizando o cabo descrito anteriormente.
5. Tutorial
1 Programa a ser gravado no microcontrolador
Passo 1.
Abrir o
RIDE:

Passo 2. Selecionar a CPU: Options TarGet


Selecionar 80C51 e abrir a pasta Atmel

Selecionar

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

AT89S51

ou

AT89S52

e clicar em OK

4/34

KIT S51 V1.1

Selecionar a aba Properties e marcar a opo Launch tools with executable

Passo 3. Criar e salvar um arquivo para o cdigo fonte:


File New Assembler Files

File Save as... caminho e nome do arquivo

Passo 4. Configurar o Macro Assembler:


Options Project + MA51 Source
Check no item
Define Symbols for the
8051 function registers
e clicar em OK.
(Esta configurao armazenada, no
sendo mais necessria nas prximas
sesses de uso do RIDE)

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

5/34

KIT S51 V1.1

Passo 5. Digitar o programa:


Este programa liga/desliga os segmentos do display de 7 segmentos a partir das
chaves CH0...CH7.
Caracteres aps o ; so ignorados pelo assemblador (comentrios).
;KitS51 v1.1
;=====================================================================================
;AUTOR:
DATA:
ARQUIVO: tutorial.a51
;CPU: AT89S51
clk: 11,059200MHz
;=====================================================================================
;O estado das chaves CH0...CH7 (P3.0...P3.7) copiado para
;os segmentos a...pto do 7seg.
;------------------------------------------------------------------------------------;chave CHn aberta (P3.n = 1) -> seg. on (P2.n = 1)
;chave CHn fechada (P3.n = 0) -> seg. off (P2.n = 0)
;=====================================================================================
ORG
0000h
;reset
SJMP
main
;salta para rotina principal
;reserva regio do vetor de interrupes
ORG
002Bh
;incio do programa
;------------------------------------------------------------------------------------; ROTINA PRINCIPAL
;------------------------------------------------------------------------------------main: MOV
P2,P3
;carrega o contedo de P3 (chaves) em P2 (display de 7 seg)
SJMP
main
;salta para main e repete o procedimento (loop)
END

;fim do programa

Passo 6. Assemblar e linkar: Project Make all (ou tecla F9)


O arquivo no formato hexa Intel foi gerado e encontra-se no mesmo diretrio em
que o programa foi salvo. Possui o mesmo nome do programa e extenso .hex.
Neste caso, tutorial.hex.

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

6/34

KIT S51 V1.1

2 Gravao e execuo
-

A placa KIT S51 v1.1 deve estar alimentada.


Conecte o cabo na paralela do PC e na placa KIT S51.
Copie o programa aec_isp.exe no mesmo diretrio do arquivo tutorial.hex e execute-o.
Siga os passos:

Passo 1.
Setup
Para escolha do
modelo de
microcontrolador e
configurao dos
lock bits.

Configure os
parmetros e
saia desta tela
fazendo um
Save setup.
(Estas configuraes
so armazenadas em
um arquivo chamado
AECPRG.CFG.)

Passo 2.
Load HEX file to
Flash buffer
Para carregar o
arquivo hexa Intel do
seu programa.
Digite o caminho inteiro
ou garanta que o .hex
est no mesmo diretrio
do aec_isc.exe.

O buffer mostrado,
indicando que o
programa foi
carregado.
(o contedo do buffer
da figura ao lado
apenas ilustrativo. No
corresponde ao do
programa tutorial.hex)

Pressione qualquer
tecla para continuar.

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

7/34

KIT S51 V1.1

Passo 3.
Program
Para gravar.

OK!
Desconecte o cabo da
placa e o programa
estar rodando.
Caso tenha recebido
uma mensagem de
erro durante a
gravao, revise a
alimentao e o clock
do microcontrolador e
as conexes do cabo.

ATENO
Durante a gravao seu circuito est conectado diretamente na porta paralela do PC.
Portanto, cuidado para no danific-la! Para no haver riscos, durante o procedimento de
gravao, recomendvel manter os pinos P1.5, P1.6 e P1.7 do AT89S desconectados do seu
circuito, deixando-os em contato apenas com a porta paralela. Na placa KIT S51 estes pinos
so compartilhados pelo barramento do display. Em condies normais, mesmo com o
display conectado, a gravao ocorre normalmente e no h risco de danos porta paralela.
6. Exemplos
Exemplo 1
;=====================================================================================
;AUTOR: Gustavo B. Borba/Fernando E. Gazzoni
DATA: 10/2006
ARQUIVO: led.a51
;CPU: AT89S51
clk: 11,059200MHz
;=====================================================================================
;Chaves em P3.0 e P3.1 piscam os segmentos "a" e "d" do display de 7 seg.
;=====================================================================================
;P3.0 = acionada -> Pisca os segmentos alternadamente
;P3.1 = acionada -> Pisca os segmentos em conjunto
;=====================================================================================
ORG
MOV

00h
P2,#00 ;APAGA TODOS OS SEGMENTOS

;------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL --> TESTE DAS CHAVES


;------------------------------------------------------------------------------------INICIO:
MOV
R0,P3
CJNE R0,#11111110b,TESTE2 ;verifica se...
LCALL CHAVE0 ; ...CH0 foi pressionada.
LJMP INICIO
TESTE2:
CJNE R0,#11111101b,INICIO ;verifica se...
LCALL CHAVE1 ; ...CH1 foi pressionada.
LJMP INICIO

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

8/34

KIT S51 V1.1

;------------------------------------------------------------------------------------; SUBROTINA PARA PISCAR OS SEGMENTOS ALTERNADAMENTE


;------------------------------------------------------------------------------------CHAVE0:
SETB P2.0
;acende segmento a
CLR
P2.3
;apaga segmento d
LCALL ATRASO
SETB P2.3
;acende segmento d
CLR
P2.0
;apaga segmento a
LCALL ATRASO
SETB P2.0
;acende segmento a
CLR
P2.3
;apaga segmento d
LCALL ATRASO
SETB P2.3
;acende segmento d
CLR
P2.0
;apaga segmento a
LCALL ATRASO
SETB P2.0
;acende segmento a
CLR
P2.3
;apaga segmento d
LCALL ATRASO
SETB P2.3
;acende segmento d
CLR
P2.0
;apaga segmento a
LCALL ATRASO
CLR
P2.3
;apaga segmento d
RET
;------------------------------------------------------------------------------------; SUBROTINA PARA PISCA OS SEGMENTOS EM CONJUNTO
;------------------------------------------------------------------------------------CHAVE1:
MOV
P2,#09h ;acende segmento a e segmento d
LCALL ATRASO
MOV
P2,#00h ;apaga segmento a e segmento d
LCALL ATRASO
MOV
P2,#09h ;acende segmento a e segmento d
LCALL ATRASO
MOV
P2,#00h ;apaga segmento a e segmento d
LCALL ATRASO
MOV
P2,#09h ;acende segmento a e segmento d
LCALL ATRASO
MOV
P2,#00h ;apaga segmento a e segmento d
LCALL ATRASO
RET
;------------------------------------------------------------------------------------; SUBROTINA PARA GERAR ATRASO DE:
; (R3x24 + R3xR2x24 + R3xR2xR1x24)/freq clock
;------------------------------------------------------------------------------------ATRASO:
MOV
R3,#7 ;gera atraso de...
MOV
R2,#255 ;... aproximadamente...
MOV
R1,#255 ;... 1 segundo
VOLTA:
DJNZ R1,$
MOV
R1,#255
DJNZ R2,VOLTA
MOV
R2,#255
DJNZ R3,VOLTA
RET
END

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

9/34

KIT S51 V1.1

Exemplo 2
;==============================================================================
;AUTOR:Fernando E. Gazzoni/GUSTAVO B. BORBA DATA: 05/2008
ARQUIVO: lcd.a51 =
;CPU: AT89S51
clk: 11,059200MHz
=
;==============================================================================
;Quatro chaves colocadas em P3.0, P3.1, P3.2 e P3.3 comandam o display LCD
=
;==============================================================================
;P3.0 = acionada -> Apaga tudo e escreve "TESTE DE DISPLAY" na primeira linha =
;P3.1 = acionada -> Escreve "Kit S51" na segunda linha
=
;P3.2 = acionada -> Apaga tudo e escreve uma frase nas duas linhas do display =
;P3.3 = acionada -> Apaga o que estiver escrito no display
=
;==============================================================================

ORG

00h

MOV

P2,#00 ;apaga todos os segmentos do display de 7 segmentos

;==============================================================================
; INICIO DO PROGRAMA PRINCIPAL
=
;==============================================================================
LCALL INILCD
;-----------------------------------------------------------------------------; LEITURA DAS CHAVES
;-----------------------------------------------------------------------------MAIN:
MOV
CJNE
LCALL
JMP

A,P3
A,#11111110b,C1 ;se achave CH0 (em P3.0) for pressionada...
CH0 ;...chama subrotina CH0
MAIN

C1:
CJNE A,#11111101b,C2 ;se a chave CH1 (em P3.1) for pressionada...
LCALL CH1 ;...chama a subrotina CH1
JMP
MAIN
C2:
CJNE A,#11111011b,C3 ;se a chave CH2 (em P3.2) for pressionada...
LCALL CH2 ;... chama a subrotina CH2
JMP
MAIN
C3:
CJNE A,#11110111b,MAIN ;se a chave CH3 (em P3.3) for pressionada...
LCALL CLEARLCD ;... apaga os dados escritos no LCD
JMP
MAIN
;-----------------------------------------------------------------------------; SUBROTINA DE TRATAMENTO DA CHAVE CH0 (EM P3.0)
;-----------------------------------------------------------------------------CH0:
LCALL CLEARLCD ;...apaga todos os caracteres escritos no display
MOV
DPTR,#FRASE1
LCALL PRINTSTRING
RET
;-----------------------------------------------------------------------------; SUBROTINA DE TRATAMENTO DA CHAVE CH1 (EM P3.1)
;-----------------------------------------------------------------------------CH1:
MOV
B,#40h ;seleciona primeira coluna da segunda linha
LCALL POSCURSOR
MOV
DPTR,#FRASE2
LCALL PRINTSTRING
RET
;-----------------------------------------------------------------------------; SUBROTINA DE TRATAMENTO DA CHAVE CH2 (EM P3.2)
;-----------------------------------------------------------------------------CH2:
MOV
DPTR,#FRASE3

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

10/34

KIT S51 V1.1

LCALL PRINTSTRINGALL
RET
;-----------------------------------------------------------------------------; FRASES A SEREM ESCRITAS NO DISPLAY
;-----------------------------------------------------------------------------FRASE1:
DB
'TESTE DE DISPLAY!\'
FRASE2:
DB
'Kit S51\'
FRASE3:
DB
'MICROCONTROLADORES/
ENSITEC\'

;==============================================================================
;=
SUBROTINAS PARA O DISPLAY LCD
=
;==============================================================================

;==============================================================================
;
RESUMO DAS FUNCOES
=
;==============================================================================
;
NOME
= ENTRADA =
DESCRICAO
=
;==============================================================================
;
INILCD
=
= Inicializacao do LCD
=
;-----------------------------------------------------------------------------;
CLEARLCD
=
= Apaga todos caracteres e coloca cursor no inicio =
;-----------------------------------------------------------------------------;
POSCURSOR
=
B
= Seleciona a posicao do cursor no display
=
;-----------------------------------------------------------------------------;
IWRITE
=
B
= Executa uma instrucao
=
;-----------------------------------------------------------------------------;
PRINTASCII
=
B
= Escreve um caractere ASCII no display
=
;-----------------------------------------------------------------------------;
PRINTBCDL
=
B
= Escreve um digito BCD (menos significativo)
=
;-----------------------------------------------------------------------------;
PRINTBCDHL
=
B
= Escreves dois digitos BCD
=
;-----------------------------------------------------------------------------;
PRINTHEXAL
=
B
= Escreve um digito hexadecimal(menos significativo=
;-----------------------------------------------------------------------------;
PRINTHEXAHL =
B
= Escreve dois digitos hexadecimal
=
;-----------------------------------------------------------------------------;
PRINTSTRING =
DPTR = Escreve frase em uma das linhas do display
=
;-----------------------------------------------------------------------------; PRINTSTRINGALL =
DPTR = Escreve frase nas duas linhas do display
=
;-----------------------------------------------------------------------------;
SHIFTLCDR
=
B
= Desloca caracteres escritos no LCD para direita =
;-----------------------------------------------------------------------------;
SHIFTLCDL
=
B
= Desloca caracteres escritos no LCD para esquerda =
;-----------------------------------------------------------------------------;
DELAY
=
R6
= Gera atraso de R6 x 0,5ms
=
;==============================================================================

;-----------------------------------------------------------------------------; INICIALIZACAO DO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: R1
; CHAMA: IWRITE, CLEARLCD, DELAY
;-----------------------------------------------------------------------------INILCD:
CLR
MOV
LCALL
MOV
LCALL
MOV
LCALL

P0.1
;desabilita a escrita no display
R6,#50 ;gera atraso de 50x0,5ms = 25ms
DELAY
B,#00110000b ;comando para inicializacao
IWRITE
R6,#9 ;gera atraso de 9x0,5ms = 4,5ms
DELAY

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

11/34

KIT S51 V1.1

LCALL
MOV
LCALL
LCALL

IWRITE ;repete instrucao


R6,#1 ;gera atraso de 1x0,5ms = 0,5ms
DELAY
IWRITE ;repete instrucao

; Configuracao do usuario
MOV

B,#00111000b
;|||______ F = 0 -> matrizde 5x8 pontos
;||_______ N = 1-> 2 linhas
;|________ DL = 1 -> 8 bits
LCALL IWRITE
MOV

B,#00001110b
;|||____ B = 0 -> local do cursor nao pisca
;||_____ C = 1 -> cursor visivel
;|______ D = 1 -> liga o display (aparece frase)
LCALL IWRITE
MOV

B,#00000110b
;||____ SH=0 -> no desloca frase ao escrever caractere
;|_____ I/D = 1 -> cursor se move para direita
LCALL IWRITE
LCALL CLEARLCD
RET

;-----------------------------------------------------------------------------; SUBROTINA PARA LIMPAR O DISPLAY


;-----------------------------------------------------------------------------; Apaga todos os caracteres e posiciona o cursor no inicio do display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: Caracteres armazenados da DDRAM, R6, A
; CHAMA: IWRITE, POSCURSOR, DELAY
;-----------------------------------------------------------------------------CLEARLCD:
PUSH
MOV
LCALL
MOV
LCALL
MOV
LCALL
POP
RET

B
B,#00000001b ;Instrucao Clear display
IWRITE
R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...
DELAY ;...clear display leva para ser executada
B,#0
;posiciona o cursor no inicio do display -> endereco 00h
POSCURSOR
B

;-----------------------------------------------------------------------------; SUBROTINA PARA SELECIONAR A POSICAO DO CURSOR NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> endereco da DDRAM que o cursor sera posicionado
; SAIDA: nenhuma
;
; DESTROI: A, B
; CHAMA: IWRITE
;-----------------------------------------------------------------------------POSCURSOR:
PUSH
MOV
ORL
MOV
LCALL
POP
RET

B ;armazena o valor de B na pilha


A,B
A,#10000000b
B,A
IWRITE
B ;restaura o valor de B

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

12/34

KIT S51 V1.1

;-----------------------------------------------------------------------------; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> instrucao a ser executada
; SAIDA: nenhuma
;
; DESTROI: R7
; CHAMA: runT0
;-----------------------------------------------------------------------------IWRITE:
MOV
CLR
SETB
MOV
DJNZ
CLR
RET

P1,B
P0.0 ;seleciona RS = 0 (instrucao)
P0.1 ;habilita escrita
R7,#18 ;aguarda 39us para...
R7,$ ;executar o comando
P0.1 ;desabilita escrita

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER CARACTER ASCII NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> caractere (em ASCII) a ser escrito no display
; SAIDA: nenhuma
;
; DESTROI: R7
; CHAMA: runT0
;-----------------------------------------------------------------------------PRINTASCII:
MOV
SETB
SETB
MOV
DJNZ
CLR
RET

P1,B
P0.0 ;seleciona RS = 1 (dado)
P0.1 ;habilita escrita
R7,#20 ;aguarda 43us para...
R7,$ ;... realizar a escrita
P0.1 ;desabilita escrita

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DIGITO BCD MENOS SIGNIFICATIVO


;-----------------------------------------------------------------------------; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD;-----------------------------------------------------------------------------; ENTRADA: B --> numero BCD
; SAIDA: nenhuma
;
; DESTROI: A
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDL:
PUSH
MOV
ANL
ADD
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


A,B
A,#00001111b ;usa apenas 4bits menos significativo
A,#30h ;converte resultado para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha

;------------------------------------------------------------------------------

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

13/34

KIT S51 V1.1

; SUBROTINA PARA ESCREVER DOIS DIGITOS BCD


;-----------------------------------------------------------------------------; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD;-----------------------------------------------------------------------------; ENTRADA: B --> numero BCD
; SAIDA: nenhuma
;
; DESTROI: A, B
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDHL:
PUSH B ;armazena conteudo de B na pilha
MOV
A,B
ANL
A,#11110000b ;separa 4 bits mais significativos
SWAP A ;troca nibble menos significativo por mais significativo
ADD
A,#30h ;converte para ASCII
MOV
B,A ;restaura conteudo de B da pilha
LCALL PRINTASCII
POP
B
MOV
A,B
ANL
A,#00001111b ;separa 4 bits menos significativos
ADD
A,#30h ;converte para ASCII
MOV
B,A
LCALL PRINTASCII
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DIGITO HEXADECIMAL MENOS SIGNIFICATIVO
;-----------------------------------------------------------------------------; ENTRADA: B --> numero HEXA
; SAIDA: nenhuma
;
; DESTROI: A, DPTR
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTHEXAL:
PUSH B ;armazena conteudo de B na pilha
MOV
DPTR,#TABHEXA
MOV
A,B
ANL
A,#00001111b ;separa nibble menos significativo
MOVC A,@A+DPTR ;converte caractere para ASCII
MOV
B,A
LCALL PRINTASCII
POP
B ;restaura conteudo de B da pilha
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DOIS DIGITOS HEXADECIMAIS
;-----------------------------------------------------------------------------; ENTRADA: B --> numero HEXA
; SAIDA: nenhuma
;
; DESTROI: A, DPTR
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTHEXAHL:
PUSH
MOV
MOV
ANL
SWAP
MOVC
MOV
LCALL
POP
MOV
ANL
MOVC
MOV
LCALL
RET

B ;armazena conteudo de B na pilha


DPTR,#TABHEXA
A,B
A,#11110000b ;separa nibble mais significativo
A ;troca nibble menos significativo por mais significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha
A,B
A,#00001111b ;separa nibble menos significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

14/34

KIT S51 V1.1

TABHEXA:
DB

'0123456789ABCDEF'

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caractere especial: '\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRING:
PUSH
MOV

B ;armazena conteudo de B na pilha


R0,#0 ;inicia a escrita a partir da primeira letra da frase

MOV
MOVC
MOV

A,R0 ;converte o caractere hexadecimal...


A,@A+DPTR ;... em ASCII
B,A

CJNE
POP
RET

A,#'\',WRITE ;encontrou o caractere '\' ?


B
;sim -> para de escrever

PRINTS:

WRITE:
LCALL PRINTASCII
INC
R0
JMP
PRINTS
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caracteres especiais: '/' -> quebra de linha (da primeira para a segunda)
;
'\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRINGALL:
PUSH B ;armazena conteudo de B na pilha
LCALL CLEARLCD
MOV
R0,#0 ;inicia a escrita a partir da primeira letra da frase
PRINTSALL:
MOV
MOVC
MOV

A,R0 ;converte o caractere hexadecimal...


A,@A+DPTR ;... em ASCII
B,A

CJNE
MOV
LCALL
INC
JMP

A,#'/',FIMSTR ;encontrou o caractere '/' ?


B,#40h ;sim -> comeca a escrever na segunda linha
POSCURSOR
R0
PRINTSALL

WRITEALL:
LCALL PRINTASCII
INC
R0

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

15/34

KIT S51 V1.1

JMP

PRINTSALL

CJNE
POP
RET

A,#'\',WRITEALL ;encontrou o caractere '\'?


B
;sim -> para de escrever

FIMSTR:

;-----------------------------------------------------------------------------; SUBROTINA PARA DESLOCAR A FRASE A DIREITA


;-----------------------------------------------------------------------------; Desloca para a direita todos os caracteres ja escritos no display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI:
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDR:
PUSH
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


B,#00011100b
IWRITE
B ;restaura conteudo de B na pilha

;-----------------------------------------------------------------------------; SUBROTINA PARA DESLOCAR A FRASE A ESQUERDA


;-----------------------------------------------------------------------------; Desloca para a esquerda todos os caracteres ja escritos no display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: B
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDL:
PUSH B ;armazena conteudo de B na pilha
MOV
B,#00011000b
LCALL IWRITE
POP
B ;restaura conteudo de B na pilha
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA GERAR ATRASO DE R1 x 0,5ms
;-----------------------------------------------------------------------------; ENTRADA: R6 --> valor a ser multiplicado pela base de tempo
;
; SAIDA: nenhuma
;
; DESTROI: R7, R6
;-----------------------------------------------------------------------------DELAY:
MOV
DJNZ
DJNZ
RET

R7,#228
R7,$
R6,DELAY

END

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

16/34

KIT S51 V1.1

Exemplo 3
;=====================================================================================
;AUTOR: Gustavo B. Borba/Fernando E. Gazzoni
DATA: 04/2007
ARQUIVO: int0.a51
;CPU: AT89S51
clk: 11,059200MHz
;=====================================================================================
;Duas chaves em P3.2 e P3.3 comandam um alarme
;=====================================================================================
;P3.3 = pressionado -> toca alarme
;P3.2 = borda de descida -> para alarme
;=====================================================================================
; Esquema eltrico simplificado:
;
; -----------+5v
/|
;
|
|
|
|
--- |
;
8 |
| U 2 |
----|
|
;
0 |
| L 8 |
----|
| Buzzer
;
5 |
| N 0 |
\
--- |
;
1 |
PINO8|
3 |PINO11
/
\|
;
|----------|
|------------ \
; ----- P2.7
-------/ 10k (potenciometro)
;
\
;
|
;
-----;
---;
-;=====================================================================================

DESLIGA

EQU

00h ;flag de parada do alarme

ORG
LJMP

00h ;reset do sistema


ini

ORG
LJMP

03h ;interrupcao externa 0


int_ext0

ORG

002Bh ;inicio do programa

;------------------------------------------------------------------------------------;INICIALIZACAO: APENAS INT EXTERNA 0 HABILITADA, BORDA DE DESCIDA, PRIORID. ALTA


; T/C 0 NA FUNCAO TIMER, CONTROLADO POR TR0, MODO 1
;------------------------------------------------------------------------------------ini:
MOV

IE,#00000000b ;desabilita todas as interrupcoes

MOV

TCON,#00000001b
; ||||
|___
; ||||_______
; |||________
; ||_________
; |__________

IT0
TR0
TF0
TR1
TF1

=
=
=
=
=

1
0
0
0
0

->
->
->
->
->

int ext
timer 0
flag de
timer 1
flag de

0 por borda de descida


parado
overflow do T/C 0 zerado
parado
overflow do T/C 1 zerado

MOV

TMOD,#00000001b
; ||||___ M0 = 1 -> timer 0 no...
; |||____ M1 = 0 -> ... modo 1: 16 bits
; ||_____ C/T'= 0 -> timer 0 na funcao timer
; |______ GATE= 0 -> timer 0 controlado somente por TR0
; T/C 1 nao utilizado

MOV

IP,#00000001b
; |_____ PX0 = 1 -> prioridade alta para a int ext 0

MOV

IE,#10000001b
; |
|_____ EX0 = 1 -> habilita a int ext 0
; |____________ EA = 1 -> habilita todas as ints que...
; ...estiverem habilitadas

;------------------------------------------------------------------------------------;PROGRAMA PRINCIPAL

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

17/34

KIT S51 V1.1

;------------------------------------------------------------------------------------le:
JB
CLR
LCALL
SJMP

P3.3,le ;verifica se a chave em P3.3 foi acionada


DESLIGA ;zera o flag de parada do alarme
alarme ;chama a subrotina para tocar o alarme
le

;------------------------------------------------------------------------------------;ISR DA INTERRUPCAO EXTERNA 0


;------------------------------------------------------------------------------------int_ext0:
SETB
RETI

DESLIGA ;seta o flag de parada do alarme

;------------------------------------------------------------------------------------; SUBROTINA QUE COMPLEMENTA P2.7 COM CICLO ATIVO DE 50% USANDO Timer 0
; OSCILACAO COM FREQ = 262Hz
;------------------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
; DESTROI: nada
;------------------------------------------------------------------------------------alarme:
MOV
MOV
SETB
JNB
CLR
CLR
CPL
JNB
RET

TH0,#0F9h
TL0,#1Eh
TR0
;dispara timer
TF0,$ ;preso
TR0
;stop timer
TF0
;zera flag overflow
P2.7 ;complementa P2.0
DESLIGA,alarme ;sai se o flag de parada estiver setado

END

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

18/34

KIT S51 V1.1

Exemplo 4
;==============================================================================
;= AUTOR: FERNANDO GAZZONI/GUSTAVO BORBA
DATA:05/2008
ARQUIVO:tec.a51 =
;= CPU: AT89S51
clk: 11,059200MHz
=
;==============================================================================
;=
Teclado matricial: escreve o valor da tecla no display LCD
=
;-----------------------------------------------------------------------------;=
Usa as funcoes do display LCD
=
;==============================================================================
ORG
JMP
ORG

00h
;reset
INI
;salta para rotina principal
;reserva regio do vetor de interrupes
0050h
;incio do programa

;-----------------------------------------------------------------------------;
INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------INI:
MOV
P2,#00 ;apaga display 7 segmentos
LCALL INILCD
LCALL CLEARLCD
;-----------------------------------------------------------------------------; PROGRAMA PRINCIPAL
;-----------------------------------------------------------------------------MAIN:
LCALL
MOV
LCALL
MOV
LCALL
SJMP

IN_HEX ;chama subrotina para ler teclado


B,#07 ;escreve a partir do endereco...
POSCURSOR ;... 07 do LCD
B,R6 ;copia o valor da tecla pressionada...
PRINTHEXAL ;... e mostra no LCD
MAIN

;==============================================================================
;=
SUBROTINAS PARA LEITURA DO TECLADO MATRICIAL
=
;==============================================================================
;-----------------------------------------------------------------------------; SUBROTINA PARA DEBOUNCE DA LEITURA DO TECLADO MATRICIAL
; LIVRO: The 8051 Microcontroller
AUTOR: MacKenzie, I. Scott
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
; DESTROI: R4, R6
; CHAMA: READ
;
; USA DEBOUNCE DE 50 REPETICOES
;------------------------------------------------------------------------------

IN_HEX:
MOV

R4,#50 ;contador para debounce

CALL
JNC
DJNZ
PUSH

READ ;chave foi pressionada?


IN_HEX ;nao -> verifica novamente
R4,RETURN ;sim -> repete 50x
ACC ;armazena na pilha o codigo hexa da tecla apertada

MOV

R4,#50 ;aguarda a chave ser solta

CALL
JC
DJNZ
POP
MOV
RET

READ

RETURN:

RETURN2:
RETURN3:
;chave continua pressionada?
RETURN2 ;sim -> verifica novamente
R4,RETURN3 ;nao -> repete 50x
ACC ;recupera o codigo hexa da chave e...
R6,A ;... salva em R6

;-----------------------------------------------------------------------------; SUBROTINA PARA LEITURA E DECODIFICACAO DO TECLADO MATRICIAL


-

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

19/34

KIT S51 V1.1

; LIVRO: The 8051 Microcontroller


AUTOR: MacKenzie, I. Scott
;-----------------------------------------------------------------------------; ENTRADA: chaves colocadas no port3
; SAIDA: DISP -> codigo hexadecimal da chave que foi apertada
;
; DESTROI: A, R5, R6 e R7
;-----------------------------------------------------------------------------READ:
MOV
MOV

A,#0FEh ;inicia na coluna 0


R6,#4 ;R6 = contador

MOV
MOV
MOV
ANL
CJNE
MOV
RL
DJNZ
CLR
SJMP

P3,A
R7,A ;guarda o conteudo do acumulador
A,P3 ;le port3
A,#0F0h ;usa apenas os valores das linhas
A,#0F0h,CH_PRESS ;alguma linha esta ativa?
A,R7 ;nao -> move para a proxima coluna
A
R6,TEST_AGAIN ;nenhuma chave pressionada?
C
;retorna com C=0
FIN

MOV
MOV
CLR
SUBB
MOV
MOV
SWAP
MOV

R7,A ;salva o codigo da coluna em R7


A,#4 ;prepara o calculo do peso da coluna
C
A,R6 ;4-R6 = peso da coluna
R6,A ;guarda o resultado em R6
A,R7 ;restaura a busca para A
A ;coloca o resultado da busca no nibble LS
R5,#4 ;usa R5 como um contador

RRC
JNC
INC
INC
INC
INC
DJNZ

A ;rotaciona ate encontrar o bit 0


HEX ;sai quando C=0
R6 ;adiciona 4...
R6 ;...
R6 ;...
R6 ;... ate encontrar a coluna
R5,AGAIN

SETB
MOV

C ;C=1 -> chave pressionada


A,R6 ;codigo hex salvo em A

TEST_AGAIN:

CH_PRESS:

AGAIN:

HEX:

FIN:
RET
;==============================================================================
;=
SUBROTINAS PARA O DISPLAY LCD
=
;==============================================================================
;-----------------------------------------------------------------------------; INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: R6
; CHAMA: IWRITE, CLEARLCD, DELAY
;-----------------------------------------------------------------------------INILCD:
CLR
MOV
LCALL
MOV
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL

P0.1 ;desabilita a escrita no display


R6,#50 ;gera atraso de 50x0,5ms = 25ms
DELAY
B,#00110000b ;comando para inicializacao
IWRITE
R6,#9 ;gera atraso de 9x0,5ms = 4,5ms
DELAY
IWRITE ;repete instrucao
R6,#1 ;gera atraso de 1x0,5ms = 0,5ms
DELAY
IWRITE ;repete instrucao

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

20/34

KIT S51 V1.1

; Configuracao do usuario
MOV

B,#00111000b
;|||______ F = 0 -> matrizde 5x8 pontos
;||_______ N = 1-> 2 linhas
;|________ DL = 1 -> 8 bits

LCALL IWRITE
MOV

B,#00001110b
;|||____ B = 0 -> local do cursor nao pisca
;||_____ C = 1 -> cursor visivel
;|______ D = 1 -> liga o display (aparece frase)

LCALL IWRITE
MOV

B,#00000110b
;||____ SH=0 -> no desloca frase ao escrever caractere
;|_____ I/D = 1 -> cursor se move para direita

LCALL IWRITE
MOV
B,#00000010b ;return home -> retorna o cursor para a...
LCALL IWRITE ;...primeira linha e primeira coluna
LCALL CLEARLCD
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA LIMPAR O DISPLAY
;-----------------------------------------------------------------------------; Apaga todos os caracteres e posiciona o cursor no inicio do display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: Caracteres armazenados da DDRAM, R6, A
; CHAMA: IWRITE, POSCURSOR, DELAY
;-----------------------------------------------------------------------------CLEARLCD:
PUSH
MOV
LCALL
MOV
LCALL
MOV
LCALL
POP
RET

B
B,#00000001b ;Instrucao Clear display
IWRITE
R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...
DELAY
;...clear display leva para ser executada
B,#0 ;posiciona o cursor no inicio do display -> endereco 00h
POSCURSOR
B

;-----------------------------------------------------------------------------; SUBROTINA PARA SELECIONAR A POSICAO DO CURSOR NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> endereco da DDRAM que o cursor sera posicionado
; SAIDA: nenhuma
;
; DESTROI: A
; CHAMA: IWRITE
;-----------------------------------------------------------------------------POSCURSOR:
PUSH
MOV
ORL
MOV
LCALL
POP
RET

B
A,B
A,#10000000b
B,A
IWRITE
B

;------------------------------------------------------------------------------

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

21/34

KIT S51 V1.1

; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> instrucao a ser executada
; SAIDA: nenhuma
;
; DESTROI: R7
; CHAMA: runT0
;-----------------------------------------------------------------------------IWRITE:
MOV
CLR
SETB
MOV
DJNZ
CLR
RET

P1,B
P0.0 ;seleciona RS = 0 (instrucao)
P0.1 ;habilita escrita
R7,#18 ;aguarda 39us para...
R7,$ ;executar o comando
P0.1 ;desabilita escrita

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER CARACTER ASCII NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> caractere (em ASCII) a ser escrito no display
; SAIDA: nenhuma
;
; DESTROI: R7
; CHAMA: runT0
;-----------------------------------------------------------------------------PRINTASCII:
MOV
SETB
SETB
MOV
DJNZ
CLR
RET

P1,B
P0.0 ;seleciona RS = 1 (dado)
P0.1 ;habilita escrita
R7,#20 ;aguarda 43us para...
R7,$ ;... realizar a escrita
P0.1 ;desabilita escrita

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DIGITO BCD MENOS SIGNIFICATIVO


;-----------------------------------------------------------------------------; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD;-----------------------------------------------------------------------------; ENTRADA: B --> numero BCD
; SAIDA: nenhuma
;
; DESTROI: A
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDL:
PUSH
MOV
ANL
ADD
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


A,B
A,#00001111b ;usa apenas 4bits menos significativo
A,#30h ;converte resultado para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DOIS DIGITOS BCD


;-----------------------------------------------------------------------------; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD;-----------------------------------------------------------------------------; ENTRADA: B --> numero BCD
; SAIDA: nenhuma
;
; DESTROI: A, B
; CHAMA: PRINTASCII
;------------------------------------------------------------------------------

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

22/34

KIT S51 V1.1

PRINTBCDHL:
PUSH
MOV
ANL
SWAP
ADD
MOV
LCALL
POP
MOV
ANL
ADD
MOV
LCALL
RET

B ;armazena conteudo de B na pilha


A,B
A,#11110000b ;separa 4 bits mais significativos
A ;troca nibble menos significativo por mais significativo
A,#30h ;converte para ASCII
B,A ;restaura conteudo de B da pilha
PRINTASCII
B
A,B
A,#00001111b ;separa 4 bits menos significativos
A,#30h ;converte para ASCII
B,A
PRINTASCII

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DIGITO HEXADECIMAL MENOS SIGNIFICATIVO


;-----------------------------------------------------------------------------; ENTRADA: B --> numero HEXA
; SAIDA: nenhuma
;
; DESTROI: A, DPTR
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTHEXAL:
PUSH
MOV
MOV
ANL
MOVC
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


DPTR,#TABHEXA
A,B
A,#00001111b ;separa nibble menos significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DOIS DIGITOS HEXADECIMAIS


;-----------------------------------------------------------------------------; ENTRADA: B --> numero HEXA
; SAIDA: nenhuma
;
; DESTROI: A, B, DPTR
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTHEXAHL:
PUSH
MOV
MOV
ANL
SWAP
MOVC
MOV
LCALL
POP
MOV
ANL
MOVC
MOV
LCALL
RET

B ;armazena conteudo de B na pilha


DPTR,#TABHEXA
A,B
A,#11110000b ;separa nibble mais significativo
A ;troca nibble menos significativo por mais significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha
A,B
A,#00001111b ;separa nibble menos significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII

DB

'0123456789ABCDEF'

TABHEXA:

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

23/34

KIT S51 V1.1

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R7
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caractere especial: '\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRING:
PUSH
MOV

B ;armazena conteudo de B na pilha


R7,#0 ;inicia a escrita a partir da primeira letra da frase

MOV
MOVC
MOV

A,R7 ;converte o caractere hexadecimal...


A,@A+DPTR ;... em ASCII
B,A

CJNE
POP
RET

A,#'\',WRITE ;encontrou o caractere '\' ?


B
;sim -> para de escrever

PRINTS:

WRITE:
LCALL PRINTASCII
INC
R7
JMP
PRINTS
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R7
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caracteres especiais: '/' -> quebra de linha (da primeira para a segunda)
;
'\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRINGALL:
PUSH B ;armazena conteudo de B na pilha
LCALL CLEARLCD
MOV
R7,#0 ;inicia a escrita a partir da primeira letra da frase
PRINTSALL:
MOV
MOVC
MOV

A,R7 ;converte o caractere hexadecimal...


A,@A+DPTR ;... em ASCII
B,A

CJNE
MOV
LCALL
INC
JMP

A,#'/',FIMSTR ;encontrou o caractere '/' ?


B,#40h ;sim -> comeca a escrever na segunda linha
POSCURSOR
R7
PRINTSALL

WRITEALL:
LCALL PRINTASCII
INC
R7
JMP
PRINTSALL
FIMSTR:
CJNE

A,#'\',WRITEALL ;encontrou o caractere '\'?

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

24/34

KIT S51 V1.1

POP
RET

;sim -> para de escrever

;-----------------------------------------------------------------------------; SUBROTINA PARA DESLOCAR A FRASE A DIREITA


;-----------------------------------------------------------------------------; Desloca para a direita todos os caracteres ja escritos no display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI:
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDR:
PUSH
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


B,#00011100b
IWRITE
B ;restaura conteudo de B na pilha

;-----------------------------------------------------------------------------; SUBROTINA PARA DESLOCAR A FRASE A ESQUERDA


;-----------------------------------------------------------------------------; Desloca para a esquerda todos os caracteres ja escritos no display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: B
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDL:
PUSH B ;armazena conteudo de B na pilha
MOV
B,#00011000b
LCALL IWRITE
POP
B ;restaura conteudo de B na pilha
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA GERAR ATRASO DE R1 x 0,5ms
;-----------------------------------------------------------------------------; ENTRADA: R6 --> valor a ser multiplicado pela base de tempo
;
; SAIDA: nenhuma
;
; DESTROI: R7, R6
;-----------------------------------------------------------------------------DELAY:
MOV
DJNZ
DJNZ
RET

R7,#228
R7,$
R6,DELAY

END

Exemplo 5
;==============================================================================
;= AUTOR: FERNANDO GAZZONI/GUSTAVO BORBA
DATA:05/2008
ARQUIVO:clock.a51 =
;= CPU: AT89S51
clk: 11,059200MHz
=
;==============================================================================
;=
RELOGIO DIGITAL
=

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

25/34

KIT S51 V1.1

;-----------------------------------------------------------------------------;=
USA AS FUNCOES DO LCD
=
;==============================================================================
;CH0 --> Ajusta relogio
=
;CH1 --> Inicia o relogio
=
;
=
; --> Dentro do menu de ajuste:
=
;CHO --> Confirma ajuste
=
;CH1 --> Connfigura as horas
=
;CH2 --> Configura os minutos
=
;CH3 --> Zera o relogio (00:00:00)
=
;==============================================================================
;-----------------------------------------------------------------------------;
VARIAVEIS DO RELOGIO
;-----------------------------------------------------------------------------HORA
MINUTO
SEGUNDO
TESTE

EQU
EQU
EQU
EQU

40h
41h
42h
43h

;armazena
;armazena
;armazena
;testa se

as horas
os minutos
os segundos
passou 1seg para atualizar o relogio

;-----------------------------------------------------------------------------;
INICIO DO PROGRAMA E CONFIGURACAO DA INTERRUPCAO DO TIMER 1
;-----------------------------------------------------------------------------ORG
LJMP

0000h ; reset do sistema


INICIO

ORG
MOV
INC
MOV
CJNE
MOV
LCALL

001Bh ; interrupcao timer 1


TH1,#4Ch ; recarrega TH1
TESTE
A,TESTE
A,#20,FIM ;se teste = 20 x 50ms = 1 segundo...
TESTE,#0 ;... reinicia variavel teste e...
RELOGIO ;... atualiza relogio

FIM:
RETI
;-----------------------------------------------------------------------------;
INICIALIZACAO: APENAS INT TIMER 1 HABILITADA, PRIORIDADE ALTA
;-----------------------------------------------------------------------------ORG

0050h

INICIO:
MOV IE,#00000000B ;desabilita todas as interrupcoes
MOV TCON,#00000000B
; ||||_______
; |||________
; ||_________
; |__________

TR0
TF0
TR1
TF1

=
=
=
=

0
0
0
0

->
->
->
->

timer 0
flag de
timer 0
flag de

parado
overflow do T/C 0 zerado
parado
overflow do T/C 0 zerado

MOV TMOD,#00010000B
; ||||___ M0 = 1 -> timer 1 no...
; |||____ M1 = 0 -> ...modo 1: 16 bits
; ||_____ C/T'= 0 -> timer 1 na funcao timer
; |______ GATE= 0 -> timer 1 controlado somente por TR0
;T/C 1 nao utilizado
MOV

IP,#00001000b
; |__ PT1 = 1 -> prioridade para a int do timer 1

MOV

IE,#10001000b
;|
|__ ET1 = 1 -> habilita a int do timer 1
;|____ EA = 1 -> habilita todas as ints que...
; ...estiverem habilitadas

;-----------------------------------------------------------------------------; SUBROTINA DE INICALIZACAO DO DISPLAY


;------------------------------------------------------------------------------

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

26/34

KIT S51 V1.1

LCALL INILCD
;-----------------------------------------------------------------------------; PROGRAMA PRINCIPAL
;-----------------------------------------------------------------------------LCALL ZERA
CHAVE0:
MOV
CJNE
CLR

A,P3
A,#11111110b,START ;AJUSTAR O RELOGIO?
TR1

MOV
CJNE
LCALL
LJMP

A,P3
A,#11111111b,SOLTA ;INICIAR O RELOGIO?
AJUSTE
CHAVE0

SOLTA:

START:
CJNE A,#11111101b,CHAVE0 ;INICIAR O RELOGIO?
LCALL TIMER1
LJMP CHAVE0
;-----------------------------------------------------------------------------;SUBROTINA PARA TRATAMENTO DA INTERRUPCAO EXTERNA 0
;-----------------------------------------------------------------------------AJUSTE:
MOV
CJNE
TERMINAAJUSTE:
MOV
CJNE
RET
CHAVE1:
CJNE
LCALL
SOLTAHORA:
MOV
CJNE
LJMP
CHAVE2:
CJNE
LCALL
SOLTAMIN:
MOV
CJNE
LJMP
CHAVE3:
CJNE
LCALL
SOLTAZERA:
MOV
CJNE
LJMP

R0,P3
R0,#11111110b,CHAVE1 ; terminou ajuste?
R0,P3
R0,#11111111b,TERMINAAJUSTE ; verifica se chave 0 foi solta

R0,#11111101b,CHAVE2 ; se chave 1 pressionada...


AJUSTEHORA
; ...incrementa hora
R0,P3
R0,#11111111b,SOLTAHORA
AJUSTE

; verifica se chave 1 foi solta

R0,#11111011b,CHAVE3
AJUSTEMIN

; se chave 0 pressionada...
; ...incrementa minuto

R0,P3
R0,#11111111b,SOLTAMIN
AJUSTE

; verifica se chave 2 foi solta

R0,#11110111b,AJUSTE ; se chave 2 pressionada...


ZERA
; ... zera o relogio
R0,P3
R0,#11111111b,SOLTAZERA
AJUSTE

; verifica se chave 3 foi solta

;-----------------------------------------------------------------------------;AJUSTE DAS HORAS E MINUTOS


;-----------------------------------------------------------------------------AJUSTEHORA:
MOV
ADD
DA
MOV
CJNE
MOV
ATUALIZAHORA:
LCALL
RET

A,HORA
A,#1

;aumenta 1 hora e...


;... ajusta o numero hexa ...
A
; ...para o formato BCD
HORA,A
; atualiza a variavel hora
A,#24h,ATUALIZAHORA ;se hora = 24...
HORA,#00h
;... zera hora
HOR

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

27/34

KIT S51 V1.1

AJUSTEMIN:
MOV
ADD
DA
MOV
CJNE
MOV

A,MINUTO ;aumenta 1 minuto e...


A,#1
;... ajusta o numero hexa ...
A
; ...para o formato BCD
MINUTO,A ; atualiza a variavel minuto
A,#60h,ATUALIZAMIN ;se minuto = 60...
MINUTO,#00h
; zera minuto

ATUALIZAMIN:
LCALL MIN
RET
;-----------------------------------------------------------------------------;TRTAMENTO DA INTERRUPCAO DO TIMER --> SUBROTINA DO RELOGIO
;-----------------------------------------------------------------------------RELOGIO:
MOV
ADD
DA
MOV
CJNE
MOV

A,SEGUNDO ;aumenta 1 segundo e...


A,#1
;... ajusta o numero hexa ...
A
; ...para o formato BCD
SEGUNDO,A ; atualiza a variavel segundo
A,#60h,SEG
;se segundo = 60...
SEGUNDO,#00h ;... zera os segundos e aumenta os minutos

MOV
ADD
DA
MOV
CJNE
MOV

A,MINUTO ;aumenta 1 minuto e...


A,#1
;... ajusta o numero hexa ...
A
; ...para o formato BCD
MINUTO,A ; atualiza a variavel minuto
A,#60h,MIN
;se minuto = 60...
MINUTO,#00h ;... zera os minutos e aumenta as horas

MOV
ADD
DA
MOV
CJNE
LCALL
RET

A,HORA
A,#1

SOMAMIN:

SOMAHORA:
;aumenta 1 hora e...
;... ajusta o numero hexa ...
A
; ...para o formato BCD
HORA,A
; atualiza a variavel hora
A,#24h,HOR ;se hora = 24: chama a rotina para...
ZERA
;... colocar o relogio em 00:00:00

;-----------------------------------------------------------------------------; ATUALIZACAO DO RELOGIO NO DISPLAY LCD


;-----------------------------------------------------------------------------SEG:
MOV
LCALL
MOV
LCALL
RET

B,#0Ah
;atualiza o valor...
POSCURSOR ;... dos segundos...
B,SEGUNDO ;... no display LCD
PRINTBCDHL

MOV
LCALL
MOV
LCALL
JMP

B,#07h
POSCURSOR ;atualiza o valor...
B,MINUTO
;... dos minutos...
PRINTBCDHL ;... no display LCD
SEG

MOV
LCALL
MOV
LCALL
JMP

B,#04h
POSCURSOR ;atualiza o valor...
B,HORA
;... das horas...
PRINTBCDHL ;... no display LCD
MIN

MIN:

HOR:

;-----------------------------------------------------------------------------; SUBROTINA PARA ZERAR O RELOGIO


;-----------------------------------------------------------------------------ZERA:
MOV
HORA,#00h
;zera variavel hora
MOV
MINUTO,#00h ;zera variavel minuto
MOV
SEGUNDO,#00h ;zera variavel segundo
MOV
TESTE,#00h
;zera variavel teste
MOV
B,#04h
;ajusta a posicao do cursor para o relogio...
LCALL POSCURSOR ;... ficar no meio do display

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

28/34

KIT S51 V1.1

MOV
DPTR,#MEIANOITE ;escreve a frase...
LCALL PRINTSTRING
;...meia noite no display
RET
MEIANOITE:
DB

'00:00:00\'

;-----------------------------------------------------------------------------;SUBROTINA PARA LIGAR TIMER 1 COM ATRASO DE 50ms


;-----------------------------------------------------------------------------TIMER1:
MOV
MOV
SETB
RET

TH1,#4Ch ; fclk CPU = 11059200Hz -> 46.080 x 1,085us...


TL1,#00h ; ... base de tempo de 50ms
TR1
; dispara timer

;==============================================================================
;=
SUBROTINAS PARA O DISPLAY LCD
=
;==============================================================================
;-----------------------------------------------------------------------------; INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: R1
; CHAMA: IWRITE, CLEARLCD, DELAY
;-----------------------------------------------------------------------------INILCD:
CLR
MOV
LCALL
MOV
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL

P0.1
;desabilita a escrita no display
R6,#50 ;gera atraso de 50x0,5ms = 25ms
DELAY
B,#00110000b ;comando para inicializacao
IWRITE
R6,#9 ;gera atraso de 9x0,5ms = 4,5ms
DELAY
IWRITE ;repete instrucao
R6,#1 ;gera atraso de 1x0,5ms = 0,5ms
DELAY
IWRITE ;repete instrucao

; Configuracao do usuario
MOV

B,#00111000b
;|||______ F = 0 -> matrizde 5x8 pontos
;||_______ N = 1-> 2 linhas
;|________ DL = 1 -> 8 bits
LCALL IWRITE
MOV

B,#00001110b
;|||____ B = 0 -> local do cursor nao pisca
;||_____ C = 1 -> cursor visivel
;|______ D = 1 -> liga o display (aparece frase)
LCALL IWRITE
MOV

B,#00000110b
;||____ SH=0 -> no desloca frase ao escrever caractere
;|_____ I/D = 1 -> cursor se move para direita
LCALL IWRITE
LCALL CLEARLCD
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA LIMPAR O DISPLAY
;-----------------------------------------------------------------------------; Apaga todos os caracteres e posiciona o cursor no inicio do display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
-

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

29/34

KIT S51 V1.1

; SAIDA: nenhuma
;
; DESTROI: Caracteres armazenados da DDRAM, R6, A
; CHAMA: IWRITE, POSCURSOR, DELAY
;-----------------------------------------------------------------------------CLEARLCD:
PUSH
MOV
LCALL
MOV
LCALL
MOV
LCALL
POP
RET

B
B,#00000001b ;Instrucao Clear display
IWRITE
R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...
DELAY ;...clear display leva para ser executada
B,#0
;posiciona o cursor no inicio do display -> endereco 00h
POSCURSOR
B

;-----------------------------------------------------------------------------; SUBROTINA PARA SELECIONAR A POSICAO DO CURSOR NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> endereco da DDRAM que o cursor sera posicionado
; SAIDA: nenhuma
;
; DESTROI: A, B
; CHAMA: IWRITE
;-----------------------------------------------------------------------------POSCURSOR:
PUSH
MOV
ORL
MOV
LCALL
POP
RET

B ;armazena o valor de B na pilha


A,B
A,#10000000b
B,A
IWRITE
B ;restaura o valor de B

;-----------------------------------------------------------------------------; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> instrucao a ser executada
; SAIDA: nenhuma
;
; DESTROI: R7
; CHAMA: runT0
;-----------------------------------------------------------------------------IWRITE:
MOV
CLR
SETB
MOV
DJNZ
CLR
RET

P1,B
P0.0 ;seleciona RS = 0 (instrucao)
P0.1 ;habilita escrita
R7,#18 ;aguarda 39us para...
R7,$ ;executar o comando
P0.1 ;desabilita escrita

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER CARACTER ASCII NO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: B --> caractere (em ASCII) a ser escrito no display
; SAIDA: nenhuma
;
; DESTROI: R7
; CHAMA: runT0
;-----------------------------------------------------------------------------PRINTASCII:
MOV
SETB
SETB
MOV
DJNZ
CLR

P1,B
P0.0 ;seleciona RS = 1 (dado)
P0.1 ;habilita escrita
R7,#20 ;aguarda 43us para...
R7,$ ;... realizar a escrita
P0.1 ;desabilita escrita

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

30/34

KIT S51 V1.1

RET
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DIGITO BCD MENOS SIGNIFICATIVO
;-----------------------------------------------------------------------------; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD;-----------------------------------------------------------------------------; ENTRADA: B --> numero BCD
; SAIDA: nenhuma
;
; DESTROI: A
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDL:
PUSH
MOV
ANL
ADD
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


A,B
A,#00001111b ;usa apenas 4bits menos significativo
A,#30h ;converte resultado para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DOIS DIGITOS BCD


;-----------------------------------------------------------------------------; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD;-----------------------------------------------------------------------------; ENTRADA: B --> numero BCD
; SAIDA: nenhuma
;
; DESTROI: A, B
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDHL:
PUSH B ;armazena conteudo de B na pilha
MOV
A,B
ANL
A,#11110000b ;separa 4 bits mais significativos
SWAP A ;troca nibble menos significativo por mais significativo
ADD
A,#30h ;converte para ASCII
MOV
B,A ;restaura conteudo de B da pilha
LCALL PRINTASCII
POP
B
MOV
A,B
ANL
A,#00001111b ;separa 4 bits menos significativos
ADD
A,#30h ;converte para ASCII
MOV
B,A
LCALL PRINTASCII
RET
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DIGITO HEXADECIMAL MENOS SIGNIFICATIVO
;-----------------------------------------------------------------------------; ENTRADA: B --> numero HEXA
; SAIDA: nenhuma
;
; DESTROI: A, DPTR
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTHEXAL:
PUSH
MOV
MOV
ANL
MOVC
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


DPTR,#TABHEXA
A,B
A,#00001111b ;separa nibble menos significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

31/34

KIT S51 V1.1

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER DOIS DIGITOS HEXADECIMAIS


;-----------------------------------------------------------------------------; ENTRADA: B --> numero HEXA
; SAIDA: nenhuma
;
; DESTROI: A, DPTR
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTHEXAHL:
PUSH
MOV
MOV
ANL
SWAP
MOVC
MOV
LCALL
POP
MOV
ANL
MOVC
MOV
LCALL
RET

B ;armazena conteudo de B na pilha


DPTR,#TABHEXA
A,B
A,#11110000b ;separa nibble mais significativo
A ;troca nibble menos significativo por mais significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII
B ;restaura conteudo de B da pilha
A,B
A,#00001111b ;separa nibble menos significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII

DB

'0123456789ABCDEF'

TABHEXA:

;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY


;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caractere especial: '\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRING:
PUSH
MOV

B ;armazena conteudo de B na pilha


R0,#0 ;inicia a escrita a partir da primeira letra da frase

MOV
MOVC
MOV

A,R0 ;converte o caractere hexadecimal...


A,@A+DPTR ;... em ASCII
B,A

CJNE
POP
RET

A,#'\',WRITE ;encontrou o caractere '\' ?


B
;sim -> para de escrever

PRINTS:

WRITE:
LCALL PRINTASCII
INC
R0
JMP
PRINTS
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;------------------------------------------------------------------------------

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

32/34

KIT S51 V1.1

; Caracteres especiais: '/' -> quebra de linha (da primeira para a segunda)
;
'\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRINGALL:
PUSH B ;armazena conteudo de B na pilha
LCALL CLEARLCD
MOV
R0,#0 ;inicia a escrita a partir da primeira letra da frase
PRINTSALL:
MOV
MOVC
MOV

A,R0 ;converte o caractere hexadecimal...


A,@A+DPTR ;... em ASCII
B,A

CJNE
MOV
LCALL
INC
JMP

A,#'/',FIMSTR ;encontrou o caractere '/' ?


B,#40h ;sim -> comeca a escrever na segunda linha
POSCURSOR
R0
PRINTSALL

WRITEALL:
LCALL PRINTASCII
INC
R0
JMP
PRINTSALL
FIMSTR:
CJNE
POP
RET

A,#'\',WRITEALL ;encontrou o caractere '\'?


B
;sim -> para de escrever

;-----------------------------------------------------------------------------; SUBROTINA PARA DESLOCAR A FRASE A DIREITA


;-----------------------------------------------------------------------------; Desloca para a direita todos os caracteres ja escritos no display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI:
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDR:
PUSH
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


B,#00011100b
IWRITE
B ;restaura conteudo de B na pilha

;-----------------------------------------------------------------------------; SUBROTINA PARA DESLOCAR A FRASE A ESQUERDA


;-----------------------------------------------------------------------------; Desloca para a esquerda todos os caracteres ja escritos no display
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: B
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDL:
PUSH
MOV
LCALL
POP
RET

B ;armazena conteudo de B na pilha


B,#00011000b
IWRITE
B ;restaura conteudo de B na pilha

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

33/34

KIT S51 V1.1

;-----------------------------------------------------------------------------; SUBROTINA PARA GERAR ATRASO DE R1 x 0,5ms


;-----------------------------------------------------------------------------; ENTRADA: R6 --> valor a ser multiplicado pela base de tempo
;
; SAIDA: nenhuma
;
; DESTROI: R7, R6
;-----------------------------------------------------------------------------DELAY:
MOV
DJNZ
DJNZ
RET

R7,#228
R7,$
R6,DELAY

END

Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni

34/34

Вам также может понравиться