34
KIT S51 V1.1 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 1/34 2008 KIT S51 Kit didático para microcontrolador AT89S51/52 Requisitos - Placa de circuito impresso “KIT S51 V1.1”. - Componentes para montagem da placa. - Cabo para gravação. - Fonte DC. - Aplicativo “RIDE” para 8051, no qual serão desenvolvidos os programas a serem gravados no microcontrolador. - Aplicativo para gravação “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 cerâmicos 100nF 2 capacitores eletrolíticos 10uF x 16V ou 25V 2 capacitores cerâmicos 33pF 1 capacitor poliéster 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 tensão) 25 micro-swich NA para PCI (ver foto da placa) Barra de pinos 180 0 [4 pinos] Barra de pinos fêmea para PCI (mini modul para PCI) [19 pinos] Barra de pinos fêmea torneado [42 pinos] 1 soquete torneado 40 pinos 1 soquete torneado 18 pinos 1 display LCD 16 x 2 sem backlight Com o display Dica para montagem do display de 7 segmentos: soquete com barra de pinos fêmea.

Manual_KIT_S51_V1-1

Embed Size (px)

DESCRIPTION

Manual de uso do Kit 8051

Citation preview

  • KIT S51 V1.1

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

    2008 KIT S51

    Kit didtico para microcontrolador AT89S51/52

    Requisitos

    - 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

    Com o display

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

  • KIT S51 V1.1

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

    2. Circuito

    Title

    Siz

    eD

    ocu

    me

    nt

    Nu

    mb

    er

    Re

    v

    Da

    te:

    Sheet

    of

    V1

    .1-

    KIT

    S5

    1

    Cu

    sto

    m

    11

    2

    C1

    2

    10uF

    U1

    8051

    PS

    EN

    29

    ALE

    30

    VC

    C40

    GN

    D20

    EA

    31

    X119

    X218

    RS

    T9

    P0

    .0/A

    D0

    39

    P0

    .1/A

    D1

    38

    P0

    .2/A

    D2

    37

    P0

    .3/A

    D3

    36

    P0

    .4/A

    D4

    35

    P0

    .5/A

    D5

    34

    P0

    .6/A

    D6

    33

    P0

    .7/A

    D7

    32

    P1

    .01

    P1

    .12

    P1

    .23

    P1

    .34

    P1

    .45

    P1

    .56

    P1

    .67

    P1

    .78

    P2

    .0/A

    821

    P2

    .1/A

    922

    P2

    .2/A

    10

    23

    P2

    .3/A

    11

    24

    P2

    .4/A

    12

    25

    P2

    .5/A

    13

    26

    P2

    .6/A

    14

    27

    P2

    .7/A

    15

    28

    P3

    .0/R

    XD

    10

    P3

    .1/T

    XD

    11

    P3

    .2/I

    NT

    012

    P3

    .3/I

    NT

    113

    P3

    .4/T

    014

    P3

    .5/T

    115

    P3

    .6/W

    R16

    P3

    .7/R

    D17

    U2 U

    LN

    28

    03

    CO

    M10

    GN

    D9

    IN1

    1

    IN2

    2

    IN3

    3

    IN4

    4

    IN5

    5

    IN6

    6

    IN7

    7

    IN8

    8

    OU

    T1

    18

    OU

    T2

    17

    OU

    T3

    16

    OU

    T4

    15

    OU

    T5

    14

    OU

    T6

    13

    OU

    T7

    12

    OU

    T8

    11

    R1

    8

    10k

    11

    ,05

    92

    MH

    zC

    RY

    STA

    L

    3

    R1

    9

    10k

    C9

    0.1

    uF

    R1

    2470

    +V

    R1

    10k

    R2

    470

    C3

    10uF

    RE

    SE

    T

    +5

    V

    CA

    BO

    P1

    .51

    P1

    .62

    P1

    .73

    RS

    T4

    GN

    D5

    R2

    0

    10k

    DIS

    PL

    AY

    Vss

    1V

    dd

    2V

    o3

    RS

    4R

    /W5

    E6

    DB

    07

    DB

    18

    DB

    29

    DB

    310

    DB

    411

    DB

    512

    DB

    613

    DB

    714

    4

    C1

    33pF

    C2

    33pF

    CH

    0

    R2

    1

    10k

    5

    R1

    41

    k5

    R2

    2

    10k

    6

    R1

    6

    10k

    7

    89

    +5

    V

    +5

    V

    C6

    10uF

    C7

    10uF

    +V

    P0 P

    0.0

    1

    P0

    .12

    P0

    .23

    P0

    .34

    P0

    .45

    P0

    .56

    P0

    .67

    P0

    .78

    +5

    V

    P2

    P2

    .01

    P2

    .12

    P2

    .23

    P2

    .34

    P2

    .45

    P2

    .56

    P2

    .67

    P2

    .78

    P3

    P3

    .01

    P3

    .12

    P3

    .23

    P3

    .34

    P3

    .45

    P3

    .56

    P3

    .67

    P3

    .78

    C1

    0

    0.3

    3u

    F

    P2D

    P2

    .0D

    1P

    2.1

    D2

    P2

    .2D

    3P

    2.3

    D4

    P2

    .4D

    5P

    2.5

    D6

    P2

    .6D

    7P

    2.7

    D8

    C4

    10uF

    R2

    3470

    R2

    4470

    R2

    5470

    C5

    10uF

    CH

    1

    R3

    10K

    A

    Alim

    en

    ta

    o

    1 2 3 4

    R4

    10K

    R5

    10K

    R6

    10K

    R7

    10K

    R8

    10K

    R9

    10K

    R1

    010K

    CH

    2

    R1

    5

    10k

    C1

    1

    0.1

    uF

    +5

    V

    CH

    3

    GR

    AV

    AD

    OR

    CH

    4

    +5

    V

    +5

    V

    a

    b

    c

    d

    e

    f

    gf

    a

    b

    ed

    g

    c

    dp

    ++

    U4

    7S

    EG

    1

    3456

    78910

    2

    C8

    10uF

    CH

    5

    F

    ME

    A

    CH

    6

    B

    CH

    7

    0

    DB

    9

    594837261

    SE

    RIA

    L

    1 2 3

    C

    Fernando E. Gazzoni / Gustavo B. Borba

    U6

    7805

    VIN

    1V

    OU

    T3

    GND2

    D

    R2

    8470

    R1

    3470

    E

    +5

    V

    U3

    MA

    X2

    32

    C1

    +1

    C1

    -3

    C2

    +4

    C2

    -5

    VC

    C16

    GN

    D15

    V+

    2

    V-

    6

    R1

    OU

    T12

    R2

    OU

    T9

    T1

    IN11

    T2

    IN10

    R1

    IN13

    R2

    IN8

    T1

    OU

    T14

    T2

    OU

    T7

    R1

    110k

    F

    R2

    7470

    R2

    6470

    +5

    V

    DK

    1

    GN

    D

    R1

    7

    10k

  • KIT S51 V1.1

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

    3. Cabo para gravao Pinagem

    DB25 (porta paralela) Conector CABO da placa

    7 (D5) P1.5

    10 (ACK) P1.6

    8 (D6) P1.7

    6 (D4) RST

    18-25 (GND) 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.

  • KIT S51 V1.1

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

    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 AT89S51 ou AT89S52 e clicar em OK

    http://www.raisonance.com/download/index.phphttp://www.raisonance.com/download/dwnlform_new.php?TOOLS=51&BN=744http://www.aec-electronics.co.nz/index.php?page_id=18

  • KIT S51 V1.1

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

    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)

  • KIT S51 V1.1

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

    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.

  • KIT S51 V1.1

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

    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.

  • KIT S51 V1.1

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

    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 00h

    MOV 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

  • KIT S51 V1.1

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

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

    ; 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

  • KIT S51 V1.1

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

    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 A,P3

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

    LCALL CH0 ;...chama subrotina CH0

    JMP 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

  • KIT S51 V1.1

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

    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 P0.1 ;desabilita a escrita no display

    MOV R6,#50 ;gera atraso de 50x0,5ms = 25ms

    LCALL DELAY

    MOV B,#00110000b ;comando para inicializacao

    LCALL IWRITE

    MOV R6,#9 ;gera atraso de 9x0,5ms = 4,5ms

    LCALL DELAY

  • KIT S51 V1.1

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

    LCALL IWRITE ;repete instrucao

    MOV R6,#1 ;gera atraso de 1x0,5ms = 0,5ms

    LCALL DELAY

    LCALL 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 B

    MOV B,#00000001b ;Instrucao Clear display

    LCALL IWRITE

    MOV R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...

    LCALL DELAY ;...clear display leva para ser executada

    MOV B,#0 ;posiciona o cursor no inicio do display -> endereco 00h

    LCALL POSCURSOR

    POP B

    RET

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

    ; 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 B ;armazena o valor de B na pilha

    MOV A,B

    ORL A,#10000000b

    MOV B,A

    LCALL IWRITE

    POP B ;restaura o valor de B

    RET

  • KIT S51 V1.1

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

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

    ; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY -

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

    ; ENTRADA: B --> instrucao a ser executada -

    ; SAIDA: nenhuma -

    ; -

    ; DESTROI: R7 -

    ; CHAMA: runT0 -

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

    IWRITE:

    MOV P1,B

    CLR P0.0 ;seleciona RS = 0 (instrucao)

    SETB P0.1 ;habilita escrita

    MOV R7,#18 ;aguarda 39us para...

    DJNZ R7,$ ;executar o comando

    CLR P0.1 ;desabilita escrita

    RET

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

    ; 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 P1,B

    SETB P0.0 ;seleciona RS = 1 (dado)

    SETB P0.1 ;habilita escrita

    MOV R7,#20 ;aguarda 43us para...

    DJNZ R7,$ ;... realizar a escrita

    CLR P0.1 ;desabilita escrita

    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 B ;armazena conteudo de B na pilha

    MOV A,B

    ANL A,#00001111b ;usa apenas 4bits menos significativo

    ADD A,#30h ;converte resultado para ASCII

    MOV B,A

    LCALL PRINTASCII

    POP B ;restaura conteudo de B da pilha

    RET

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

  • KIT S51 V1.1

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

    ; 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 B ;armazena conteudo de B na pilha

    MOV DPTR,#TABHEXA

    MOV A,B

    ANL A,#11110000b ;separa nibble mais significativo

    SWAP A ;troca nibble menos significativo por mais significativo

    MOVC A,@A+DPTR ;converte caractere para ASCII

    MOV B,A

    LCALL PRINTASCII

    POP B ;restaura conteudo de B da pilha

    MOV A,B

    ANL A,#00001111b ;separa nibble menos significativo

    MOVC A,@A+DPTR ;converte caractere para ASCII

    MOV B,A

    LCALL PRINTASCII

    RET

  • KIT S51 V1.1

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

    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 B ;armazena conteudo de B na pilha

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

    PRINTS:

    MOV A,R0 ;converte o caractere hexadecimal...

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

    MOV B,A

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

    POP B ;sim -> para de escrever

    RET

    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 A,R0 ;converte o caractere hexadecimal...

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

    MOV B,A

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

    MOV B,#40h ;sim -> comeca a escrever na segunda linha

    LCALL POSCURSOR

    INC R0

    JMP PRINTSALL

    WRITEALL:

    LCALL PRINTASCII

    INC R0

  • KIT S51 V1.1

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

    JMP PRINTSALL

    FIMSTR:

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

    POP B ;sim -> para de escrever

    RET

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

    ; 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 B ;armazena conteudo de B na pilha

    MOV B,#00011100b

    LCALL IWRITE

    POP B ;restaura conteudo de B na pilha

    RET

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

    ; 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 R7,#228

    DJNZ R7,$

    DJNZ R6,DELAY

    RET

    END

  • KIT S51 V1.1

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

    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 00h ;reset do sistema

    LJMP ini

    ORG 03h ;interrupcao externa 0

    LJMP 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 = 1 -> int ext 0 por borda de descida

    ; ||||_______ TR0 = 0 -> timer 0 parado

    ; |||________ TF0 = 0 -> flag de overflow do T/C 0 zerado

    ; ||_________ TR1 = 0 -> timer 1 parado

    ; |__________ TF1 = 0 -> flag de 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

  • KIT S51 V1.1

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

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

    le:

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

    CLR DESLIGA ;zera o flag de parada do alarme

    LCALL alarme ;chama a subrotina para tocar o alarme

    SJMP le

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

    ;ISR DA INTERRUPCAO EXTERNA 0

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

    int_ext0:

    SETB DESLIGA ;seta o flag de parada do alarme

    RETI

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

    ; 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 TH0,#0F9h

    MOV TL0,#1Eh

    SETB TR0 ;dispara timer

    JNB TF0,$ ;preso

    CLR TR0 ;stop timer

    CLR TF0 ;zera flag overflow

    CPL P2.7 ;complementa P2.0

    JNB DESLIGA,alarme ;sai se o flag de parada estiver setado

    RET

    END

  • KIT S51 V1.1

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

    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 00h ;reset

    JMP INI ;salta para rotina principal

    ;reserva regio do vetor de interrupes

    ORG 0050h ;incio do programa

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

    ; INICIALIZACAO DO DISPLAY -

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

    INI:

    MOV P2,#00 ;apaga display 7 segmentos

    LCALL INILCD

    LCALL CLEARLCD

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

    ; PROGRAMA PRINCIPAL -

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

    MAIN:

    LCALL IN_HEX ;chama subrotina para ler teclado

    MOV B,#07 ;escreve a partir do endereco...

    LCALL POSCURSOR ;... 07 do LCD

    MOV B,R6 ;copia o valor da tecla pressionada...

    LCALL PRINTHEXAL ;... e mostra no LCD

    SJMP 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

    RETURN:

    CALL READ ;chave foi pressionada?

    JNC IN_HEX ;nao -> verifica novamente

    DJNZ R4,RETURN ;sim -> repete 50x

    PUSH ACC ;armazena na pilha o codigo hexa da tecla apertada

    RETURN2:

    MOV R4,#50 ;aguarda a chave ser solta

    RETURN3:

    CALL READ ;chave continua pressionada?

    JC RETURN2 ;sim -> verifica novamente

    DJNZ R4,RETURN3 ;nao -> repete 50x

    POP ACC ;recupera o codigo hexa da chave e...

    MOV R6,A ;... salva em R6

    RET

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

    ; SUBROTINA PARA LEITURA E DECODIFICACAO DO TECLADO MATRICIAL -

  • KIT S51 V1.1

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

    ; 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 A,#0FEh ;inicia na coluna 0

    MOV R6,#4 ;R6 = contador

    TEST_AGAIN:

    MOV P3,A

    MOV R7,A ;guarda o conteudo do acumulador

    MOV A,P3 ;le port3

    ANL A,#0F0h ;usa apenas os valores das linhas

    CJNE A,#0F0h,CH_PRESS ;alguma linha esta ativa?

    MOV A,R7 ;nao -> move para a proxima coluna

    RL A

    DJNZ R6,TEST_AGAIN ;nenhuma chave pressionada?

    CLR C ;retorna com C=0

    SJMP FIN

    CH_PRESS:

    MOV R7,A ;salva o codigo da coluna em R7

    MOV A,#4 ;prepara o calculo do peso da coluna

    CLR C

    SUBB A,R6 ;4-R6 = peso da coluna

    MOV R6,A ;guarda o resultado em R6

    MOV A,R7 ;restaura a busca para A

    SWAP A ;coloca o resultado da busca no nibble LS

    MOV R5,#4 ;usa R5 como um contador

    AGAIN:

    RRC A ;rotaciona ate encontrar o bit 0

    JNC HEX ;sai quando C=0

    INC R6 ;adiciona 4...

    INC R6 ;...

    INC R6 ;...

    INC R6 ;... ate encontrar a coluna

    DJNZ R5,AGAIN

    HEX:

    SETB C ;C=1 -> chave pressionada

    MOV A,R6 ;codigo hex salvo em A

    FIN:

    RET

    ;==============================================================================

    ;= SUBROTINAS PARA O DISPLAY LCD =

    ;==============================================================================

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

    ; INICIALIZACAO DO DISPLAY -

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

    ; ENTRADA: nenhuma -

    ; SAIDA: nenhuma -

    ; -

    ; DESTROI: R6 -

    ; CHAMA: IWRITE, CLEARLCD, DELAY -

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

    INILCD:

    CLR P0.1 ;desabilita a escrita no display

    MOV R6,#50 ;gera atraso de 50x0,5ms = 25ms

    LCALL DELAY

    MOV B,#00110000b ;comando para inicializacao

    LCALL IWRITE

    MOV R6,#9 ;gera atraso de 9x0,5ms = 4,5ms

    LCALL DELAY

    LCALL IWRITE ;repete instrucao

    MOV R6,#1 ;gera atraso de 1x0,5ms = 0,5ms

    LCALL DELAY

    LCALL IWRITE ;repete instrucao

  • KIT S51 V1.1

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

    ; 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 B

    MOV B,#00000001b ;Instrucao Clear display

    LCALL IWRITE

    MOV R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...

    LCALL DELAY ;...clear display leva para ser executada

    MOV B,#0 ;posiciona o cursor no inicio do display -> endereco 00h

    LCALL POSCURSOR

    POP B

    RET

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

    ; 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 B

    MOV A,B

    ORL A,#10000000b

    MOV B,A

    LCALL IWRITE

    POP B

    RET

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

  • KIT S51 V1.1

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

    ; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY -

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

    ; ENTRADA: B --> instrucao a ser executada -

    ; SAIDA: nenhuma -

    ; -

    ; DESTROI: R7 -

    ; CHAMA: runT0 -

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

    IWRITE:

    MOV P1,B

    CLR P0.0 ;seleciona RS = 0 (instrucao)

    SETB P0.1 ;habilita escrita

    MOV R7,#18 ;aguarda 39us para...

    DJNZ R7,$ ;executar o comando

    CLR P0.1 ;desabilita escrita

    RET

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

    ; 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 P1,B

    SETB P0.0 ;seleciona RS = 1 (dado)

    SETB P0.1 ;habilita escrita

    MOV R7,#20 ;aguarda 43us para...

    DJNZ R7,$ ;... realizar a escrita

    CLR P0.1 ;desabilita escrita

    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 B ;armazena conteudo de B na pilha

    MOV A,B

    ANL A,#00001111b ;usa apenas 4bits menos significativo

    ADD A,#30h ;converte resultado para ASCII

    MOV B,A

    LCALL PRINTASCII

    POP B ;restaura conteudo de B da pilha

    RET

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

    ; 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 -

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

  • KIT S51 V1.1

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

    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, B, DPTR -

    ; CHAMA: PRINTASCII -

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

    PRINTHEXAHL:

    PUSH B ;armazena conteudo de B na pilha

    MOV DPTR,#TABHEXA

    MOV A,B

    ANL A,#11110000b ;separa nibble mais significativo

    SWAP A ;troca nibble menos significativo por mais significativo

    MOVC A,@A+DPTR ;converte caractere para ASCII

    MOV B,A

    LCALL PRINTASCII

    POP B ;restaura conteudo de B da pilha

    MOV A,B

    ANL A,#00001111b ;separa nibble menos significativo

    MOVC A,@A+DPTR ;converte caractere para ASCII

    MOV B,A

    LCALL PRINTASCII

    RET

    TABHEXA:

    DB '0123456789ABCDEF'

  • KIT S51 V1.1

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

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

    ; 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 B ;armazena conteudo de B na pilha

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

    PRINTS:

    MOV A,R7 ;converte o caractere hexadecimal...

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

    MOV B,A

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

    POP B ;sim -> para de escrever

    RET

    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 A,R7 ;converte o caractere hexadecimal...

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

    MOV B,A

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

    MOV B,#40h ;sim -> comeca a escrever na segunda linha

    LCALL POSCURSOR

    INC R7

    JMP PRINTSALL

    WRITEALL:

    LCALL PRINTASCII

    INC R7

    JMP PRINTSALL

    FIMSTR:

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

  • KIT S51 V1.1

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

    POP B ;sim -> para de escrever

    RET

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

    ; 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 B ;armazena conteudo de B na pilha

    MOV B,#00011100b

    LCALL IWRITE

    POP B ;restaura conteudo de B na pilha

    RET

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

    ; 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 R7,#228

    DJNZ R7,$

    DJNZ R6,DELAY

    RET

    END

    Exemplo 5

    ;==============================================================================

    ;= AUTOR: FERNANDO GAZZONI/GUSTAVO BORBA DATA:05/2008 ARQUIVO:clock.a51 =

    ;= CPU: AT89S51 clk: 11,059200MHz =

    ;==============================================================================

    ;= RELOGIO DIGITAL =

  • KIT S51 V1.1

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

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

    ;= 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 EQU 40h ;armazena as horas

    MINUTO EQU 41h ;armazena os minutos

    SEGUNDO EQU 42h ;armazena os segundos

    TESTE EQU 43h ;testa se passou 1seg para atualizar o relogio

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

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

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

    ORG 0000h ; reset do sistema

    LJMP INICIO

    ORG 001Bh ; interrupcao timer 1

    MOV TH1,#4Ch ; recarrega TH1

    INC TESTE

    MOV A,TESTE

    CJNE A,#20,FIM ;se teste = 20 x 50ms = 1 segundo...

    MOV TESTE,#0 ;... reinicia variavel teste e...

    LCALL 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 = 0 -> timer 0 parado

    ; |||________ TF0 = 0 -> flag de overflow do T/C 0 zerado

    ; ||_________ TR1 = 0 -> timer 0 parado

    ; |__________ TF1 = 0 -> flag de 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 -

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

  • KIT S51 V1.1

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

    LCALL INILCD

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

    ; PROGRAMA PRINCIPAL -

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

    LCALL ZERA

    CHAVE0:

    MOV A,P3

    CJNE A,#11111110b,START ;AJUSTAR O RELOGIO?

    CLR TR1

    SOLTA:

    MOV A,P3

    CJNE A,#11111111b,SOLTA ;INICIAR O RELOGIO?

    LCALL AJUSTE

    LJMP CHAVE0

    START:

    CJNE A,#11111101b,CHAVE0 ;INICIAR O RELOGIO?

    LCALL TIMER1

    LJMP CHAVE0

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

    ;SUBROTINA PARA TRATAMENTO DA INTERRUPCAO EXTERNA 0 -

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

    AJUSTE:

    MOV R0,P3

    CJNE R0,#11111110b,CHAVE1 ; terminou ajuste?

    TERMINAAJUSTE:

    MOV R0,P3

    CJNE R0,#11111111b,TERMINAAJUSTE ; verifica se chave 0 foi solta

    RET

    CHAVE1:

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

    LCALL AJUSTEHORA ; ...incrementa hora

    SOLTAHORA:

    MOV R0,P3

    CJNE R0,#11111111b,SOLTAHORA ; verifica se chave 1 foi solta

    LJMP AJUSTE

    CHAVE2:

    CJNE R0,#11111011b,CHAVE3 ; se chave 0 pressionada...

    LCALL AJUSTEMIN ; ...incrementa minuto

    SOLTAMIN:

    MOV R0,P3

    CJNE R0,#11111111b,SOLTAMIN ; verifica se chave 2 foi solta

    LJMP AJUSTE

    CHAVE3:

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

    LCALL ZERA ; ... zera o relogio

    SOLTAZERA:

    MOV R0,P3

    CJNE R0,#11111111b,SOLTAZERA ; verifica se chave 3 foi solta

    LJMP AJUSTE

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

    ;AJUSTE DAS HORAS E MINUTOS -

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

    AJUSTEHORA:

    MOV A,HORA ;aumenta 1 hora e...

    ADD A,#1 ;... ajusta o numero hexa ...

    DA A ; ...para o formato BCD

    MOV HORA,A ; atualiza a variavel hora

    CJNE A,#24h,ATUALIZAHORA ;se hora = 24...

    MOV HORA,#00h ;... zera hora

    ATUALIZAHORA:

    LCALL HOR

    RET

  • KIT S51 V1.1

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

    AJUSTEMIN:

    MOV A,MINUTO ;aumenta 1 minuto e...

    ADD A,#1 ;... ajusta o numero hexa ...

    DA A ; ...para o formato BCD

    MOV MINUTO,A ; atualiza a variavel minuto

    CJNE A,#60h,ATUALIZAMIN ;se minuto = 60...

    MOV MINUTO,#00h ; zera minuto

    ATUALIZAMIN:

    LCALL MIN

    RET

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

    ;TRTAMENTO DA INTERRUPCAO DO TIMER --> SUBROTINA DO RELOGIO -

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

    RELOGIO:

    MOV A,SEGUNDO ;aumenta 1 segundo e...

    ADD A,#1 ;... ajusta o numero hexa ...

    DA A ; ...para o formato BCD

    MOV SEGUNDO,A ; atualiza a variavel segundo

    CJNE A,#60h,SEG ;se segundo = 60...

    MOV SEGUNDO,#00h ;... zera os segundos e aumenta os minutos

    SOMAMIN:

    MOV A,MINUTO ;aumenta 1 minuto e...

    ADD A,#1 ;... ajusta o numero hexa ...

    DA A ; ...para o formato BCD

    MOV MINUTO,A ; atualiza a variavel minuto

    CJNE A,#60h,MIN ;se minuto = 60...

    MOV MINUTO,#00h ;... zera os minutos e aumenta as horas

    SOMAHORA:

    MOV A,HORA ;aumenta 1 hora e...

    ADD A,#1 ;... ajusta o numero hexa ...

    DA A ; ...para o formato BCD

    MOV HORA,A ; atualiza a variavel hora

    CJNE A,#24h,HOR ;se hora = 24: chama a rotina para...

    LCALL ZERA ;... colocar o relogio em 00:00:00

    RET

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

    ; ATUALIZACAO DO RELOGIO NO DISPLAY LCD -

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

    SEG:

    MOV B,#0Ah ;atualiza o valor...

    LCALL POSCURSOR ;... dos segundos...

    MOV B,SEGUNDO ;... no display LCD

    LCALL PRINTBCDHL

    RET

    MIN:

    MOV B,#07h

    LCALL POSCURSOR ;atualiza o valor...

    MOV B,MINUTO ;... dos minutos...

    LCALL PRINTBCDHL ;... no display LCD

    JMP SEG

    HOR:

    MOV B,#04h

    LCALL POSCURSOR ;atualiza o valor...

    MOV B,HORA ;... das horas...

    LCALL PRINTBCDHL ;... no display LCD

    JMP MIN

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

    ; 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

  • KIT S51 V1.1

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

    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 TH1,#4Ch ; fclk CPU = 11059200Hz -> 46.080 x 1,085us...

    MOV TL1,#00h ; ... base de tempo de 50ms

    SETB TR1 ; dispara timer

    RET

    ;==============================================================================

    ;= SUBROTINAS PARA O DISPLAY LCD =

    ;==============================================================================

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

    ; INICIALIZACAO DO DISPLAY -

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

    ; ENTRADA: nenhuma -

    ; SAIDA: nenhuma -

    ; -

    ; DESTROI: R1 -

    ; CHAMA: IWRITE, CLEARLCD, DELAY -

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

    INILCD:

    CLR P0.1 ;desabilita a escrita no display

    MOV R6,#50 ;gera atraso de 50x0,5ms = 25ms

    LCALL DELAY

    MOV B,#00110000b ;comando para inicializacao

    LCALL IWRITE

    MOV R6,#9 ;gera atraso de 9x0,5ms = 4,5ms

    LCALL DELAY

    LCALL IWRITE ;repete instrucao

    MOV R6,#1 ;gera atraso de 1x0,5ms = 0,5ms

    LCALL DELAY

    LCALL 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 -

  • KIT S51 V1.1

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

    ; SAIDA: nenhuma -

    ; -

    ; DESTROI: Caracteres armazenados da DDRAM, R6, A -

    ; CHAMA: IWRITE, POSCURSOR, DELAY -

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

    CLEARLCD:

    PUSH B

    MOV B,#00000001b ;Instrucao Clear display

    LCALL IWRITE

    MOV R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...

    LCALL DELAY ;...clear display leva para ser executada

    MOV B,#0 ;posiciona o cursor no inicio do display -> endereco 00h

    LCALL POSCURSOR

    POP B

    RET

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

    ; 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 B ;armazena o valor de B na pilha

    MOV A,B

    ORL A,#10000000b

    MOV B,A

    LCALL IWRITE

    POP B ;restaura o valor de B

    RET

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

    ; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY -

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

    ; ENTRADA: B --> instrucao a ser executada -

    ; SAIDA: nenhuma