KIT S51 Kit didático para microcontrolador AT89S51/52

Documentos relacionados
Laboratório de Microprocessadores e Microcontroladores

Laboratório de Microprocessadores e Microcontroladores

Laboratório de Microprocessadores e Microcontroladores

Laboratório de Microprocessadores e Microcontroladores

Laboratório de Microprocessadores e Microcontroladores

Prof. Adilson Gonzaga

EXERCÍCIOS RESOLVIDOS

Temporização Interrupções. Prof: Evandro L. L. Rodrigues. Rotinas de Atraso

Interrupção. Prof. Adilson Gonzaga

Temporização da CPU SEL-433 APLICAÇÕES DE MICROPROCESSADORES I. Ciclos de Máquina. Ciclos de Máquina. Temporização Interrupções Rotinas de Atraso

Laboratório de Microprocessadores e Microcontroladores

29/03/2017. Temporização da CPU SEL-433 APLICAÇÕES DE MICROPROCESSADORES I. Ciclos de Máquina. Ciclos de Máquina

Laboratório de Microprocessadores e Microcontroladores

Escola de Engenharia Elétrica, Mecânica e de Computação Universidade Federal de Goiás. Experimento 7: Sensores e Transdutores

Ex.: Rotinas de tempo

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 - Uma Solução Possível

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 - RESPOSTA ESPERADA

MICROPROCESSADORES E MICROCONTROLADORES. Prova 1 Resposta Esperada

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 UMA SOLUCAO POSSÍVEL

Oprojeto apresenta três níveis de dificuldade: fácil, médio e difícil. No modo fácil tem-se uma

7. PROGRAMANDO O MICROCONTROLADOR. Microcontroladores - Prof: Demantova

mov R1,10H ; Carrega o dado do endereço 10H em R1 mov R1,#10H ; Carrega 10H em R1

UTFPR Departamento Acadêmico de Eletrônica Curso Técnico em Eletrônica Microcontroladores 1 - Prof. Cion nov/2010 (atualizado em jul 2015)

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 UMA SOLUÇÃO POSSÍVEL. Obs.: Todas as questões têm valor 2,0. Boa prova e Feliz Natal e Ano Novo!!!!

Sistemas Microprocessados. sato<at>utfpr<dot>edu<dot>br

PONTIFÍCIA UNIVERSIDADE CATÓLICA DO PARANÁ ENGENHARIA DE COMPUTAÇÃO. Vinicius Zanetti Tiago Dambros Rodrigo Yoshida Takeda

Aula 10 Microcontrolador Intel 8051 Parte 2

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 Resposta Esperada

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 (Tema: Microcontrolador 8051) Resposta Esperada

Microprocessadores e Microcontroladores. Prova Substitutiva Uma Solução

SEL-614 MICROPROCESSADORES E APLICAÇÕES. Adilson Gonzaga

208 = D0 h TMOD. MOV TMOD,#20h ;TMOD = Timer 1 no ;Modo 2, controle por software SCON. ;Canal Serial

Laboratório de Microprocessadores e Microcontroladores. Experimento 7:

CONJUNTO DE INSTRUÇÕES

Laboratório de Microprocessadores e Microcontroladores. Experimento 7:

Lista de Exercícios 2

EL08D - MICROCONTROLADORES

Laboratório de Microprocessadores e Microcontroladores. Experimento 6:

Estudar os passos que devem ser feitos (ponto de partida até o objetivo)

Laboratório de Microprocessadores e Microcontroladores

Família 8051 (introdução) 2011/1

Temporizadores e Contadores (Timer/Counter)

Interface com Teclas, Leds e Teclados Matriciais. Prof. Adilson Gonzaga

Prof. Adilson Gonzaga. Técnicas de Interface

Prof. Adilson Gonzaga

Lista de Exercícios 1

As 5 partes fundamentais. Linguagem de Programação Pinagem Características Elétricas Ambiente de Desenvolvimento Integrado - IDE

Aplicações de Microprocessadores I. Prof. Adilson Gonzaga

Prof. Adilson Gonzaga

Laboratório de Microprocessadores e Microcontroladores

Laboratório de Microprocessadores e Microcontroladores. Experimento 6: Conversor Analógico/Digital e Conversor Digital/Analógico

EXPERIÊNCIA 17 USO DO TEMPORIZADOR INTERNO

Programação de Microprocessadores. Programação de Microprocessadores SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

Laboratório de Microprocessadores e Microcontroladores

PRÁTICAS. Microcontroladores: (LT36D) Prof: DaLuz. Práticas - 2º sem Microcontroladores LT36D - 26/04/ :56 1/16

Laboratório de Microprocessadores e Microcontroladores

Laboratório de Microprocessadores e Microcontroladores. Experimento 6: Conversor Analógico/Digital e Conversor Digital/Analógico

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 (Tema: Microcontrolador 8051)

Laboratório de Microprocessadores e Microcontroladores. Experimento 7:

Lista de Exercícios 2

Introdução ao Uso do LCD Inteligente (Versão Preliminar) Por Gilson Yukio Sato. Introdução

Microcontrolador 8051

Microprocessadores e Microcontroladores Parte 3. Expansão de Memória Mapeamento de Memória

Ex.: Rotinas de tempo

Laboratório de Microprocessadores e Microcontroladores

EXERCÍCIOS 2 Prof. Adilson Gonzaga

Programação de Microcontroladores II

O Pino P2.7 não está sendo usado e cada Display mostrará valores de 0 a 9.

Interrupção

DISPLAY LCD. Ilton L. Barbacena Claudio Afonso Fleury

Laboratório de Microprocessadores e Microcontroladores

SEL 0415 INTROD. À ORGANIZAÇÃO DE COMPUTADORES

Experiência. Montagem Kit Didático. 2. Turma: Nota: 5. MICRO-I Prof. Mauricio. Identificação dos Alunos:

LCDs Inteligentes. LCD Inteligente. Gabriel Kovalhuk DAELN / UTFPR

Microcontroladores. Conjunto de Instruções do Prof. Guilherme Peron Prof. Heitor Lopes Prof. Ronnier Rohrich Prof. Rubão

Tópicos: 1 - Modos de endereçamento do Pilha e instruções de Pilha. 3 - Instruções que usam pilha: - instrução CALL - instrução RET

Contador crescente e decrescente...

programáveis por software

GOVERNO DO ESTADO DE SÃO PAULO

Módulo de Cristal Líquido LCD

Laboratório de Microprocessadores e Microcontroladores

Cerne Tecnologia e Treinamento

1. Instruções de Desvio

9/3/2009. Aula 4. Engenharia de Sistemas Embarcados. Cenário: Sistema de Controle de LEDs

Aula 4. Engenharia de Sistemas Embarcados. Prof. Abel Guilhermino Tópico: Arquitetura de um microcontrolador 8051

Interrupções por hardware

MICROPROCESSADORES E MICROCONTROLADORES Parte 2 Microcontrolador 8051

Lista de Exercícios 1

Lista de Exercícios 2

Microcontroladores 8051

Temporizadores e Contadores

Organização de Memórias

Técnicas de Interface com Microcontroladores (8051)

MICROCONTROLADOR 8051

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 (Tema: Microcontrolador 8051)

PROJETOS COM MICROCONTROLADORES

Suporta os microcontroladores: R. Leonardo da Vinci, Campinas/SP CEP F.: (19) Kit de Desenvolvimento ACEPIC 28

DIAGRAMA DE BLOCOS DE UM MICROCONTROLADOR

Transcrição:

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. Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 1/34

2 GND 19 18 X1 X2 1 2 3 4 5 6 10 9 8 7 KIT S51 V1.1 2. Circuito P0 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 1 2 3 4 5 6 7 8 CABO 1 P1.5 2 P1.6 3 P1.7 4 RST GND 5 GRAVADOR Alimentação 1 2 3 4 +V +V C10 0.33uF R14 1k5 1 U6 VIN 7805 R3 10K R4 10K DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 R/W 5 E RS Vo Vdd Vss 14 13 12 11 10 9 8 7 6 4 3 2 1 DISPLAY VOUT 3 R5 10K C11 0.1uF R6 10K R7 10K R8 10K C9 0.1uF R9 10K +5V +5V R10 10K 39 38 37 36 35 34 33 32 40 20 1 2 3 4 5 6 7 8 U1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 VCC GND 8051 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD 10 P3.1/TXD 11 12 P3.2/INT0 13 P3.3/INT1 14 P3.4/T0 15 P3.5/T1 P3.6/WR 16 P3.7/RD 17 ALE 30 PSEN 29 EA RST 21 22 23 24 25 26 27 28 31 9 +5V R15 10k R16 10k R17 10k R18 10k R19 10k R20 10k R21 10k R22 10k DK 10 1 2 3 4 5 6 7 8 U2 IN1 IN2 IN3 IN4 IN5 IN6 IN7 IN8 COM ULN2803 1 2 3 4 5 6 7 8 0 4 OUT1 OUT2 OUT3 OUT4 OUT5 OUT6 OUT7 OUT8 GND 9 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 P2 18 17 16 15 14 13 12 11 1 5 R12 470 R13 470 R23 470 R24 470 R25 470 R26 470 R27 470 R28 470 2 6 3 7 g f e +5V f e d a g d + + +5V a c b c 8 7 6 5 4 3 2 1 b dp U4 1 2 3 4 5 6 7 8 P2.7D P2.6D P2.5D P2.4D P2.3D P2.2D P2.1D P2.0D P2D 7SEG P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 P3 +5V C1 CRYSTAL 11,0592MHz C2 8 9 A B 33pF 33pF 10k +5V C D E F R11 U3 +5V C12 C3 10uF R1 10k RESET R2 470 CH0 CH1 CH2 CH3 C4 10uF C5 10uF 12 9 11 10 C1+ C1- C2+ C2- MAX232 C7 10uF +5V C6 10uF C8 10uF 1 6 2 7 3 8 4 9 5 1 3 4 5 R1OUT R2OUT T1IN T2IN R1IN 13 R2IN 8 T1OUT T2OUT VCC 16 V+ V- 14 7 GND 15 2 6 1 2 3 DB9 FÊMEA 10uF CH4 SERIAL CH5 Title GND CH6 Fernando E. Gazzoni / Gustavo B. Borba KIT S51 Size Document Number Rev CH7 Custom V1.1 - Date: Sheet 1 of 1 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 2/34

3. Cabo para gravação Pinagem Montagem 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 - Componentes: aproximadamante 60 cm. de cabo de rede (8 vias, 4 pares trançados); conector DB25 macho para cabo; barra de pinos 180 0 [5 pinos]; - Uma via (fio) de cada par trançado 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

4. Aplicativos - Para o desenvolvimento dos programas a serem gravados no microcontrolador: RIDE - IDE Raisonance para 8051 1º Faça o download em http://www.raisonance.com/download/index.php, clicando em Eval51. É necessário um pequeno cadastro. 2º Instale. O aplicativo chama-se RIDE. É uma versão de avaliação com todas as funcionalidades da versão completa, porém limitada a 4k de código. - Para a gravação do programa no microcontrolador: Aec_isp.exe Faça o Download em http://www.aec-electronics.co.nz/index.php?page_id=18. É necessário 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 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 4/34

Selecionar a aba Properties e marcar a opção Launch tools with executable Passo 3. Criar e salvar um arquivo para o código 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 configuração é armazenada, não sendo mais necessária nas próximas sessões de uso do RIDE) Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 5/34

Passo 5. Digitar o programa: Este programa liga/desliga os segmentos do display de 7 segmentos a partir das chaves CH0...CH7. Caracteres após o ; são ignorados pelo assemblador (comentários). ;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 região do vetor de interrupções ORG 002Bh ;início do programa ------- ; ROTINA PRINCIPAL ------- main: MOV P2,P3 ;carrega o conteúdo 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 diretório em que o programa foi salvo. Possui o mesmo nome do programa e extensão.hex. Neste caso, tutorial.hex. Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 6/34

2º Gravação e execução - 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 diretório do arquivo tutorial.hex e execute-o. - Siga os passos: Passo 1. Setup Para escolha do modelo de microcontrolador e configuração dos lock bits. Configure os parâmetros e saia desta tela fazendo um Save setup. (Estas configurações são 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 diretório do aec_isc.exe. O buffer é mostrado, indicando que o programa foi carregado. (o conteúdo do buffer da figura ao lado é apenas ilustrativo. Não corresponde ao do programa tutorial.hex) Pressione qualquer tecla para continuar. Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 7/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 gravação, revise a alimentação e o clock do microcontrolador e as conexões do cabo. ATENÇÃO Durante a gravação seu circuito está conectado diretamente na porta paralela do PC. Portanto, cuidado para não danificá-la! Para não haver riscos, durante o procedimento de gravação, é recomendável 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 são compartilhados pelo barramento do display. Em condições normais, mesmo com o display conectado, a gravação ocorre normalmente e não 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

------- ; 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 ------- ; 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 ------- ; 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 END Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 9/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 MOV 00h 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 ; 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 ; SUBROTINA DE TRATAMENTO DA CHAVE CH2 (EM P3.2) - CH2: MOV DPTR,#FRASE3 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 10/34

LCALL PRINTSTRINGALL ; 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 - ; 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 MOV R6,#9 ;gera atraso de 9x0,5ms = 4,5ms LCALL DELAY Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 11/34

;repete instrucao MOV R6,#1 ;gera atraso de 1x0,5ms = 0,5ms LCALL DELAY ;repete instrucao ; Configuracao do usuario MOV B,#00111000b ; F = 0 -> matrizde 5x8 pontos ; N = 1-> 2 linhas ; DL = 1 -> 8 bits MOV B,#00001110b ; B = 0 -> local do cursor nao pisca ; C = 1 -> cursor visivel ; D = 1 -> liga o display (aparece frase) MOV B,#00000110b ; SH=0 -> não desloca frase ao escrever caractere ; I/D = 1 -> cursor se move para direita LCALL CLEARLCD ; SUBROTINA PARA LIMPAR O DISPLAY - ; Apaga todos os caracteres e posiciona o cursor no inicio do display - ; ENTRADA: nenhuma - ; DESTROI: Caracteres armazenados da DDRAM, R6, A - ; CHAMA: IWRITE, POSCURSOR, DELAY - CLEARLCD: PUSH B MOV B,#00000001b ;Instrucao Clear display 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 ; SUBROTINA PARA SELECIONAR A POSICAO DO CURSOR NO DISPLAY - ; ENTRADA: B --> endereco da DDRAM que o cursor sera posicionado - ; DESTROI: A, B - ; CHAMA: IWRITE - POSCURSOR: PUSH B ;armazena o valor de B na pilha ORL A,#10000000b POP B ;restaura o valor de B Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 12/34

; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY - ; ENTRADA: B --> instrucao a ser executada - ; 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 ; SUBROTINA PARA ESCREVER CARACTER ASCII NO DISPLAY - ; ENTRADA: B --> caractere (em ASCII) a ser escrito no display - ; 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 ; SUBROTINA PARA ESCREVER DIGITO BCD MENOS SIGNIFICATIVO - ; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD- ; ENTRADA: B --> numero BCD - ; DESTROI: A - PRINTBCDL: ANL A,#00001111b ;usa apenas 4bits menos significativo ADD A,#30h ;converte resultado para ASCII POP B ;restaura conteudo de B da pilha Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 13/34

; SUBROTINA PARA ESCREVER DOIS DIGITOS BCD - ; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD- ; ENTRADA: B --> numero BCD - ; DESTROI: A, B - PRINTBCDHL: ANL A,#11110000b ;separa 4 bits mais significativos SWAP A ;troca nibble menos significativo por mais significativo ADD A,#30h ;converte para ASCII ;restaura conteudo de B da pilha POP B ANL A,#00001111b ;separa 4 bits menos significativos ADD A,#30h ;converte para ASCII ; SUBROTINA PARA ESCREVER DIGITO HEXADECIMAL MENOS SIGNIFICATIVO - ; ENTRADA: B --> numero HEXA - ; DESTROI: A, DPTR - PRINTHEXAL: MOV DPTR,#TABHEXA ANL A,#00001111b ;separa nibble menos significativo MOVC A,@A+DPTR ;converte caractere para ASCII POP B ;restaura conteudo de B da pilha ; SUBROTINA PARA ESCREVER DOIS DIGITOS HEXADECIMAIS - ; ENTRADA: B --> numero HEXA - ; DESTROI: A, DPTR - PRINTHEXAHL: MOV DPTR,#TABHEXA ANL A,#11110000b ;separa nibble mais significativo SWAP A ;troca nibble menos significativo por mais significativo MOVC A,@A+DPTR ;converte caractere para ASCII POP B ;restaura conteudo de B da pilha ANL A,#00001111b ;separa nibble menos significativo MOVC A,@A+DPTR ;converte caractere para ASCII Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 14/34

TABHEXA: DB '0123456789ABCDEF' ; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY - ; ENTRADA: DPTR --> frase a ser escrita - ; DESTROI: A, R0 - ; Caractere especial: '\' -> fim da frase - ; Nao verifica se a frase cabe no display - ; Precisa ser colocado o caractere '\' no final da frase - PRINTSTRING: 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 CJNE A,#'\',WRITE ;encontrou o caractere '\'? POP B ;sim -> para de escrever WRITE: INC R0 JMP PRINTS ; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY - ; ENTRADA: DPTR --> frase a ser escrita - ; DESTROI: A, R0 - ; 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: 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 CJNE A,#'/',FIMSTR ;encontrou o caractere '/'? MOV B,#40h ;sim -> comeca a escrever na segunda linha LCALL POSCURSOR INC R0 JMP PRINTSALL WRITEALL: INC R0 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 15/34

JMP PRINTSALL FIMSTR: CJNE A,#'\',WRITEALL ;encontrou o caractere '\'? POP 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 - ; DESTROI: - ; CHAMA: IWRITE - SHIFTLCDR: MOV B,#00011100b POP 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 - ; DESTROI: B - ; CHAMA: IWRITE - SHIFTLCDL: MOV B,#00011000b POP B ;restaura conteudo de B na pilha ; SUBROTINA PARA GERAR ATRASO DE R1 x 0,5ms - ; ENTRADA: R6 --> valor a ser multiplicado pela base de tempo - ; DESTROI: R7, R6 - DELAY: MOV R7,#228 DJNZ R7,$ DJNZ R6,DELAY END Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 16/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 elétrico 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 MOV MOV MOV MOV IE,#00000000b ;desabilita todas as interrupcoes 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 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 IP,#00000001b ; PX0 = 1 -> prioridade alta para a int ext 0 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

------- 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 I ------- ; 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 END Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 18/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 região do vetor de interrupções ORG 0050h ;início 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 - ; DESTROI: R4, R6 - ; CHAMA: READ - ; USA DEBOUNCE DE 50 REPETICOES - IN_HEX: URN: URN2: URN3: MOV R4,#50 ;contador para debounce CALL READ ;chave foi pressionada? JNC IN_HEX ;nao -> verifica novamente DJNZ R4,URN ;sim -> repete 50x PUSH ACC ;armazena na pilha o codigo hexa da tecla apertada MOV R4,#50 ;aguarda a chave ser solta CALL READ ;chave continua pressionada? JC URN2 ;sim -> verifica novamente DJNZ R4,URN3 ;nao -> repete 50x POP ACC ;recupera o codigo hexa da chave e... MOV R6,A ;... salva em R6 ; SUBROTINA PARA LEITURA E DECODIFICACAO DO TECLADO MATRICIAL - Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 19/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: TEST_AGAIN: CH_PRESS: AGAIN: HEX: FIN: MOV A,#0FEh ;inicia na coluna 0 MOV R6,#4 ;R6 = contador 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 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 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 SETB C ;C=1 -> chave pressionada MOV A,R6 ;codigo hex salvo em A ;= SUBROTINAS PARA O DISPLAY LCD = ; INICIALIZACAO DO DISPLAY - ; ENTRADA: 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 MOV R6,#9 ;gera atraso de 9x0,5ms = 4,5ms LCALL DELAY ;repete instrucao MOV R6,#1 ;gera atraso de 1x0,5ms = 0,5ms LCALL DELAY ;repete instrucao Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 20/34

; Configuracao do usuario MOV B,#00111000b ; F = 0 -> matrizde 5x8 pontos ; N = 1-> 2 linhas ; DL = 1 -> 8 bits MOV B,#00001110b ; B = 0 -> local do cursor nao pisca ; C = 1 -> cursor visivel ; D = 1 -> liga o display (aparece frase) MOV B,#00000110b ; SH=0 -> não desloca frase ao escrever caractere ; I/D = 1 -> cursor se move para direita MOV B,#00000010b ;return home -> retorna o cursor para a... ;...primeira linha e primeira coluna LCALL CLEARLCD ; SUBROTINA PARA LIMPAR O DISPLAY - ; Apaga todos os caracteres e posiciona o cursor no inicio do display - ; ENTRADA: nenhuma - ; DESTROI: Caracteres armazenados da DDRAM, R6, A - ; CHAMA: IWRITE, POSCURSOR, DELAY - CLEARLCD: PUSH B MOV B,#00000001b ;Instrucao Clear display 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 ; SUBROTINA PARA SELECIONAR A POSICAO DO CURSOR NO DISPLAY - ; ENTRADA: B --> endereco da DDRAM que o cursor sera posicionado - ; DESTROI: A - ; CHAMA: IWRITE - POSCURSOR: PUSH B ORL A,#10000000b POP B Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 21/34

; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY - ; ENTRADA: B --> instrucao a ser executada - ; 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 ; SUBROTINA PARA ESCREVER CARACTER ASCII NO DISPLAY - ; ENTRADA: B --> caractere (em ASCII) a ser escrito no display - ; 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 ; SUBROTINA PARA ESCREVER DIGITO BCD MENOS SIGNIFICATIVO - ; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD- ; ENTRADA: B --> numero BCD - ; DESTROI: A - PRINTBCDL: ANL A,#00001111b ;usa apenas 4bits menos significativo ADD A,#30h ;converte resultado para ASCII POP 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 - ; DESTROI: A, B - Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 22/34

PRINTBCDHL: ANL A,#11110000b ;separa 4 bits mais significativos SWAP A ;troca nibble menos significativo por mais significativo ADD A,#30h ;converte para ASCII ;restaura conteudo de B da pilha POP B ANL A,#00001111b ;separa 4 bits menos significativos ADD A,#30h ;converte para ASCII ; SUBROTINA PARA ESCREVER DIGITO HEXADECIMAL MENOS SIGNIFICATIVO - ; ENTRADA: B --> numero HEXA - ; DESTROI: A, DPTR - PRINTHEXAL: MOV DPTR,#TABHEXA ANL A,#00001111b ;separa nibble menos significativo MOVC A,@A+DPTR ;converte caractere para ASCII POP B ;restaura conteudo de B da pilha ; SUBROTINA PARA ESCREVER DOIS DIGITOS HEXADECIMAIS - ; ENTRADA: B --> numero HEXA - ; DESTROI: A, B, DPTR - PRINTHEXAHL: MOV DPTR,#TABHEXA ANL A,#11110000b ;separa nibble mais significativo SWAP A ;troca nibble menos significativo por mais significativo MOVC A,@A+DPTR ;converte caractere para ASCII POP B ;restaura conteudo de B da pilha ANL A,#00001111b ;separa nibble menos significativo MOVC A,@A+DPTR ;converte caractere para ASCII TABHEXA: DB '0123456789ABCDEF' Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 23/34

; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY - ; ENTRADA: DPTR --> frase a ser escrita - ; DESTROI: A, R7 - ; Caractere especial: '\' -> fim da frase - ; Nao verifica se a frase cabe no display - ; Precisa ser colocado o caractere '\' no final da frase - PRINTSTRING: 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 CJNE A,#'\',WRITE ;encontrou o caractere '\'? POP B ;sim -> para de escrever WRITE: INC R7 JMP PRINTS ; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY - ; ENTRADA: DPTR --> frase a ser escrita - ; DESTROI: A, R7 - ; 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: 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 CJNE A,#'/',FIMSTR ;encontrou o caractere '/'? MOV B,#40h ;sim -> comeca a escrever na segunda linha LCALL POSCURSOR INC R7 JMP PRINTSALL WRITEALL: FIMSTR: INC R7 JMP PRINTSALL CJNE A,#'\',WRITEALL ;encontrou o caractere '\'? Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 24/34

POP 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 - ; DESTROI: - ; CHAMA: IWRITE - SHIFTLCDR: MOV B,#00011100b POP 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 - ; DESTROI: B - ; CHAMA: IWRITE - SHIFTLCDL: MOV B,#00011000b POP B ;restaura conteudo de B na pilha ; SUBROTINA PARA GERAR ATRASO DE R1 x 0,5ms - ; ENTRADA: R6 --> valor a ser multiplicado pela base de tempo - ; DESTROI: R7, R6 - DELAY: MOV R7,#228 DJNZ R7,$ DJNZ 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

;= 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 FIM: 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 I ; INICIALIZACAO: APENAS INT TIMER 1 HABILITADA, PRIORIDADE ALTA - INICIO: ORG 0050h 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 MOV IP,#00001000b ; PT1 = 1 -> prioridade para a int do timer 1 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

LCALL INILCD ; PROGRAMA PRINCIPAL - LCALL ZERA CHAVE0: SOLTA: START: MOV A,P3 CJNE A,#11111110b,START ;AJUSTAR O RELOGIO? CLR TR1 MOV A,P3 CJNE A,#11111111b,SOLTA ;INICIAR O RELOGIO? LCALL AJUSTE LJMP CHAVE0 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 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 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 27/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 ;TRTAMENTO DA INTERRUPCAO DO TIMER --> SUBROTINA DO RELOGIO - RELOGIO: SOMAMIN: SOMAHORA: 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 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 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 ; ATUALIZACAO DO RELOGIO NO DISPLAY LCD - SEG: MIN: HOR: MOV B,#0Ah ;atualiza o valor... LCALL POSCURSOR ;... dos segundos... MOV B,SEGUNDO ;... no display LCD LCALL PRINTBCDHL MOV B,#07h LCALL POSCURSOR ;atualiza o valor... MOV B,MINUTO ;... dos minutos... LCALL PRINTBCDHL ;... no display LCD JMP SEG 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 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 28/34

MOV DPTR,#MEIANOITE ;escreve a frase... LCALL PRINTSTRING ;...meia noite no display 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 ;= SUBROTINAS PARA O DISPLAY LCD = ; INICIALIZACAO DO DISPLAY - ; ENTRADA: 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 MOV R6,#9 ;gera atraso de 9x0,5ms = 4,5ms LCALL DELAY ;repete instrucao MOV R6,#1 ;gera atraso de 1x0,5ms = 0,5ms LCALL DELAY ;repete instrucao ; Configuracao do usuario MOV B,#00111000b ; F = 0 -> matrizde 5x8 pontos ; N = 1-> 2 linhas ; DL = 1 -> 8 bits MOV B,#00001110b ; B = 0 -> local do cursor nao pisca ; C = 1 -> cursor visivel ; D = 1 -> liga o display (aparece frase) MOV B,#00000110b ; SH=0 -> não desloca frase ao escrever caractere ; I/D = 1 -> cursor se move para direita LCALL CLEARLCD ; 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

; DESTROI: Caracteres armazenados da DDRAM, R6, A - ; CHAMA: IWRITE, POSCURSOR, DELAY - CLEARLCD: PUSH B MOV B,#00000001b ;Instrucao Clear display 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 ; SUBROTINA PARA SELECIONAR A POSICAO DO CURSOR NO DISPLAY - ; ENTRADA: B --> endereco da DDRAM que o cursor sera posicionado - ; DESTROI: A, B - ; CHAMA: IWRITE - POSCURSOR: PUSH B ;armazena o valor de B na pilha ORL A,#10000000b POP B ;restaura o valor de B ; SUBROTINA PARA EXECUTAR INSTRUCOES NO DISPLAY - ; ENTRADA: B --> instrucao a ser executada - ; 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 ; SUBROTINA PARA ESCREVER CARACTER ASCII NO DISPLAY - ; ENTRADA: B --> caractere (em ASCII) a ser escrito no display - ; 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 Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 30/34

; SUBROTINA PARA ESCREVER DIGITO BCD MENOS SIGNIFICATIVO - ; Serao escritos caracteres indesejados se o numero nao estiver no formato BCD- ; ENTRADA: B --> numero BCD - ; DESTROI: A - PRINTBCDL: ANL A,#00001111b ;usa apenas 4bits menos significativo ADD A,#30h ;converte resultado para ASCII POP 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 - ; DESTROI: A, B - PRINTBCDHL: ANL A,#11110000b ;separa 4 bits mais significativos SWAP A ;troca nibble menos significativo por mais significativo ADD A,#30h ;converte para ASCII ;restaura conteudo de B da pilha POP B ANL A,#00001111b ;separa 4 bits menos significativos ADD A,#30h ;converte para ASCII ; SUBROTINA PARA ESCREVER DIGITO HEXADECIMAL MENOS SIGNIFICATIVO - ; ENTRADA: B --> numero HEXA - ; DESTROI: A, DPTR - PRINTHEXAL: MOV DPTR,#TABHEXA ANL A,#00001111b ;separa nibble menos significativo MOVC A,@A+DPTR ;converte caractere para ASCII POP B ;restaura conteudo de B da pilha Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 31/34

; SUBROTINA PARA ESCREVER DOIS DIGITOS HEXADECIMAIS - ; ENTRADA: B --> numero HEXA - ; DESTROI: A, DPTR - PRINTHEXAHL: MOV DPTR,#TABHEXA ANL A,#11110000b ;separa nibble mais significativo SWAP A ;troca nibble menos significativo por mais significativo MOVC A,@A+DPTR ;converte caractere para ASCII POP B ;restaura conteudo de B da pilha ANL A,#00001111b ;separa nibble menos significativo MOVC A,@A+DPTR ;converte caractere para ASCII TABHEXA: DB '0123456789ABCDEF' ; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY - ; ENTRADA: DPTR --> frase a ser escrita - ; DESTROI: A, R0 - ; Caractere especial: '\' -> fim da frase - ; Nao verifica se a frase cabe no display - ; Precisa ser colocado o caractere '\' no final da frase - PRINTSTRING: 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 CJNE A,#'\',WRITE ;encontrou o caractere '\'? POP B ;sim -> para de escrever WRITE: INC R0 JMP PRINTS ; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY - ; ENTRADA: DPTR --> frase a ser escrita - ; DESTROI: A, R0 - Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 32/34

; 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: 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 CJNE A,#'/',FIMSTR ;encontrou o caractere '/'? MOV B,#40h ;sim -> comeca a escrever na segunda linha LCALL POSCURSOR INC R0 JMP PRINTSALL WRITEALL: FIMSTR: INC R0 JMP PRINTSALL CJNE A,#'\',WRITEALL ;encontrou o caractere '\'? POP 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 - ; DESTROI: - ; CHAMA: IWRITE - SHIFTLCDR: MOV B,#00011100b POP 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 - ; DESTROI: B - ; CHAMA: IWRITE - SHIFTLCDL: MOV B,#00011000b POP B ;restaura conteudo de B na pilha Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 33/34

; SUBROTINA PARA GERAR ATRASO DE R1 x 0,5ms - ; ENTRADA: R6 --> valor a ser multiplicado pela base de tempo - ; DESTROI: R7, R6 - DELAY: MOV R7,#228 DJNZ R7,$ DJNZ R6,DELAY END Ensitec - Profs. Gustavo B. Borba / Fernando E. Gazzoni 34/34