Pic 16F877A não executa programa.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor aparecido » 27 Mar 2011 17:29

Consegui compilar, mas não está acontecendo nada com o led, ele está no RC7.

Arquivo pisca.h
#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


Arquivos pisca.c
#include "C:\Users\Cidão\Desktop\piscar led\pisca.h"
void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

#define LED PIN_C7

//Example blinking LED program
while(1){
output_low(LED);
delay_ms(3000);
output_high(LED);
delay_ms(3000);
}

}


Esqueci de configurar algo como estava fazendo no MPLAB? eu usei o Picwizard pra ja configurar tudo e não deixar passar nada, obrigado pela ajuda e paciência, abraços.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor andre_luis » 27 Mar 2011 17:50

Mostra o circuito.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor andre_luis » 27 Mar 2011 18:00

Voce definiu no código que está usando a UART.
Entretanto o pino RC7 é compartilhado por este módulo.

Comenta a linha abaixo :
Código: Selecionar todos
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=Cool);


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor aparecido » 27 Mar 2011 18:03

Não reparem o layout mal feito, estou aprendendo a usar o Eagle por conta própria com apostilas da net, idem ao CCS.

Imagem

O Led eu coloquei em série com um opto-acoplador, vi isso em uma revista de eletrônica e coloquei pra testar.
Em outro programa que fiz em assembly no Mplab o led piscou.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor aparecido » 27 Mar 2011 18:06

andre_teprom escreveu:Voce definiu no código que está usando a UART.
Entretanto o pino RC7 é compartilhado por este módulo.

Comenta a linha abaixo :
Código: Selecionar todos
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=Cool);


+++


Testei aqui, funcionou certinho, obrigado pela ajuda, abraço.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor aparecido » 21 Jul 2011 21:10

Tenho uma nova duvida e vou aproveitar esse topico.
Pro caso de utilizar um display LCD 16x2 no modo de 4bits, por exemplo os pinos 0 e 1 do Port A ja estão ocupados por um motivo qualquer e não posso liberar eles pro LCD, então eu ligo os pinos de dados do LCD nos pinos 2 3 4 e 5 (supondo que restaram só esses 4 pinos livres), eu consigo utilizar o display ainda? o que tenho que alterar no MPlab para fazer um código em assembly e no CCS para fazer um código em C e usar o LCD normalmente? obrigado.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor _blackmore_ » 21 Jul 2011 21:30

vc deve alterar as portas de saída na biblioteca do LCD das que estão "setadas" para as portas e que realmente vc vai utilizar.
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor aparecido » 21 Jul 2011 22:00

_blackmore_ escreveu:vc deve alterar as portas de saída na biblioteca do LCD das que estão "setadas" para as portas e que realmente vc vai utilizar.


Seria no cabeçalho do arquivo LCD.C?
Eu tinha tentado alterar os pinos, se não me engano ficou semelhante a isso:

...
#define D0 PortA.2
#define D1 PortA.3
#define D2 PortA.4
#define D3 PortA.5
...

E o código fonte eu mantive como nos exemplos que vi na net (alterando para funcionar de acordo com meu hardware) mas não funcionou, agora como estou com tempo eu vou testar novamente e ver se da certo, se puder postar como deve ficar me ajudaria bastante, obrigado, abraço.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor andre_luis » 22 Jul 2011 00:07

Está testando no simlador ou direto na placa ?
Se possível, coloca mais detalhes da biblioteca.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor aparecido » 22 Jul 2011 00:13

Direto na placa e tentei depois uma vez com o simulador também, mas a maioria foi direto na placa.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor aparecido » 26 Jul 2011 13:49

Como tem que ficar a biblioteca do lcd depois de alterada? alguem pode me mostrar um exemplo? obrigado.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor andre_luis » 26 Jul 2011 20:55

Em princípio, apenas a definição dos pinos no arquivo de cabeçalho é preciso alterar, conforme a dica acima.
Porém, não ficou claro se esta havendo erro compilação, ou se compila normalmente e apenas não está aparecendo nada no Display.

Procura colocar seu código num endereço qualquer e passa pra jente avaliar com mais calma.
Coloca também uma imagem do seu circuito como foi montado.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor aparecido » 26 Jul 2011 21:04

Ele compila e grava o hex no pic sem nenhum problema, somente não inicializa e nem aparece nada escrito no lcd, a ligação é a mesma da imagem que ja postei nesse topico, é a barra com 16 pinos perto do trimpot, o código pra inicializar eu peguei aqui no forum em um dos exemplos que o pessoal postou e disse funcionar e alterei pro Port em questão.
Acho que é questão mesmo só de alterar a configuração dos pinos, mas não sei direito como fazer.
Obrigado, abraço.
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Mensagempor aparecido » 13 Ago 2011 13:01

Ainda não consegui escrever nada no display, o esquema da placa é esse:
Imagem
O cristal que estou usando é de 20MHz, o display eu liguei em modo de 4 bits, no conector na parte de baixo da figura eu deixei conectado assim:
Display D4 > Port A pino 3
Display D5 > Port A pino 2
Display D6 > Port A pino 1
Display D7 > Port A pino 0

O código que usei, tem algumas subrotinas para ler um teclado matricial e escrever e ler eeprom mas não sei se estão funcionando, no momento quero testar só as subs para o LCD:

Código: Selecionar todos
;*************************************************************************************************************
;Alarme residencial
;*************************************************************************************************************
  #include  <P16F877A.inc>        ;modelo do PIC
;*************************************************************************************************************

TEMP1      equ     22h            ;Variavel temporaria
TEMP2      equ     23h            ;Variavel temporaria
TEMP3      equ     24h            ;Variavel temporaria
TempLCD      equ     25h           ;Tempo do LCD
senha1      equ     26h            ;digito 1 da senha
senha2      equ     27h           ;digito 2 da senha
senha3      equ     28h            ;digito 3 da senha
senha4      equ     29h            ;digito 4 da senha
senha      equ     30h
caractere   equ      .4            ;digitos da senha
senhaala   equ      .2010         ;senha do alarme
Tempsenha    equ       30h
digito      equ     31h
flag      equ     32h
ende      equ     33h            ;endereço
dado      equ     34h            ;dados
#define    BANK0    BCF STATUS, RP0 ;Seta o banco 0 de memória
#define    BANK1    BSF STATUS, RP0 ;Seta o banco 1 de memória
#define    E       PORTE,2
#define     RS      PORTC,1
#define    D4      PORTA,3
#define    D5      PORTA,2
#define    D6      PORTA,1
#define    D7      PORTA,0

;*************************************************************************************************************
    org     00h                        ;vetor de reset
    goto    inicio                     ;vai para o inicio do programa
;*************************************************************************************************************
;Rotina de inicio do programa
;*************************************************************************************************************
inicio   

   bsf     STATUS,RP0               ;muda para banco 1
   movlw   06h
    movwf   ADCON1                   ;Usar as portas A e E como I/O e nao como A/D
   movlw   B'00000000'
    clrf    TRISA
    clrf    TRISB
    clrf    TRISC
    clrf    TRISD
    clrf    TRISE
   movwf   TRISA
   movlw   B'00000000'
   movwf   TRISC 
   movlw   B'11110000'
   movwf   TRISD
   movlw   B'00000000'
   movwf   TRISE
      movlw   .31
    movwf   TRISB     
    clrf      OPTION_REG

      bcf     STATUS,RP0               ;muda para banco 0
    clrf    PORTA
    clrf    PORTB
    clrf    PORTC
    clrf    PORTD
    clrf    PORTE
    call    reseta_valores
    call    Inicia_lcd                 ;chama rotina de configuracao do Display
    call    Tela_inicial

;*************************************************************************************************************
;Rotina principal
;*************************************************************************************************************
principal
   bcf      C3
   call    Delay_1s
    call    Delay_1s
   bsf    C1
   btfsc   L1
   goto    principal
   goto   monitoramento


;*************************************************************************************************************
;Sub-rotina de monitoramento
;*************************************************************************************************************
monitoramento
   
   call   Tela_ligado
   call   mensagemsenha

monitoramento2

   bcf    C3
   bsf    C3
   btfsc   L1
   goto   monitoramento2
   call   digitasenha

;*************************************************************************************************************
;Sub-rotina para digitar senha
;*************************************************************************************************************
digitasenha

   call   coluna
   call   coluna
   call   coluna
   call   coluna
   return

;*************************************************************************************************************
;Sub-rotina de leitura das teclas
;*************************************************************************************************************
coluna

    movlw   01h                   ;Limpa o display e retorna o cursor para o inicio (home)
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
    call    wr_dado
    call    Delay_3us
    call    Delay_1s
    call    Delay_1s
    call   Delay_1s
    call    linha2
    movlw   0xC7                   ;poe cursor na liha 2 na posição 7
    call    wr_inst
    call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
   call   coluna1
   call   coluna2
   call   coluna3
   return

;*************************************************************************************************************
;Sub-rotina de leitura da coluna 1
;*************************************************************************************************************
coluna1

     bsf    C1
     bcf    C2
     bcf    C3
    call     Delay_1s
   call    teclascoluna1
   return

;*************************************************************************************************************
;Sub-rotina de leitura da coluna 2
;*************************************************************************************************************
coluna2

     bcf    C1
     bsf    C2
     bcf    C3
    call     Delay_1s
   call   teclascoluna2
   return

;*************************************************************************************************************
;Sub-rotina de leitura da coluna 3
;*************************************************************************************************************
coluna3

     bcf    C1
     bcf    C2
     bsf    C3
    call     Delay_1s
   call    teclascoluna3
   return

;*************************************************************************************************************
;Sub-rotina de leitura das teclas da coluna 1
;*************************************************************************************************************
teclascoluna1

   btfss   L1
   goto   col1tecla2
    movlw    '*'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col1tecla2

     btfss   L2
   goto   col1tecla3
    movlw    '7'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col1tecla3

     btfss   L3
   goto   col1tecla4
    movlw    '4'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col1tecla4

     btfss   L4
   return
   movlw    'l'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer
   return

;*************************************************************************************************************
;Sub-rotina de leitura das teclas da coluna 2
;*************************************************************************************************************
teclascoluna2

   btfss   L1
   goto   col2tecla2
    movlw    '0'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col2tecla2

     btfss   L2
   goto   col2tecla3
    movlw    '8'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col2tecla3

     btfss   L3
   goto   col2tecla4
    movlw    '5'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col2tecla4

     btfss   L4
   return
   movlw    '2'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer
   return

;*************************************************************************************************************
;Sub-rotina de leitura das teclas da coluna 3
;*************************************************************************************************************
teclascoluna3

   btfss   L1
   goto   col3tecla2
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer
   goto   principal

col3tecla2

     btfss   L2
   goto   col3tecla3
    movlw    '9'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col3tecla3

     btfss   L3
   goto   col3tecla4
    movlw    '6'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer

col3tecla4

     btfss   L4
   return
   movlw    '3'
   call    wr_dado
   bsf      buzzer
    call    Delay_3us
   bcf      buzzer
   return

;*************************************************************************************************************
;Sub-rotina de escrita da mensagem de tela inicial no lcd
;*************************************************************************************************************
Tela_inicial

    call    linha1

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    'A'
   call    wr_dado
    call    Delay_3us

    movlw    'l'
   call    wr_dado
    call    Delay_3us

    movlw    'a'
   call    wr_dado
    call    Delay_3us

    movlw    'r'
   call    wr_dado
    call    Delay_3us

    movlw    'm'
   call    wr_dado
    call    Delay_3us

    movlw    'e'
   call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    'D'
   call    wr_dado
    call    Delay_3us

    movlw    'e'
   call    wr_dado
    call    Delay_3us

    movlw    's'
   call    wr_dado
    call    Delay_3us

    movlw    'l'
   call    wr_dado
    call    Delay_3us

    movlw    'i'
   call    wr_dado
    call    Delay_3us

    movlw    'g'
   call    wr_dado
    call    Delay_3us

    movlw    'a'
   call    wr_dado
    call    Delay_3us

    movlw    'd'
   call    wr_dado
    call    Delay_3us

    movlw    'o'
   call    wr_dado
    call   Delay_3us
 
    movlw    ' '
    call    wr_dado
    call    Delay_3us

   call    linha2

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    '*'
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    '>'
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    'L'
    call    wr_dado
    call    Delay_3us

    movlw    'i'
    call    wr_dado
    call    Delay_3us

    movlw    'g'
    call    wr_dado
    call    Delay_3us

    movlw    'a'
    call    wr_dado
    call    Delay_3us

    movlw    'r'
   call    wr_dado
    call   Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

      call    Delay_1s
    call    linha2
    call    wr_inst
    call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
    return

;*************************************************************************************************************
;Sub-rotina de escrita da mensagem de alarme ligado no lcd
;*************************************************************************************************************
Tela_ligado

    call    linha1
   call   Delay_1s

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    'A'
   call    wr_dado
    call    Delay_3us

    movlw    'l'
   call    wr_dado
    call    Delay_3us

    movlw    'a'
   call    wr_dado
    call    Delay_3us

    movlw    'r'
   call    wr_dado
    call    Delay_3us

    movlw    'm'
   call    wr_dado
    call    Delay_3us

    movlw    'e'
   call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    'l'
   call    wr_dado
    call    Delay_3us

    movlw    'i'
   call    wr_dado
    call    Delay_3us

    movlw    'g'
   call    wr_dado
    call    Delay_3us

    movlw    'a'
   call    wr_dado
    call    Delay_3us

    movlw    'd'
   call    wr_dado
    call    Delay_3us

    movlw    'o'
   call    wr_dado
    call    Delay_3us
 
    movlw    ' '
    call    wr_dado
    call   Delay_3us

   call    linha2

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    '#'
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    '>'
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    'D'
    call    wr_dado
    call    Delay_3us

    movlw    'e'
    call    wr_dado
    call    Delay_3us

    movlw    's'
    call    wr_dado
    call    Delay_3us

    movlw    'l'
    call    wr_dado
    call    Delay_3us

    movlw    'i'
    call    wr_dado
    call    Delay_3us

    movlw    'g'
    call    wr_dado
    call    Delay_3us

    movlw    'a'
    call    wr_dado
    call    Delay_3us

    movlw    'r'
   call    wr_dado
    call   Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

      call    Delay_1s
    call    linha2
    call    wr_inst
    call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
    return

;*************************************************************************************************************
; Sub-rotina de mensagem para inserir senha
;*************************************************************************************************************
mensagemsenha

    call    linha1
   call   Delay_1s

    movlw    'A'
   call    wr_dado
    call    Delay_3us

    movlw    'l'
   call    wr_dado
    call    Delay_3us

    movlw    'a'
   call    wr_dado
    call    Delay_3us

    movlw    'r'
   call    wr_dado
    call    Delay_3us

    movlw    'm'
   call    wr_dado
    call    Delay_3us

    movlw    'e'
   call    wr_dado
    call    Delay_3us

    movlw    ' '
   call    wr_dado
    call    Delay_3us

    movlw    'L'
   call    wr_dado
    call    Delay_3us

    movlw    'i'
   call    wr_dado
    call    Delay_3us

    movlw    'g'
   call    wr_dado
    call    Delay_3us

    movlw    'a'
   call    wr_dado
    call    Delay_3us

    movlw    'd'
   call    wr_dado
    call    Delay_3us

    movlw    'o'
   call    wr_dado
    call   Delay_3us
 
    movlw    ' '
    call    wr_dado
    call    Delay_3us

    call linha2

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    '>'
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    '<'
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    movlw    ' '
    call    wr_dado
    call    Delay_3us

    call    Delay_1s
    call    linha2
    call    wr_inst
    call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
    return

;*************************************************************************************************************
; Sub-rotina para iniciar configuracao do display
;*************************************************************************************************************
Inicia_lcd

   bsf      E
    nop
    nop
    nop
    bcf      RS
    nop
    nop
    nop
    movlw     03h
    movwf     PORTA
    bcf      E
    call     Delay_15ms
    bsf      E
    nop
    nop
    nop
    bcf      RS
    nop
    nop
    nop
    movlw     03h
    movwf     PORTA
    bcf      E
    call     Delay_15ms
    bsf      E
    nop
    nop
    nop
    bcf      RS
    nop
    nop
    nop
    movlw     03h
    movwf     PORTA
    bcf      E
    call     Delay_15ms
    bsf      RS
    nop
    nop
    nop
    movlw     02h
    movwf     PORTA
    bcf      E
    call     Delay_15ms
    bsf      E
    nop
    nop
    nop
    bcf      RS
    nop
    nop
    nop
    movlw     02h
    movwf     PORTA
    bcf      E
    call     Delay_15ms
   
      movlw   28h                   ;00101000 ==> Modo de comunicação de 4 bits
      call    wr_inst               ;duas linhas e matriz 8x5 ou 7x5
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
   
      movlw   08h       
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD

      movlw   01h       
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD

      movlw   01h       
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD

      movlw   06h                   ;Escreve deslocando o cursor para a direita
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD

      movlw   0Eh                   ;Display aceso com cursor fixo
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD

      movlw   01h                   ;Limpa o display e retorna o cursor para o inicio (home)
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD

      return

;*************************************************************************************************************
;Sub-rotina para posicionar o curso na linha 1
;*************************************************************************************************************
linha1

   movlw   0x80                   ;poe cursor na linha 1 na posição 0
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
      return

;*************************************************************************************************************
;Sub-rotina para posicionar o curso na linha 2
;*************************************************************************************************************
linha2

      movlw   0xC0                   ;poe cursor na linha 1 na posição 0
      call    wr_inst
      call    Delay_15ms             ;atraso de 15ms para a instrucao ser escrita no LCD
      return

;*************************************************************************************************************
;Sub-rotina para habilitar o display lcd para dados
;*************************************************************************************************************
wr_inst           

   movwf   TempLCD             ;coloca valor no registrador temporario
    bsf     E
    call    Delay_3us
    bcf      RS                    ;habilita para comandos
    call    Delay_3us
    swapf     TempLCD,W
    andlw     B'00001111'
    movwf   PORTA
    bcf      E
    call    Delay_3us
    movf     TempLCD,W
    andlw     B'00001111'
    bsf      E
    call    Delay_3us
    bcf      RS                  ;habilita para dados
    call    Delay_3us
    movwf     PORTA
    bcf      E

    return

;*************************************************************************************************************
;Sub-rotina para escrever dado no display lcd
;*************************************************************************************************************
wr_dado

   movwf   TempLCD              ;Armazena o dado em TempLCD
    bsf     E                   ;Habilita LCD
    call    Delay_3us
    bsf     RS                  ;Seta LCD para modo dados
    call    Delay_3us
    swapf   TempLCD,W
    andlw   B'00001111'
    movwf   PORTA
    bcf     E                   ;Finaliza operação, desabilitando o LCD


    movf    TempLCD,w
    andlw   B'00001111'
      bsf     E                   ;Habilita LCD
    call    Delay_3us
    bsf     RS                  ;Seta LCD para modo dados
    call    Delay_3us
    movwf   PORTA
    bcf     E                     ;Finaliza operação, desabilitando o LCD

   return

;*************************************************************************************************************
;Sub-rotina para resetar valores
;*************************************************************************************************************
reseta_valores

   movlw   .11         
   movwf   senha1               ;inicializa senha1 com o valor de "*"
    movlw   .11         
    movwf   senha2               ;inicializa senha1 com o valor de "*"
    movlw   .11         
    movwf   senha3               ;inicializa senha1 com o valor de "*"
    movlw   .11         
    movwf   senha4               ;inicializa senha1 com o valor de "*"
    movlw   .4         
    movwf   digito               ;inicializa digito com o valor 4
    movlw   .11         
    movwf   Tempsenha             ;inicializa Tempsenha com o valor de "*"
    return

;*************************************************************************************************************
;Sub-rotina para ler a EEPROM
;*************************************************************************************************************
ler

   bsf      STATUS, RP1
    bcf      STATUS, RP0          ;Bank 2
    movf   ende, W             ;escreve endereço
    movwf   EEADR                
    bsf    STATUS, RP0          ;Bank 3
    bcf      EECON1, EEPGD          
    bsf      EECON1, RD
    bcf      STATUS, RP0          ;Bank 2
    movf   EEDATA, W
    movwf    dado
    bcf      STATUS, RP0          ;Bank0
    bcf      STATUS, RP1
    return

;*************************************************************************************************************
;Sub-rotina para escrever na EEPROM
;*************************************************************************************************************
escrever

   bsf      STATUS, RP1
    bsf      STATUS, RP0          ;Bank 3
    btfsc   EECON1, WR
   goto    $-1
    bcf      STATUS, RP0          ;Bank 2
    movf   ende, W
    movwf   EEADR
    movf   dado, W
    movwf   EEDATA
    bsf      STATUS, RP0          ;Bank 3
    bcf      EECON1, EEPGD
    bsf      EECON1, WREN
    bcf      INTCON, GIE
   movlw   0x55
    movwf   EECON2
    movlw   0xAA
    movwf   EECON2
    bsf      EECON1, WR
    bsf      INTCON, GIE
   bcf      EECON1, WREN
    bsf      EECON1, EEPGD
    bcf      STATUS, RP0
    bcf      STATUS, RP1          ;Bank 0
    return

;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 15 ms
;*************************************************************************************************************
Delay_15ms

      movlw    50                 ;move 50 para o acumulador
      movwf    TEMP1               ;move o valor do acumulador para TEMP1

Loop1

      movlw    10                  ;move 10 para o acumulador
      movwf    TEMP2               ;move o valor do acumulador para TEMP2

Loop2

      decfsz   TEMP2,F             ;decrementa TEMP2, skip se zero
      goto     Loop2               ;vai para o endereço Loop2
      decfsz   TEMP1,F             ;decrementa TEMP1, skip se zero
      goto     Loop1               ;vai para o endereço Loop1
      return

;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 750 ms
;*************************************************************************************************************
Delay_750ms

      movlw    50                   ;move 50 para o acumulador
      movwf    TEMP3                ;move o valor do acumulador para TEMP3

decrementa

      call     Delay_15ms
      decfsz   TEMP3,F              ;decrementa TEMP3, skip se zero
      goto     decrementa            ;vai para o endereço LABEL3
      return
         
;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 15 ms
;*************************************************************************************************************
Delay_3us

      nop
      return               

;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 1 segundo
;*************************************************************************************************************
Delay_1s

      movlw    10                   ;move 10 para o acumulador
      movwf    TEMP1               ;move o valor do acumulador para TEMP1

LABEL1

      movlw    50                  ;move 50 para o acumulador
      movwf    TEMP2                ;move o valor do acumulador para TEMP2

LABEL2

      movlw    50                   ;move 50 para o acumulador
      movwf    TEMP3                ;move o valor do acumulador para TEMP3

LABEL3

      decfsz   TEMP3,F              ;decrementa TEMP3, skip se zero
      goto     LABEL3               ;vai para o endereço LABEL3
      decfsz   TEMP2,F              ;decrementa TEMP2, skip se zero
      goto     LABEL2               ;vai para o endereço LABEL2
      decfsz   TEMP1,F              ;decrementa TEMP1, skip se zero
      goto     LABEL1               ;vai para o endereço LABEL1
      return     

    end                           ;diretiva de fim do programa
aparecido
Nibble
 
Mensagens: 69
Registrado em: 22 Jan 2009 19:27

Anterior

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x