;************************************************************************************************ ; ; TRUCO.ASM ; ; ; CONTADOR DE PONTOS PARA PARTIDAS DE 'TRUCO' (VERSÃO COM LEDS) ; COM MICROCONTROLADOR PIC 16F628A ; AUTOR: CLÁUDIO LÁRIOS ; DATA DE INICIO: 06/12/12 TERMINO: 24/12/2012 ; ; TOTAL DE LEDS: 30 ; EQUIPE 'A': LED 0 A 11 COM MAIS 3 LEDS DE VITÓRIAS ; EQUIPE 'B': LED 0 A 11 COM MAIS 3 LEDS DE VITÓRIAS ; 5 BOTÕES: INCREMENTA 'A', DECREMENTA 'A', INCREMENTA 'B', DECREMENTA 'B' ; E 'REINICIA OU RESET' ; FUNÇÃO EXCLUSIVA: QUANDO ACENDER O LED 11, ESTE IRÁ PISCAR. ; A ALIMENTAÇÃO PODE SER FEITA COM 4 PILHAS AA , COM UM DIODO EM SÉRIE ; OU COM FONTE EXTERNA. ;************************************************************************************************ LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ERRORLEVEL -302 ERRORLEVEL -211 ;************************************************************************************************* ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF ;************************************************************************************************* ;RAM CBLOCK 0X20 TEMP,DIG012,DIG345,DIG678,DIG91011,DIG123Q,CONTADOR_A,CONTADOR_B STATUSTEMP,WTEMP,MPX,LC,LC1,LC2,FLAGS CONTADOR_QA,CONTADOR_QB,CONT1,CONT2,MASK,CONTZ1,CONTZ2 ENDC ;************************************************************************************************** ;MACRO PARA BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;************************************************************************************************** ;DEFINIÇÕES DE PINOS DE ENTRADA E SAIDA ;SAÍDAS #DEFINE L03691A PORTA,0 ;OUT - PINO 17 #DEFINE L147102A PORTA,1 ;OUT - PINO 18 #DEFINE L258113A PORTA,2 ;OUT - PINO 1 #DEFINE L03691B PORTA,3 ;OUT - PINO 3 #DEFINE L147102B PORTA,6 ;OUT - PINO 15 #DEFINE L258113B PORTA,7 ;OUT - PINO 16 #DEFINE C012 PORTB,4 ;OUT - PINO 10 #DEFINE C345 PORTB,0 ;OUT - PINO 6 #DEFINE C678 PORTB,1 ;OUT - PINO 7 #DEFINE C91011 PORTB,2 ;OUT - PINO 8 #DEFINE C123Q PORTB,3 ;OUT - PINO 9 ;ENTRADAS #DEFINE UP_A PORTB,7 ;IN - PINO 13 #DEFINE UP_B PORTB,5 ;IN - PINO 11 #DEFINE DOWN_A PORTB,6 ;IN - PINO 12 #DEFINE DOWN_B PORTA,4 ;IN - PINO 3 (USE PULL-UP) ;FLAGS #DEFINE FLAGAUXA FLAGS,2 ;FLAG AUX A #DEFINE FLAGAUXB FLAGS,3 ;FLAG AUX B ;FACILITADORES #DEFINE C_ STATUS,C ;FLAG CARRY #DEFINE Z_ STATUS,Z ;FLAG Z ;EQUATES PARA AS CHAVES C_UP_A EQU B'10000000' ;CHAVE UP_A C_DOWN_A EQU B'01000000' ;CHAVE DOWN_A C_UP_B EQU B'00100000' ;CHAVE UP_B C_DOWN_B EQU B'00010000' ;CHAVE DOWN_B ;EQUATES PARA TEMPOS C_DBC EQU 0X05 ;TEMPO DE DEBOUNCE C_TEMPO_PISCADA EQU 0X05 ;TEMPO DA PISCADA DO LED 11 A/B ;======================================================================================== ;INICIO DO PROGRAMA ORG 0X00 GOTO RESET ;================================================================= ;ROTINA DE INTERRUPÇÃO PARA MULTIPLEXAÇÃO DOS LEDS ORG 0X04 GOTO INT_MULTIPLEXA_DISPLAYS ;================================================================== ;SALTO GOTO PARA ACENDIMENTO DOS LEDS DA EQUIPE 'A' TAB_A ADDWF PCL,F MOVFW DIG012 IORLW B'00000001' ;LIGA LED0A MOVWF DIG012 GOTO SAIDA_TAB_A MOVFW DIG012 IORLW B'00000010' ;LIGA LED1A MOVWF DIG012 GOTO SAIDA_TAB_A MOVFW DIG012 IORLW B'00000100' ;LIGA LED2A MOVWF DIG012 GOTO SAIDA_TAB_A MOVFW DIG345 IORLW B'00000001' ;LIGA LED3A MOVWF DIG345 GOTO SAIDA_TAB_A MOVFW DIG345 IORLW B'00000010' ;LIGA LED4A MOVWF DIG345 GOTO SAIDA_TAB_A MOVFW DIG345 IORLW B'00000100' ;LIGA LED5A MOVWF DIG345 GOTO SAIDA_TAB_A MOVFW DIG678 IORLW B'00000001' ;LIGA LED6A MOVWF DIG678 GOTO SAIDA_TAB_A MOVFW DIG678 IORLW B'00000010' ;LIGA LED7A MOVWF DIG678 GOTO SAIDA_TAB_A MOVFW DIG678 IORLW B'00000100' ;LIGA LED8A MOVWF DIG678 GOTO SAIDA_TAB_A MOVFW DIG91011 IORLW B'00000001' ;LIGA LED9A MOVWF DIG91011 GOTO SAIDA_TAB_A MOVFW DIG91011 IORLW B'00000010' ;LIGA LED10A MOVWF DIG91011 GOTO SAIDA_TAB_A MOVFW DIG91011 IORLW B'00000100' ;LIGA LED11A MOVWF DIG91011 GOTO SAIDA_TAB_A ;================================================================== ;SALTO GOTO PARA ACENDIMENTO DOS LEDS DA EQUIPE 'B' TAB_B ADDWF PCL,F MOVFW DIG012 IORLW B'00001000' ;LIGA LED0B MOVWF DIG012 GOTO SAIDA_TAB_B MOVFW DIG012 IORLW B'01000000' ;LIGA LED1B MOVWF DIG012 GOTO SAIDA_TAB_B MOVFW DIG012 IORLW B'10000000' ;LIGA LED2B MOVWF DIG012 GOTO SAIDA_TAB_B MOVFW DIG345 IORLW B'00001000' ;LIGA LED3B MOVWF DIG345 GOTO SAIDA_TAB_B MOVFW DIG345 IORLW B'01000000' ;LIGA LED4B MOVWF DIG345 GOTO SAIDA_TAB_B MOVFW DIG345 IORLW B'10000000' ;LIGA LED5B MOVWF DIG345 GOTO SAIDA_TAB_B MOVFW DIG678 IORLW B'00001000' ;LIGA LED6B MOVWF DIG678 GOTO SAIDA_TAB_B MOVFW DIG678 IORLW B'01000000' ;LIGA LED7B MOVWF DIG678 GOTO SAIDA_TAB_B MOVFW DIG678 IORLW B'10000000' ;LIGA LED8B MOVWF DIG678 GOTO SAIDA_TAB_B MOVFW DIG91011 IORLW B'00001000' ;LIGA LED9B MOVWF DIG91011 GOTO SAIDA_TAB_B MOVFW DIG91011 IORLW B'01000000' ;LIGA LED10B MOVWF DIG91011 GOTO SAIDA_TAB_B MOVFW DIG91011 IORLW B'10000000' ;LIGA LED11B MOVWF DIG91011 GOTO SAIDA_TAB_B ;================================================================== ;RESET DO MICROCONTROLADOR (ZERAR RESULTADOS) RESET MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES BANK1 MOVLW B'11100000' ;APENAS RB7, RB6 E RB5 COMO ENTRADAS MOVWF TRISB MOVLW B'00110000' ;APENAS RA4 E RA5 COMO ENTRADAS MOVWF TRISA MOVLW B'10000011' ;DESLIGA PULL UP MOVWF OPTION_REG ; PRESCALLER /16 BANK0 BSF INTCON,T0IE ;HABILITA INTERRUPÇÃO DO TMR0 BSF INTCON,GIE ;LIGA CHAVE GERAL DAS INTERRUPÇÕES CLRF PORTA ; RESET PORTA CLRF PORTB ; RESET PORTB CLRF DIG123Q CLRF CONTADOR_A CLRF CONTADOR_B CLRF CONTADOR_QB CLRF CONTADOR_QA CLRF FLAGS CALL ATUALIZAR_A CALL ATUALIZAR_B MOVLW C_DBC ;CARGA DO TEMPO DE DEBOUNCE DE CHAVES MOVWF CONT2 CLRF CONT1 MOVLW C_TEMPO_PISCADA ;CARGA INICIAL DO TEMPO PARA PISCADA DO LED 11 MOVWF CONTZ2 MOVWF CONTZ1 ;***************************************************************************************** ;ROTINA PRINCIPAL MAIN ;========================================================================================================================== ;ROTINA DE TESTE DE CHAVES LIGADAS (UP_A/B - DOWN A/B) ;========================================================================================================================== ;AUMENTA PONTOS NA EQUIPE 'A' TESTA_CH_UP_A CALL CARGA_DEBOUNCE MOVLW C_UP_A MOVWF MASK ;CARREGA MASCARA CORRESPONDENTE A CHAVE MOVLW PORTB CALL TESTA_CHAVE ADDLW .1 BTFSS Z_ GOTO TESTA_CH_DOWN_A INCF CONTADOR_A,F MOVFW CONTADOR_A XORLW .12 BTFSS Z_ GOTO SEGT1 ;==================================================== ;; CHEGOU A 12 PONTOS = 1 VITÓRIA ; RESETA CONTADORES E INCREMENTA VITÓRIA EM 'A' CLRF DIG012 MOVLW B'00001001' ;LIGA LED0 A/B MOVWF DIG012 CLRF CONTADOR_A CLRF CONTADOR_B CLRF DIG345 CLRF DIG678 CLRF DIG91011 INCF CONTADOR_QA,F MOVFW CONTADOR_QA XORLW .4 BTFSC Z_ CLRF CONTADOR_QA ;ZERA SE MAIOR QUE 3 PONTOS SEGT1 CALL ATUALIZAR_A ;ATUALIZA RESULTADOS EQUIPE 'A' CALL ATUALIZAR_QA MOVLW .1 CALL DELAYW ;======================================================================================== TESTA_CH_DOWN_A CALL CARGA_DEBOUNCE MOVLW C_DOWN_A MOVWF MASK ;CARREGA MASCARA CORRESPONDENTE A CHAVE MOVLW PORTB CALL TESTA_CHAVE ADDLW .1 BTFSS Z_ GOTO TESTA_CH_UP_B DECF CONTADOR_A,F MOVFW CONTADOR_A XORLW 0XFF BTFSS Z_ GOTO SEGT6 MOVFW CONTADOR_QA ;SE FOR MAIOR QUE '0' XORLW .0 BTFSC Z_ GOTO SEGT6 MOVLW .11 ;SERÁ DECREMENTADO QA E ATUALIZADO CONTADOR_A MOVWF CONTADOR_A DECF CONTADOR_QA,F SEGT6 CALL ATUALIZAR_A ;ATUALIZA RESULTADOS EQUIPE 'B' CALL ATUALIZAR_QA MOVLW .1 CALL DELAYW ;================================================================================ ;AUMENTA PONTOS EM 'B' TESTA_CH_UP_B CALL CARGA_DEBOUNCE MOVLW C_UP_B MOVWF MASK ;CARREGA MASCARA CORRESPONDENTE A CHAVE MOVLW PORTB CALL TESTA_CHAVE ADDLW .1 BTFSS Z_ CALL TESTA_CH_DOWN_B INCF CONTADOR_B,F MOVFW CONTADOR_B XORLW .12 BTFSS Z_ GOTO SEGT2 ;==================================================== ; CHEGOU A 12 PONTOS = 1 VITÓRIA ; RESETA CONTADORES E INCREMENTA VITÓRIA EM 'B' CLRF DIG012 MOVLW B'00001001' ;LIGA LED0 A/B MOVWF DIG012 CLRF CONTADOR_A CLRF CONTADOR_B CLRF DIG345 CLRF DIG678 CLRF DIG91011 INCF CONTADOR_QB,F MOVFW CONTADOR_QB XORLW .4 BTFSC Z_ CLRF CONTADOR_QB ;ZERA SE MAIOR QUE 3 PONTOS SEGT2 CALL ATUALIZAR_B ;ATUALIZA RESULTADOS EQUIPE 'B' CALL ATUALIZAR_QB MOVLW .1 CALL DELAYW ;============================================================================= ;DIMINUE PONTOS EM 'B' (CORRIGIR ERROS APENAS) TESTA_CH_DOWN_B CALL CARGA_DEBOUNCE MOVLW C_DOWN_B MOVWF MASK ;CARREGA MASCARA CORRESPONDENTE A CHAVE MOVLW PORTA CALL TESTA_CHAVE ADDLW .1 BTFSS Z_ GOTO RETORNO_MAIN DECF CONTADOR_B,F MOVFW CONTADOR_B XORLW 0XFF BTFSS Z_ GOTO SEGT4 MOVFW CONTADOR_QB XORLW .0 BTFSC Z_ GOTO SEGT4 MOVLW .11 MOVWF CONTADOR_B DECF CONTADOR_QB,F SEGT4 CALL ATUALIZAR_B ;ATUALIZA RESULTADOS EQUIPE 'B' CALL ATUALIZAR_QB ;ATUALIZA RESULTADOS DE VITÓRIAS 'B' MOVLW .1 CALL DELAYW GOTO RETORNO_MAIN ;================================================================== ;ATUALIZAR_CHAVES ATUALIZAR_A MOVFW CONTADOR_A ;LIMITA DE 0 A 12 A CONTAGEM SUBLW .12 SKPC ;PULA A PROXIMA LINHA SE NÃO HOUVE CARRY CLRF CONTADOR_A MOVFW CONTADOR_QA XORLW 0XFF BTFSS Z_ GOTO SEGF1 INCF CONTADOR_QA,F SEGF1 MOVFW DIG012 ;APAGA VALORES DE 'A' NOS DIGS ANDLW B'11111000' MOVWF DIG012 MOVFW DIG345 ;APAGA ANDLW B'11111000' MOVWF DIG345 MOVFW DIG678 ;APAGA ANDLW B'11111000' MOVWF DIG678 MOVFW DIG91011 ;APAGA ANDLW B'11111000' MOVWF DIG91011 MOVFW CONTADOR_A MOVWF TEMP BCF C_ RLF TEMP,F BCF C_ RLF TEMP,F MOVFW TEMP GOTO TAB_A ;COLOCA NOVOS VALORES DE 'A' NOS 'DIG'S ;RETORNA A PARTIR DA TABELA ATUALIZAR_B MOVFW CONTADOR_B ;LIMITA DE 0 A 12 A CONTAGEM SUBLW .12 SKPC ;PULA A PROXIMA LINHA SE NÃO HOUVE CARRY CLRF CONTADOR_B MOVFW DIG012 ;APAGA VALORES DE 'B' NOS DIGS ANDLW B'00110111' ;APAGA BIT 3 ,6 E 7 MOVWF DIG012 MOVFW DIG345 ;APAGA ANDLW B'00110111' ;APAGA BIT 3 ,6 E 7 MOVWF DIG345 MOVFW DIG678 ;APAGA ANDLW B'00110111' ;APAGA BIT 3 ,6 E 7 MOVWF DIG678 MOVFW DIG91011 ;APAGA ANDLW B'00110111' ;APAGA BIT 3 ,6 E 7 MOVWF DIG91011 MOVFW CONTADOR_B MOVWF TEMP BCF C_ RLF TEMP,F BCF C_ RLF TEMP,F MOVFW TEMP GOTO TAB_B ;COLOCA NOVOS VALORES DE 'B' NOS 'DIG'S ;RETORNA A PARTIR DA TABELA ;================================================================= ;ATUALIZA CONTADOR QB NOS LEDS ATUALIZAR_QB MOVFW CONTADOR_QB XORLW .1 BTFSS Z_ GOTO PX1B MOVFW DIG123Q ANDLW B'00110111' IORLW B'00001000' MOVWF DIG123Q GOTO SAIDA_TAB_B PX1B MOVFW CONTADOR_QB XORLW .2 BTFSS Z_ GOTO PX2B MOVFW DIG123Q ANDLW B'00110111' IORLW B'01000000' MOVWF DIG123Q GOTO SAIDA_TAB_B PX2B MOVFW CONTADOR_QB XORLW .3 BTFSS Z_ GOTO PX3B MOVFW DIG123Q ANDLW B'00110111' IORLW B'10000000' MOVWF DIG123Q GOTO SAIDA_TAB_B PX3B CLRF CONTADOR_QB MOVFW DIG123Q ANDLW B'00110111' MOVWF DIG123Q ; GOTO SAIDA_TAB_B SAIDA_TAB_B RETURN ;================================================================ ;ATUALIZA CONTADOR QA NOS LEDS ATUALIZAR_QA MOVFW CONTADOR_QA XORLW .1 BTFSS Z_ GOTO PX1A MOVFW DIG123Q ANDLW B'11111000' IORLW B'00000001' MOVWF DIG123Q GOTO SAIDA_TAB_A PX1A MOVFW CONTADOR_QA XORLW .2 BTFSS Z_ GOTO PX2A MOVFW DIG123Q ANDLW B'11111000' IORLW B'00000010' MOVWF DIG123Q GOTO SAIDA_TAB_A PX2A MOVFW CONTADOR_QA XORLW .3 BTFSS Z_ GOTO PX3A MOVFW DIG123Q ANDLW B'11111000' IORLW B'00000100' MOVWF DIG123Q GOTO SAIDA_TAB_A PX3A CLRF CONTADOR_QA MOVFW DIG123Q ANDLW B'11111000' MOVWF DIG123Q ; GOTO SAIDA_TAB_A SAIDA_TAB_A RETURN ;============================================================================== RETORNO_MAIN ; ROTINA PARA PISCAR LED 11 EQUIPE 'A' MOVFW CONTADOR_A XORLW .11 BTFSS Z_ GOTO TESTAFLAGB BTFSS FLAGAUXA GOTO LIG_11A MOVFW DIG91011 ANDLW B'11111000' ;APAGA FLAG11A MOVWF DIG91011 RET9 DECFSZ CONTZ1,F GOTO TESTAFLAGB BTFSS FLAGAUXA GOTO LIGFAUXA BCF FLAGAUXA SS23 MOVLW C_TEMPO_PISCADA MOVWF CONTZ1 GOTO TESTAFLAGB LIG_11A MOVFW DIG91011 ANDLW B'11111000' ;APAGA FLAG11A IORLW B'00000100' ;LIGA LED 11 A MOVWF DIG91011 GOTO RET9 LIGFAUXA BSF FLAGAUXA GOTO SS23 ;========================================================== TESTAFLAGB ; ROTINA PARA PISCAR LED 11 EQUIPE 'B' MOVFW CONTADOR_B XORLW .11 BTFSS Z_ GOTO SAI_10 BTFSS FLAGAUXB GOTO LIG_11B MOVFW DIG91011 ANDLW B'00110111' ;APAGA FLAG11B MOVWF DIG91011 RET12 DECFSZ CONTZ2,F GOTO SAI_10 BTFSS FLAGAUXB GOTO LIGFAUXB BCF FLAGAUXB SS24 MOVLW C_TEMPO_PISCADA MOVWF CONTZ2 GOTO SAI_10 LIG_11B MOVFW DIG91011 ANDLW B'00110111' ;APAGA FLAG11B IORLW B'10000000' ;LIGA LED 11 B MOVWF DIG91011 GOTO RET12 LIGFAUXB BSF FLAGAUXB GOTO SS24 SAI_10 MOVLW .60 CALL DELAY GOTO MAIN ; SUB- ROTINAS ;=============================================================== ;ROTINAS DE DELAY DELAYW MOVWF LC+2 VJ1 call LcdDelay1 DECFSZ LC+2,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LLoop decfsz LC+0,F ;dec. o prim. cont. goto LLoop decfsz LC+1,F ;dec. o seg. cont. goto LLoop return ;================================================================ ;VELOCIDADE_INC_DEC MOVLW .80 CALL DELAY RETURN ;================================================================= ;CARGA DE TEMPO PARA DEBOUCE DAS CHAVES CARGA_DEBOUNCE MOVLW C_DBC MOVWF CONT2 CLRF CONT1 RETURN ;======================================================================= ;ROTINA DE TESTEDAS CHAVES TESTA_CHAVE MOVWF FSR MOVFW INDF ;PEGA CONTEUDO DE PORTA ANDWF MASK,W ;LIMITA ATUAÇÃO XORWF MASK,W ;TESTA BIT DA CHAVE SELECIONADA EM 'MASK' BTFSS STATUS,Z RETLW .0 ;DESLIGADA VT1 DECFSZ CONT1,F ;LIGADA , CONTA TEMPO DE 'DEBOUNCE' GOTO VT1 DECFSZ CONT2,F GOTO VT1 MOVFW INDF ;PEGA CONTEUDO DE PORTA ANDWF MASK,W ;LIMITA ATUAÇÃO XORWF MASK,W ;TESTA BIT DA CHAVE SELECIONADA EM 'MASK' BTFSS STATUS,Z RETLW .0 ;DESLIGADA RETLW 0XFF ; RETORNA COM 0XFF INDICANDO CHAVE LIGADA ;============================================================================ ;ROTINA DE INTERRUPÇÃO PARA VISUALIZAÇÃO DOS DISPLAYS INT_MULTIPLEXA_DISPLAYS MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BCF INTCON,T0IF ;APAGA FLAG INTERRUPÇÃO TMR0 CLRF PORTB ;APAGA TUDO INCF MPX,F MOVFW MPX SUBLW .5 ;LIMITA CONTAGEM DE 0 A 4 BTFSC STATUS,C GOTO SSG1 CLRF MPX SSG1 MOVFW MPX XORLW .0 BTFSS STATUS,Z GOTO SSG2 MOVFW DIG012 MOVWF PORTA BSF C012 ;LIGA PARA MOSTRAR LEDS DE 0 A 2 (A E B) GOTO SAI_INT SSG2 MOVFW MPX XORLW .1 BTFSS STATUS,Z GOTO SSG3 MOVFW DIG345 MOVWF PORTA BSF C345 ;LIGA PARA MOSTRAR LEDS DE 0 A 2 (A E B) GOTO SAI_INT SSG3 MOVFW MPX XORLW .2 BTFSS STATUS,Z GOTO SSG4 MOVFW DIG678 MOVWF PORTA BSF C678 ;LIGA PARA MOSTRAR LEDS DE 0 A 2 (A E B) GOTO SAI_INT SSG4 MOVFW MPX XORLW .3 BTFSS STATUS,Z GOTO SSG5 MOVFW DIG91011 MOVWF PORTA BSF C91011 ;LIGA PARA MOSTRAR LEDS DE 0 A 2 (A E B) GOTO SAI_INT SSG5 MOVFW DIG123Q MOVWF PORTA BSF C123Q ;LIGA PARA MOSTRAR LEDS DE 0 A 2 (A E B) ; GOTO SAI_INT SAI_INT SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS MOVFW WTEMP ;RECUPERA 'W' RETFIE ;=============================================================== end