codigo ASm braço mecanico
Desnvolvido
; POR ROBERTO RMS AUTOMAÇÃO DATA 22 DE MARÇO 2011
; E ROBOTICA
; DESCRIÇÃO DO PROJETO
;PROJETO TEM POR OBJETIVO MOSTRAR NO LCD UMA MENSAGEM INICIAL NOME DA EMPRESA
; APOS ALGUNS SEGUNDO ENTRA EM FUNCIONAMENTO FAS LEITURA DE 1 TECLCLA SE TIVER PRESCIONADA ENTRA EM MODO MANUAL
;SE NAO VAI PARA AUTOMATICO EXECULTA ROTINA QUE PREVIAMENTE FOI EXECULTADO NO MANUAL E ESTA SAULVO NA MEMORIA
;ROTINA DE POSIÇAO DE 5 MOTORES DE UM BRAÇO MECANICO CRIANDO MOVIMENTO AUTOMATICO
; DESCRIÇAO PREVIA DO COMANDO:
; MANUAL :LE TECLA 0 SE FOR =1 VAI PARA F(0) LE TCLA1 SE = 1 LIGA MOTOR(0)DIREITA SE =0 DESLIGAMOTOR(0)DIREITA
; LE TECLA 2 SE FOR +1 LIGA MOTR(0)ESQUERDA SE FOR =0 DESLIGA MOTOR(0)ESQUERDA
; CONTA 1, VOLTA VER TECLA 0 SE NOVAMENTE ACIONADA , VAI PARA F(1) E ASSIM ATE F5 ENTAO SAULVA COM TECLA (3)
; PARA SAULVAR DADOS DOS MOTORES FAZ LEITURA DE 5 POTENCIOMENTRO PRESENTE EN CADA EIXO DE MOTORES
; CONVERTE ANALOGICOS DIGITAL COM FUNDO DE ESCALA 255 PRESENTE NO PIC E TEM ESCALA DE SEGURANÇA E DE FUNCIONAMENTO
;AUTOMATICO : LER AD 0 COMPRA C/PRIMEIRA POSIÇAO <=> DECIDE QUANTO DEVE MOVER MOTR (0) PARA REPETIR A FUNÇAO GRAVADO
; ASIM ATÉ O 5 MOTORES RETORNANDO SEMPRE A MONITORAR O BOTAO (0)
; CONFIGURAÇÕES
__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC
; DEFINIÇÃO DAS VARIÁVEIS
; VARIÁVEIS INÍCIO DO BANCO 0
CBLOCK 0X20 ; POSIÇÃO INICIAL DA RAM
TEMPO1
TEMPO0 ; CONTADORES P/ DELAY
FILTRO_BOTOES ; FILTRO PARA RUIDOS
FLAG ; FLAG DE USO GERAL
MT_0 ; MEMORIZA BOTAO
MT_0_REFERENCIA ; REFERE A UM CONTADOR DE 3 POSISOES
MONITOR_0 ; DIZ QUE BOTAO 0 ESTA EM EXECUÇAO
MONITOR_1 ;;; ;; 1 ;;;;
ADGARD_0 ;MEMORIA DE LEITURA AD PORTA,0
ACCaHI ;ESCALA MAIOR
ACCaLO ;ESCALA MENOR
DECREMENTA_MENU
ENDC
#INCLUDE
; * BANCOS DE RAM
#DEFINE BANK1 BSF STATUS,RP0 ; SELECIONA BANK1 DA MEMORIA RAM
#DEFINE BANK0 BCF STATUS,RP0 ; SELECIONA BANK0 DA MEMORIA RAM
; CONSTANTES INTERNAS
; A DEFINIÇÃO DE CONSTANTES FACILITA A PROGRAMAÇÃO E A MANUTENÇÃO.
FILTRO_TECLA EQU .200 ; FILTRO P/ EVITAR RUIDOS DOS BOTÕES
; * DECLARAÇÃO DOS FLAGs DE SOFTWARE
; A DEFINIÇÃO DE FLAGs AJUDA NA PROGRAMAÇÃO E ECONOMIZA MEMÓRIA RAM.
#DEFINE TELA_PRINCIPAL FLAG,0 ; FLAG P/ INDICAR QUE DEVE MOSTRAR
; A TELA PRINCIPAL
; 1-> MOSTRA TELA PRINCIPAL
; 0-> TELA PRINCIPAL JÁ FOI MOSTRADA
;#DEFINE MONITOR_0 FLAG,1 ;FLAG P/INDICAR QUE BOTAO 0 ESTÁ TRAVADO PARA MEU
; 0 LIBERADO PARA AUTOMATICO
; 1 TRAVADO PARA AJUSTE MANUAL
#DEFINE CAD_P0 PORTA,0 ; ENTRADA A/D P/ O POTENCIÔMETRO P0
#DEFINE CAD_P1 PORTA,1 ; ENTRADA A/D P/ O POTENCIÔMETRO P1
#DEFINE CAD_P2 PORTA,2 ; ENTRADA A/D P/ O POTENCIÔMETRO P2
#DEFINE CAD_P3 PORTA,3 ; ENTRADA A/D P/ O POTENCIÔMETRO P3
#DEFINE CAD_P4 PORTA,4 ; ENTRADA A/D P/ O POTENCIÔMETRO P4
; * ENTRADAS *
#DEFINE BOTAO_0 PORTB,0 ; ESTADO DO BOTÃO 0
; 1 -> LIBERADO
; 0 -> PRESSIONADO
#DEFINE BOTAO_1 PORTB,1 ; ESTADO DO BOTÃO 1
; 1 -> LIBERADO
; 0 -> PRESSIONADO
#DEFINE BOTAO_2 PORTB,2 ; ESTADO DO BOTÃO 2
; 1 -> LIBERADO
; 0 -> PRESSIONADO
#DEFINE BOTAO_3 PORTB,3 ; ESTADO DO BOTÃO 3
; 1 -> LIBERADO
; 0 -> PRESSIONADO
; * SAÍDAS *
#DEFINE DISPLAY PORTD ; BARRAMENTO DE DADOS DO DISPLAY
#DEFINE RS PORTE,0 ; INDICA P/ O DISPLAY UM DADO OU COMANDO
; 1 -> DADO
; 0 -> COMANDO
#DEFINE ENABLE PORTE,1 ; SINAL DE ENABLE P/ DISPLAY
; ATIVO NA BORDA DE DESCIDA
#DEFINE LIGA_MOTOR_0A PORTC,0 ;1 LIGA MOTOR_0
;0 DESLIGA MOTOR_0
#DEFINE LIGA_MOTOR_0B PORTC,1 ;1 LIGA MOTOR_0
;0 DESLIGA MOTOR_0
; VETOR DE RESET DO MICROCONTROLADOR
; POSIÇÃO INICIAL PARA EXECUÇÃO DO PROGRAMA
ORG 0X0000 ; ENDEREÇO DO VETOR DE RESET
GOTO CONF ; PULA PARA CONFIG DEVIDO A REGIÃO
; DESTINADA AS ROTINAS SEGUINTES
; ROTINA DE DELAY (DE 1MS ATÉ 256MS)
; ESTA É UMA ROTINA DE DELAY VARIÁVEL, COM DURAÇÃO DE 1MS X O VALOR PASSADO
; EM WORK (W).
DELAY_MS
MOVWF TEMPO1 ; CARREGA TEMPO1 (UNIDADES DE MS)
MOVLW .250
MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS)
CLRWDT ; LIMPA WDT (PERDE TEMPO)
DECFSZ TEMPO0,F ; FIM DE TEMPO0 ?
GOTO $-2 ; NÃO - VOLTA 2 INSTRUÇÕES
; SIM - PASSOU-SE 1MS
DECFSZ TEMPO1,F ; FIM DE TEMPO1 ?
GOTO $-6 ; NÃO - VOLTA 6 INSTRUÇÕES
; SIM
RETURN ; RETORNA
; * ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY
ESCREVE
MOVWF DISPLAY ; ATUALIZA DISPLAY (PORTD)
NOP ; PERDE 1US PARA ESTABILIZAÇÃO
BSF ENABLE ; ENVIA UM PULSO DE ENABLE AO DISPLAY
GOTO $+1 ; .
BCF ENABLE ; .
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
RETURN ; RETORNA
; ROTINA DE ESCRITA DA TELA PRINCIPAL
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - " ROBERTO RMS "
; LINHA 2 - "ATOMAÇAO ELETRO"
MOSTRA_TELA_PRINCIPAL
BCF TELA_PRINCIPAL ; LIMPA FLAG DE MOSTRAR TELA PRINCIPAL
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01 ; ESCREVE COMANDO PARA
CALL ESCREVE ; LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0X82 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 0 / COLUNA 2
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
MOVLW 'R'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'b'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'R'
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'S'
CALL ESCREVE
MOVLW '.'
CALL ESCREVE
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 0
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER
MOVLW 'A'
CALL ESCREVE
MOVLW 'u'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'm'
CALL ESCREVE
MOVLW 'a'
CALL ESCREVE
MOVLW 'c'
CALL ESCREVE
MOVLW 'a'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'E'
CALL ESCREVE
MOVLW 'l'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
RETURN
; HARDWARE E SOFTWARE
; A ROTINA INICIALIZA A MÁQUINA E AGUARDA O ESTOURO DO WDT.
CONF
CLRF PORTA ; GARANTE AS SAÍDAS EM ZERO
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BANK1 ; SELECIONA BANCO 1 DA RAM
MOVLW B'11111111'
MOVWF TRISA ; CONFIGURA I/O DO PORTA
MOVLW B'11111111'
MOVWF TRISB ; CONFIGURA I/O DO PORTB
MOVLW B'00000000'
MOVWF TRISC ; CONFIGURA I/O DO PORTC
MOVLW B'00000000'
MOVWF TRISD ; CONFIGURA I/O DO PORTD
MOVLW B'00000100'
MOVWF TRISE ; CONFIGURA I/O DO PORTE
MOVLW B'11011011'
MOVWF OPTION_REG ; CONFIGURA OPTIONS
; PULL-UPs DESABILITADOS
; INTER. NA BORDA DE SUBIDA DO RB0
; TIMER0 INCREM. PELO CICLO DE MÁQUINA
; WDT - 1:128
; TIMER - 1:1
MOVLW B'00000000'
MOVWF INTCON ; CONFIGURA INTERRUPÇÕES
; DESABILITADA TODAS AS INTERRUPÇÕES
MOVLW B'00000100'
MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D
; CONFIGURA PORTA E PORTE COM I/O DIGITAL
BANK0 ; SELECIONA BANCO 0 DA RAM
MOVLW B'01001001'
MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D
; VELOCIDADE -> Fosc/8
; CANAL 1
; MÓDULO LIGADO
; RESET OU POWER-UP
BTFSC STATUS,NOT_TO ; RESET POR ESTOURO DE WATCHDOG TIMER?
GOTO $ ; NÃO - AGUARDA ESTOURO DO WDT
; SIM
; INICIALIZAÇÃO DA RAM
; LIMPAZ DA RAM DO BANCO 0, INDO DE 0X20 A 0X7F.
MOVLW 0X20
MOVWF FSR ; APONTA O ENDEREÇAMENTO INDIRETO PARA
; A PRIMEIRA POSIÇÃO DA RAM
LIMPA_RAM
CLRF INDF ; LIMPA A POSIÇÃO
INCF FSR,F ; INCREMENTA O PONTEIRO P/ A PRÓX. POS.
MOVF FSR,W
XORLW 0X80 ; COMPARA O PONTEIRO COM A ÚLT. POS. +1
BTFSS STATUS,Z ; JÁ LIMPOU TODAS AS POSIÇÕES?
GOTO LIMPA_RAM ; NÃO - LIMPA A PRÓXIMA POSIÇÃO
; SIM
BSF TELA_PRINCIPAL ; INICIALIZA MOSTRANDO TELA PRINCIPAL
; DISPLAY
; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAÇÃO DE 8 VIAS, DISPLAY PARA 2
; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR À DIREITA.
INICIALIZACAO_DISPLAY
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X30 ; ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ; INICIALIZAÇÃO
MOVLW .3
CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)
MOVLW 0X30 ; ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ; INICIALIZAÇÃO
MOVLW 0X30 ; ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ; INICIALIZAÇÃO
MOVLW B'00111000' ; ESCREVE COMANDO PARA
CALL ESCREVE ; INTERFACE DE 8 VIAS DE DADOS
MOVLW B'00000001' ; ESCREVE COMANDO PARA
CALL ESCREVE ; LIMPAR TODO O DISPLAY
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW B'00001100' ; ESCREVE COMANDO PARA
CALL ESCREVE ; LIGAR O DISPLAY SEM CURSOR
MOVLW B'00000110' ; ESCREVE COMANDO PARA INCREM.
CALL ESCREVE ; AUTOMÁTICO À DIREITA
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; VARREDURA DOS BOTÕES LOOP PRINCIPAL
VARRE
CLRWDT ; LIMPA WATCHDOG TIMER
BTFSS BOTAO_0 ; O BOTÃO 0 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_0 ; SIM - P/ TRATA_BOTAO_0
; NÃO
BTFSS BOTAO_1 ; O BOTÃO 1 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_1 ; SIM - PULA P/ TRATA_BOTAO_1
; NÃO
BTFSS BOTAO_2 ; O BOTÃO 2 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_2 ; SIM - PULA P/ TRATA_BOTAO_2
; NÃO
BTFSS BOTAO_3 ; O BOTÃO 3 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_3 ; SIM - PULA P/ TRATA_BOTAO_3
; NÃO
MOVLW FILTRO_TECLA ; CARREGA NO WORK O VALOR DE FILTRO_TECLA
MOVWF FILTRO_BOTOES ; SALVA EM FILTRO_BOTOES
; RECARREGA FILTRO P/ EVITAR RUIDOS
BTFSS TELA_PRINCIPAL ; DEVE MOSTRAR TELA PRINCIPAL ?
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM
CALL MOSTRA_TELA_PRINCIPAL
GOTO VARRE ; VOLTA PARA VARRER TECLADO
; ************************* TRATAMENTO DO BOTÃO 0 ***************************
TRATA_BOTAO_0
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JÁ FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
MOVLW .3
MOVWF MT_0_REFERENCIA ; REFERENCIA PARA BOTAO 0 DEVE FICAR EM 3
MOVLW .0 ; mov 0 paraW mtr_0
MOVWF MT_0 ; coloca w 3 em em mtr_0 BOTAO 0
MOVLW .1
MOVF MONITOR_0 ;COLOCA 1 EM MONITOR_0 INDICANDO QUE A TECLA FOI PRESIONADA
F_0_AGUARDA ; MENU PARA RETONO DE MENSAGEM F
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 0
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0X80 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 0 / COLUNA 0
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 0"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE;
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '0'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
CALL DELAY_MS
MOVF MT_0_REFERENCIA,W
XORWF MT_0,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
MOVWF MT_0_REFERENCIA ; ATUALIZA VALOR DA SUBTRAÇAO EM MT_0_REFE.
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL TRATA_MT_0 ; VAI TRATAR SITUAÇAO PARA MTR_0
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
; ************************* TRATAMENTO DO BOTÃO 1 ***************************
TRATA_BOTAO_1
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JÁ FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 1
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0X84 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 0 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 1"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '1'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
; ************************* TRATAMENTO DO BOTÃO 2 ***************************
TRATA_BOTAO_2
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JA FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 2
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 0
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 2"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '2'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
; ************************* TRATAMENTO DO BOTÃO 3 ***************************
TRATA_BOTAO_3
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JA FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 3
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC4 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 3"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '3'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TRATA_MT_0
CALL DELAY_MS ; DELAY DE 1MS
BTFSS MONITOR_0,W ; MONITOR 0 ESTÁ EM 1 ?
CALL MENSAGE_A ;VOCE CONSEGUIU
BTFSS BOTAO_0
GOTO VARRE ; SIM -
LOP DECF MT_0_REFERENCIA,W ;DEREMENTA 1
MOVWF MT_0_REFERENCIA ;SAUVA DECREMENTO
XORWF MT_0,W ; COMPARA MT_O COM ; UM CONTADOR DE 3 POSISOES
BTFSS STATUS,Z ; VERIFICA Se MT_0 ESTA 1 PULA APROXIMA LINHA CALL CONDÇAO
CALL SISTEMA_MENU
; GOTO LOP
BTFSC MT_0_REFERENCIA,W
MOVLW .0 ;MOVE (0)PARA
MOVF MONITOR_0 ;MONITOR_0
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
CONDÇAO1
BTFSS BOTAO_1 ; O BOTÃO 1 ESTÁ PRESSIONADO LE A PROXIMA; NAO PULA ?
CALL LEITURA
BSF LIGA_MOTOR_0A; LIGA MOTOR 0 PARA DIREITA
BTFSC BOTAO_1 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
BCF LIGA_MOTOR_0A ; DELIGA MOTOR 0 PARA DIREITA
BTFSC BOTAO_1 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
GOTO $-6 ; NÃO - VOLTA 5 INSTRUÇÕES
BTFSS BOTAO_2 ; O BOTÃO 1 ESTÁ PRESSIONADO LE A PROXIMA; NAO PULA ?
CALL LEITURA
BSF LIGA_MOTOR_0B ; LIGA MOTOR 0 PARA ESQUERDA
BTFSC BOTAO_2 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
BCF LIGA_MOTOR_0B ; DELIGA MOTOR 0 PARA ESQUERDA
BTFSC BOTAO_2 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
GOTO $-6 ; NÃO - VOLTA 5 INSTRUÇÕES
RETURN
TRATA_SITUAÇAO1
MOVLW .1
MOVWF MONITOR_1 ; COLOCA 1 EMM MONITOR
; MOVF MONITOR_1,W ;COPIA PARA W
; MOVWF PORTC,2 ;ENVIA PARA PORTC
LEITURA ;DE AD ANALOGICO
BSF ADCON0,GO ; INICIA CONVERSÃO A/D
BTFSC ADCON0,GO ; FIM DA CONVERSÃO ?
GOTO $-1 ; NÃO - VOLTA 1 INSTRUÇÃO
; SIM
MOVLW .250
MOVWF ACCaHI ; CARREGA ACCHI COM 250(PARA SEGURANÇA DO MOTOR
MOVLW .10
MOVWF ACCaLO ;CARREGA ACCaLO COM 10 PARA SEGURANÇA DO MOTOR
MOVF ADGARD_0,W
ADDLW 0X30 ; CONVERTE BCD DA UNIDADE EM ASCII
CALL ESCREVE ; ENVIA AO LCD
RETURN
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 3
MENSAGE_A
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC2 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 2
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 3"
MOVLW 'V'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'c'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'c'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'n'
CALL ESCREVE
MOVLW 's'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW 'g'
CALL ESCREVE
MOVLW 'u'
CALL ESCREVE
MOVLW 'i'
CALL ESCREVE
MOVLW 'U'
CALL ESCREVE
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;---------------------------------------------------
SISTEMA_MENU
MOVLW .3
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F0 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
MOVLW .2
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F1 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
MOVLW .1
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F3 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
MOVLW .0
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F3 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
RETURN
MENSAGE_A_F0
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 3"
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '0'
CALL ESCREVE
RETURN
MENSAGE_A_F1
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '1'
CALL ESCREVE
RETURN
MENSAGE_A_F2
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '2'
CALL ESCREVE
RETURN
MENSAGE_A_F3
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '3'
CALL ESCREVE
RETURN
Este programa nao está concluido pois é só
; FIM DO PROGRAMA
END ; FIM DO PROGRAMA
; POR ROBERTO RMS AUTOMAÇÃO DATA 22 DE MARÇO 2011
; E ROBOTICA
; DESCRIÇÃO DO PROJETO
;PROJETO TEM POR OBJETIVO MOSTRAR NO LCD UMA MENSAGEM INICIAL NOME DA EMPRESA
; APOS ALGUNS SEGUNDO ENTRA EM FUNCIONAMENTO FAS LEITURA DE 1 TECLCLA SE TIVER PRESCIONADA ENTRA EM MODO MANUAL
;SE NAO VAI PARA AUTOMATICO EXECULTA ROTINA QUE PREVIAMENTE FOI EXECULTADO NO MANUAL E ESTA SAULVO NA MEMORIA
;ROTINA DE POSIÇAO DE 5 MOTORES DE UM BRAÇO MECANICO CRIANDO MOVIMENTO AUTOMATICO
; DESCRIÇAO PREVIA DO COMANDO:
; MANUAL :LE TECLA 0 SE FOR =1 VAI PARA F(0) LE TCLA1 SE = 1 LIGA MOTOR(0)DIREITA SE =0 DESLIGAMOTOR(0)DIREITA
; LE TECLA 2 SE FOR +1 LIGA MOTR(0)ESQUERDA SE FOR =0 DESLIGA MOTOR(0)ESQUERDA
; CONTA 1, VOLTA VER TECLA 0 SE NOVAMENTE ACIONADA , VAI PARA F(1) E ASSIM ATE F5 ENTAO SAULVA COM TECLA (3)
; PARA SAULVAR DADOS DOS MOTORES FAZ LEITURA DE 5 POTENCIOMENTRO PRESENTE EN CADA EIXO DE MOTORES
; CONVERTE ANALOGICOS DIGITAL COM FUNDO DE ESCALA 255 PRESENTE NO PIC E TEM ESCALA DE SEGURANÇA E DE FUNCIONAMENTO
;AUTOMATICO : LER AD 0 COMPRA C/PRIMEIRA POSIÇAO <=> DECIDE QUANTO DEVE MOVER MOTR (0) PARA REPETIR A FUNÇAO GRAVADO
; ASIM ATÉ O 5 MOTORES RETORNANDO SEMPRE A MONITORAR O BOTAO (0)
; CONFIGURAÇÕES
__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC
; DEFINIÇÃO DAS VARIÁVEIS
; VARIÁVEIS INÍCIO DO BANCO 0
CBLOCK 0X20 ; POSIÇÃO INICIAL DA RAM
TEMPO1
TEMPO0 ; CONTADORES P/ DELAY
FILTRO_BOTOES ; FILTRO PARA RUIDOS
FLAG ; FLAG DE USO GERAL
MT_0 ; MEMORIZA BOTAO
MT_0_REFERENCIA ; REFERE A UM CONTADOR DE 3 POSISOES
MONITOR_0 ; DIZ QUE BOTAO 0 ESTA EM EXECUÇAO
MONITOR_1 ;;; ;; 1 ;;;;
ADGARD_0 ;MEMORIA DE LEITURA AD PORTA,0
ACCaHI ;ESCALA MAIOR
ACCaLO ;ESCALA MENOR
DECREMENTA_MENU
ENDC
; * BANCOS DE RAM
#DEFINE BANK1 BSF STATUS,RP0 ; SELECIONA BANK1 DA MEMORIA RAM
#DEFINE BANK0 BCF STATUS,RP0 ; SELECIONA BANK0 DA MEMORIA RAM
; CONSTANTES INTERNAS
; A DEFINIÇÃO DE CONSTANTES FACILITA A PROGRAMAÇÃO E A MANUTENÇÃO.
FILTRO_TECLA EQU .200 ; FILTRO P/ EVITAR RUIDOS DOS BOTÕES
; * DECLARAÇÃO DOS FLAGs DE SOFTWARE
; A DEFINIÇÃO DE FLAGs AJUDA NA PROGRAMAÇÃO E ECONOMIZA MEMÓRIA RAM.
#DEFINE TELA_PRINCIPAL FLAG,0 ; FLAG P/ INDICAR QUE DEVE MOSTRAR
; A TELA PRINCIPAL
; 1-> MOSTRA TELA PRINCIPAL
; 0-> TELA PRINCIPAL JÁ FOI MOSTRADA
;#DEFINE MONITOR_0 FLAG,1 ;FLAG P/INDICAR QUE BOTAO 0 ESTÁ TRAVADO PARA MEU
; 0 LIBERADO PARA AUTOMATICO
; 1 TRAVADO PARA AJUSTE MANUAL
#DEFINE CAD_P0 PORTA,0 ; ENTRADA A/D P/ O POTENCIÔMETRO P0
#DEFINE CAD_P1 PORTA,1 ; ENTRADA A/D P/ O POTENCIÔMETRO P1
#DEFINE CAD_P2 PORTA,2 ; ENTRADA A/D P/ O POTENCIÔMETRO P2
#DEFINE CAD_P3 PORTA,3 ; ENTRADA A/D P/ O POTENCIÔMETRO P3
#DEFINE CAD_P4 PORTA,4 ; ENTRADA A/D P/ O POTENCIÔMETRO P4
; * ENTRADAS *
#DEFINE BOTAO_0 PORTB,0 ; ESTADO DO BOTÃO 0
; 1 -> LIBERADO
; 0 -> PRESSIONADO
#DEFINE BOTAO_1 PORTB,1 ; ESTADO DO BOTÃO 1
; 1 -> LIBERADO
; 0 -> PRESSIONADO
#DEFINE BOTAO_2 PORTB,2 ; ESTADO DO BOTÃO 2
; 1 -> LIBERADO
; 0 -> PRESSIONADO
#DEFINE BOTAO_3 PORTB,3 ; ESTADO DO BOTÃO 3
; 1 -> LIBERADO
; 0 -> PRESSIONADO
; * SAÍDAS *
#DEFINE DISPLAY PORTD ; BARRAMENTO DE DADOS DO DISPLAY
#DEFINE RS PORTE,0 ; INDICA P/ O DISPLAY UM DADO OU COMANDO
; 1 -> DADO
; 0 -> COMANDO
#DEFINE ENABLE PORTE,1 ; SINAL DE ENABLE P/ DISPLAY
; ATIVO NA BORDA DE DESCIDA
#DEFINE LIGA_MOTOR_0A PORTC,0 ;1 LIGA MOTOR_0
;0 DESLIGA MOTOR_0
#DEFINE LIGA_MOTOR_0B PORTC,1 ;1 LIGA MOTOR_0
;0 DESLIGA MOTOR_0
; VETOR DE RESET DO MICROCONTROLADOR
; POSIÇÃO INICIAL PARA EXECUÇÃO DO PROGRAMA
ORG 0X0000 ; ENDEREÇO DO VETOR DE RESET
GOTO CONF ; PULA PARA CONFIG DEVIDO A REGIÃO
; DESTINADA AS ROTINAS SEGUINTES
; ROTINA DE DELAY (DE 1MS ATÉ 256MS)
; ESTA É UMA ROTINA DE DELAY VARIÁVEL, COM DURAÇÃO DE 1MS X O VALOR PASSADO
; EM WORK (W).
DELAY_MS
MOVWF TEMPO1 ; CARREGA TEMPO1 (UNIDADES DE MS)
MOVLW .250
MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS)
CLRWDT ; LIMPA WDT (PERDE TEMPO)
DECFSZ TEMPO0,F ; FIM DE TEMPO0 ?
GOTO $-2 ; NÃO - VOLTA 2 INSTRUÇÕES
; SIM - PASSOU-SE 1MS
DECFSZ TEMPO1,F ; FIM DE TEMPO1 ?
GOTO $-6 ; NÃO - VOLTA 6 INSTRUÇÕES
; SIM
RETURN ; RETORNA
; * ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY
ESCREVE
MOVWF DISPLAY ; ATUALIZA DISPLAY (PORTD)
NOP ; PERDE 1US PARA ESTABILIZAÇÃO
BSF ENABLE ; ENVIA UM PULSO DE ENABLE AO DISPLAY
GOTO $+1 ; .
BCF ENABLE ; .
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
RETURN ; RETORNA
; ROTINA DE ESCRITA DA TELA PRINCIPAL
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - " ROBERTO RMS "
; LINHA 2 - "ATOMAÇAO ELETRO"
MOSTRA_TELA_PRINCIPAL
BCF TELA_PRINCIPAL ; LIMPA FLAG DE MOSTRAR TELA PRINCIPAL
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01 ; ESCREVE COMANDO PARA
CALL ESCREVE ; LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0X82 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 0 / COLUNA 2
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
MOVLW 'R'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'b'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'R'
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'S'
CALL ESCREVE
MOVLW '.'
CALL ESCREVE
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 0
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER
MOVLW 'A'
CALL ESCREVE
MOVLW 'u'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'm'
CALL ESCREVE
MOVLW 'a'
CALL ESCREVE
MOVLW 'c'
CALL ESCREVE
MOVLW 'a'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'E'
CALL ESCREVE
MOVLW 'l'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
RETURN
; HARDWARE E SOFTWARE
; A ROTINA INICIALIZA A MÁQUINA E AGUARDA O ESTOURO DO WDT.
CONF
CLRF PORTA ; GARANTE AS SAÍDAS EM ZERO
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BANK1 ; SELECIONA BANCO 1 DA RAM
MOVLW B'11111111'
MOVWF TRISA ; CONFIGURA I/O DO PORTA
MOVLW B'11111111'
MOVWF TRISB ; CONFIGURA I/O DO PORTB
MOVLW B'00000000'
MOVWF TRISC ; CONFIGURA I/O DO PORTC
MOVLW B'00000000'
MOVWF TRISD ; CONFIGURA I/O DO PORTD
MOVLW B'00000100'
MOVWF TRISE ; CONFIGURA I/O DO PORTE
MOVLW B'11011011'
MOVWF OPTION_REG ; CONFIGURA OPTIONS
; PULL-UPs DESABILITADOS
; INTER. NA BORDA DE SUBIDA DO RB0
; TIMER0 INCREM. PELO CICLO DE MÁQUINA
; WDT - 1:128
; TIMER - 1:1
MOVLW B'00000000'
MOVWF INTCON ; CONFIGURA INTERRUPÇÕES
; DESABILITADA TODAS AS INTERRUPÇÕES
MOVLW B'00000100'
MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D
; CONFIGURA PORTA E PORTE COM I/O DIGITAL
BANK0 ; SELECIONA BANCO 0 DA RAM
MOVLW B'01001001'
MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D
; VELOCIDADE -> Fosc/8
; CANAL 1
; MÓDULO LIGADO
; RESET OU POWER-UP
BTFSC STATUS,NOT_TO ; RESET POR ESTOURO DE WATCHDOG TIMER?
GOTO $ ; NÃO - AGUARDA ESTOURO DO WDT
; SIM
; INICIALIZAÇÃO DA RAM
; LIMPAZ DA RAM DO BANCO 0, INDO DE 0X20 A 0X7F.
MOVLW 0X20
MOVWF FSR ; APONTA O ENDEREÇAMENTO INDIRETO PARA
; A PRIMEIRA POSIÇÃO DA RAM
LIMPA_RAM
CLRF INDF ; LIMPA A POSIÇÃO
INCF FSR,F ; INCREMENTA O PONTEIRO P/ A PRÓX. POS.
MOVF FSR,W
XORLW 0X80 ; COMPARA O PONTEIRO COM A ÚLT. POS. +1
BTFSS STATUS,Z ; JÁ LIMPOU TODAS AS POSIÇÕES?
GOTO LIMPA_RAM ; NÃO - LIMPA A PRÓXIMA POSIÇÃO
; SIM
BSF TELA_PRINCIPAL ; INICIALIZA MOSTRANDO TELA PRINCIPAL
; DISPLAY
; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAÇÃO DE 8 VIAS, DISPLAY PARA 2
; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR À DIREITA.
INICIALIZACAO_DISPLAY
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X30 ; ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ; INICIALIZAÇÃO
MOVLW .3
CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)
MOVLW 0X30 ; ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ; INICIALIZAÇÃO
MOVLW 0X30 ; ESCREVE COMANDO 0X30 PARA
CALL ESCREVE ; INICIALIZAÇÃO
MOVLW B'00111000' ; ESCREVE COMANDO PARA
CALL ESCREVE ; INTERFACE DE 8 VIAS DE DADOS
MOVLW B'00000001' ; ESCREVE COMANDO PARA
CALL ESCREVE ; LIMPAR TODO O DISPLAY
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW B'00001100' ; ESCREVE COMANDO PARA
CALL ESCREVE ; LIGAR O DISPLAY SEM CURSOR
MOVLW B'00000110' ; ESCREVE COMANDO PARA INCREM.
CALL ESCREVE ; AUTOMÁTICO À DIREITA
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; VARREDURA DOS BOTÕES LOOP PRINCIPAL
VARRE
CLRWDT ; LIMPA WATCHDOG TIMER
BTFSS BOTAO_0 ; O BOTÃO 0 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_0 ; SIM - P/ TRATA_BOTAO_0
; NÃO
BTFSS BOTAO_1 ; O BOTÃO 1 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_1 ; SIM - PULA P/ TRATA_BOTAO_1
; NÃO
BTFSS BOTAO_2 ; O BOTÃO 2 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_2 ; SIM - PULA P/ TRATA_BOTAO_2
; NÃO
BTFSS BOTAO_3 ; O BOTÃO 3 ESTÁ PRESSIONADO ?
GOTO TRATA_BOTAO_3 ; SIM - PULA P/ TRATA_BOTAO_3
; NÃO
MOVLW FILTRO_TECLA ; CARREGA NO WORK O VALOR DE FILTRO_TECLA
MOVWF FILTRO_BOTOES ; SALVA EM FILTRO_BOTOES
; RECARREGA FILTRO P/ EVITAR RUIDOS
BTFSS TELA_PRINCIPAL ; DEVE MOSTRAR TELA PRINCIPAL ?
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM
CALL MOSTRA_TELA_PRINCIPAL
GOTO VARRE ; VOLTA PARA VARRER TECLADO
; ************************* TRATAMENTO DO BOTÃO 0 ***************************
TRATA_BOTAO_0
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JÁ FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
MOVLW .3
MOVWF MT_0_REFERENCIA ; REFERENCIA PARA BOTAO 0 DEVE FICAR EM 3
MOVLW .0 ; mov 0 paraW mtr_0
MOVWF MT_0 ; coloca w 3 em em mtr_0 BOTAO 0
MOVLW .1
MOVF MONITOR_0 ;COLOCA 1 EM MONITOR_0 INDICANDO QUE A TECLA FOI PRESIONADA
F_0_AGUARDA ; MENU PARA RETONO DE MENSAGEM F
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 0
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0X80 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 0 / COLUNA 0
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 0"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE;
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '0'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
CALL DELAY_MS
MOVF MT_0_REFERENCIA,W
XORWF MT_0,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
MOVWF MT_0_REFERENCIA ; ATUALIZA VALOR DA SUBTRAÇAO EM MT_0_REFE.
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL TRATA_MT_0 ; VAI TRATAR SITUAÇAO PARA MTR_0
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
; ************************* TRATAMENTO DO BOTÃO 1 ***************************
TRATA_BOTAO_1
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JÁ FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 1
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0X84 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 0 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 1"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '1'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
; ************************* TRATAMENTO DO BOTÃO 2 ***************************
TRATA_BOTAO_2
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JA FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 2
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 0
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 2"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '2'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
; ************************* TRATAMENTO DO BOTÃO 3 ***************************
TRATA_BOTAO_3
MOVF FILTRO_BOTOES,F
BTFSC STATUS,Z ; FILTRO JÁ IGUAL A ZERO ?
; (FUNÇÃO JA FOI EXECUTADA?)
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO
; NÃO
DECFSZ FILTRO_BOTOES,F ; FIM DO FILTRO ? (RUIDO?)
GOTO VARRE ; NÃO - VOLTA P/ VARRE
; SIM - BOTÃO PRESSIONADO
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 3
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC4 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 3"
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'v'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'M'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 't'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'r'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW '3'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
BSF TELA_PRINCIPAL ; SETA FLAG P/ MOSTRAR TELA PRINCIPAL
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TRATA_MT_0
CALL DELAY_MS ; DELAY DE 1MS
BTFSS MONITOR_0,W ; MONITOR 0 ESTÁ EM 1 ?
CALL MENSAGE_A ;VOCE CONSEGUIU
BTFSS BOTAO_0
GOTO VARRE ; SIM -
LOP DECF MT_0_REFERENCIA,W ;DEREMENTA 1
MOVWF MT_0_REFERENCIA ;SAUVA DECREMENTO
XORWF MT_0,W ; COMPARA MT_O COM ; UM CONTADOR DE 3 POSISOES
BTFSS STATUS,Z ; VERIFICA Se MT_0 ESTA 1 PULA APROXIMA LINHA CALL CONDÇAO
CALL SISTEMA_MENU
; GOTO LOP
BTFSC MT_0_REFERENCIA,W
MOVLW .0 ;MOVE (0)PARA
MOVF MONITOR_0 ;MONITOR_0
GOTO VARRE ; VOLTA P/ VARREDURA DOS BOTÕES
CONDÇAO1
BTFSS BOTAO_1 ; O BOTÃO 1 ESTÁ PRESSIONADO LE A PROXIMA; NAO PULA ?
CALL LEITURA
BSF LIGA_MOTOR_0A; LIGA MOTOR 0 PARA DIREITA
BTFSC BOTAO_1 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
BCF LIGA_MOTOR_0A ; DELIGA MOTOR 0 PARA DIREITA
BTFSC BOTAO_1 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
GOTO $-6 ; NÃO - VOLTA 5 INSTRUÇÕES
BTFSS BOTAO_2 ; O BOTÃO 1 ESTÁ PRESSIONADO LE A PROXIMA; NAO PULA ?
CALL LEITURA
BSF LIGA_MOTOR_0B ; LIGA MOTOR 0 PARA ESQUERDA
BTFSC BOTAO_2 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
BCF LIGA_MOTOR_0B ; DELIGA MOTOR 0 PARA ESQUERDA
BTFSC BOTAO_2 ;TESTA SE SE TECLA 1 ESTÁ PRESIONADA NAO LE A PROXIMA
GOTO $-6 ; NÃO - VOLTA 5 INSTRUÇÕES
RETURN
TRATA_SITUAÇAO1
MOVLW .1
MOVWF MONITOR_1 ; COLOCA 1 EMM MONITOR
; MOVF MONITOR_1,W ;COPIA PARA W
; MOVWF PORTC,2 ;ENVIA PARA PORTC
LEITURA ;DE AD ANALOGICO
BSF ADCON0,GO ; INICIA CONVERSÃO A/D
BTFSC ADCON0,GO ; FIM DA CONVERSÃO ?
GOTO $-1 ; NÃO - VOLTA 1 INSTRUÇÃO
; SIM
MOVLW .250
MOVWF ACCaHI ; CARREGA ACCHI COM 250(PARA SEGURANÇA DO MOTOR
MOVLW .10
MOVWF ACCaLO ;CARREGA ACCaLO COM 10 PARA SEGURANÇA DO MOTOR
MOVF ADGARD_0,W
ADDLW 0X30 ; CONVERTE BCD DA UNIDADE EM ASCII
CALL ESCREVE ; ENVIA AO LCD
RETURN
; OS COMANDOS A SEGUIR SÃO PARA ESCREVER A FRASE RELACIONADA AO BOTÃO 3
MENSAGE_A
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC2 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 2
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 3"
MOVLW 'V'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'c'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW ' '
CALL ESCREVE
MOVLW 'c'
CALL ESCREVE
MOVLW 'o'
CALL ESCREVE
MOVLW 'n'
CALL ESCREVE
MOVLW 's'
CALL ESCREVE
MOVLW 'e'
CALL ESCREVE
MOVLW 'g'
CALL ESCREVE
MOVLW 'u'
CALL ESCREVE
MOVLW 'i'
CALL ESCREVE
MOVLW 'U'
CALL ESCREVE
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;---------------------------------------------------
SISTEMA_MENU
MOVLW .3
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F0 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
MOVLW .2
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F1 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
MOVLW .1
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F3 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
MOVLW .0
MOVWF DECREMENTA_MENU
MOVF MT_0_REFERENCIA,W
XORWF DECREMENTA_MENU,W ; RESULTADO DE SUB COMPARACAO DE VARIAVEIS ABAIXO
BTFSS STATUS,Z ; VERIFICA Se esta EM 1 PULA APROXIMA LINHA
CALL MENSAGE_A_F3 ; VAI TRATAR MENSAGEM
CALL CONDÇAO1
RETURN
MENSAGE_A_F0
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS
; LETRAS DE "TECLA 3"
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '0'
CALL ESCREVE
RETURN
MENSAGE_A_F1
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '1'
CALL ESCREVE
RETURN
MENSAGE_A_F2
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '2'
CALL ESCREVE
RETURN
MENSAGE_A_F3
CALL DELAY_MS
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS
MOVLW 0X01
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
MOVLW .1
CALL DELAY_MS ; DELAY DE 1MS
MOVLW 0XC5 ; COMANDO PARA POSICIONAR O CURSOR
CALL ESCREVE ; LINHA 1 / COLUNA 8
BSF RS ; SELECIONA O DISPLAY P/ DADOS
MOVLW 'F'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '>'
CALL ESCREVE
MOVLW '3'
CALL ESCREVE
RETURN
Este programa nao está concluido pois é só
; FIM DO PROGRAMA
END ; FIM DO PROGRAMA

Comentários
Postar um comentário
Faça seu comentário referente a este assunto