;********************************************************************************************** ; ; ; CHAMA_GARÇOM.ASM ; ; ; OBJETIVO: PAINEL COM 6 DIGITOS PARA INDICAR CHAMADAS DE GARÇONS FEITAS ; ATRÁVES DE CONTROLE REMOTO SITUADO NA MESA , COM 2 BOTÕES: 1 'CHAMA' O OUTRO ; 'CANCELA' A CHAMADA. oS 2 DIGITOS DA ESQUERDA MOSTRARÁ O CLIENTE DE MAIOR PRIO- ; RIDADE, SEGUIDO PELO PRÓXIMOS 4 DIGITOS. E OS 2 ULTIMOS, ALÉM DE MOSTRAR A SE- ; QUENCIA, INDICARÁ NOVOS BOTÕES APERTADOS (PISCANDO E SERÁ GERADO UM SOM), POR ; BREVE PERIODO. EM SEGUIDA, RETORNA MOSTRANDO A SEQUENCIA DE ATENDIMENTO. CADA ; VEZ QUE FOR ATENDIDO UM DOS 3 PRIORITÁRIOS, A FILA SE DESLOCA PARA A ESQUERDA, ; APRESENTANDO O NOVO NÚMERO DO CLIENTE NA FILA DE ESPERA (SE HOUVER, SENÃO APRE- ; SENTARÁ '--' NOS DISPLAYS. CADA NOVO PEDIDO SERÁ MOSTRADO BREVEMENTE NO 5º E 6º ; DISPLAY, PISCARÁ, SERÁ OUVIDO UMA CAMPAINHA, INDO PARA A FILA NA MEMÓRIA E O 5º ; E 6 DIGITO VOLTARÁ A MOSTRAR O 3º DA FILA. ; CAPACIDADE PARA MEMÓRIZAR ATÉ 200 CONTROLES ; FILA SEQUENCIAL NA MEMÓRIA PARA 100 MESAS ; DISPLAY MULTIPLEXADO ; CONTROLE REMOTOS USADOS SÃO COM TECNOLOGIA DO HT6P20B ; O DISPLAY PODERÁ SER CONFECCIONADO COM LED'S DE ALTO BRILHO OU ADQUIRIDO COMER- ; CIALMENTE. ; ; ; PROJETO: CLÁUDIO LÁRIOS INÍCIO : 19-11-2012 TÉRMINO: ; ; ; MICROCONTROLADOR : ATMEGA8 ; ; OSCILADOR INTERNO DE 8MHZ (SUT=0 ,CKSEL3=0 CKSEL2=1 CKSEL1=0 CKSEL0=0) ; ; ; PINAGEM DE LIGAÇÃO: ; ANODO DO DISPLAY 5 (MSB) PD,7 PINO 13 ; ANODO DO DISPLAY 4 PB,2 PINO 16 ; ANODO DO DISPLAY 3 PC,3 PINO 26 ; ANODO DO DISPLAY 2 PC,2 PINO 25 ; ANODO DO DISPLAY 1 PC,1 PINO 24 ; ANODO DO DISPLAY 0 (LSB) PC,0 PINO 23 ; SEG'a' DO DISPLAY PD,0 PINO 02 ; SEG'b' DO DISPLAY PD,1 PINO 03 ; SEG'c' DO DISPLAY PD,2 PINO 04 ; SEG'd' DO DISPLAY PD,3 PINO 05 ; SEG'e' DO DISPLAY PD,4 PINO 06 ; SEG'f' DO DISPLAY PD,5 PINO 11 ; SEG'g' DO DISPLAY PD,6 PINO 12 ; CONEXÃO I2C SCL PC,5 PINO 28 ; CONEXÃO I2C SDA PC,4 PINO 27 ; BOTÃO 'UP' PB,4 PINO 18 ; BOTÃO 'DEL' PB,3 PINO 17 ; BOTÃO 'DEL_ALL' PB,3 PINO 15 ; CHAVE 'PROG_RES PB,6 PINO 09 ; SAIDA DE SOM PB,5 PINO 19 ;============================================================================================ ;******************************************************************************************** ;ESCOLHA DO DISPLAY (PARA ANODO COMUM, DESCOMENTE. PARA CATODO COMUM, COMENTE) ;.DEF INVERTE_SEGUIMENTOS = R0 ;============================================================================================ ; i2c DEFINIÇÕES .EQU V_START = 0X08 ;VALOR DO STATUS PARA ENVIO OK DE 'START' .EQU V_REP_START = 0X10 ;RE-START .EQU SLAVE_ADDRESS_L = 0X00 .EQU SLAVE_ADDRESS_H = 0X00 .EQU MT_SLA_ACK = 0X18 .EQU MT_DATA_ACK= 0X28 .EQU DEVICE_ADDRESS_W = 0XA0 .EQU DEVICE_ADDRESS_R = 0XA1 .EQU MR_SLA_ACK = 0X40 ;********************************************************************************* .INCLUDE "M8DEF.INC" ;INCLUI TODAS AS VARIAVEIS DO ATmega8 ; ;DEFINE NOMES PARA VARIAVEIS (0 A 31) .DEF RTA =R0 ;DIGITOS APRESENTADOS NO DISPLAY POR MULTIPLEXAÇÃO .DEF DIG32 =R1 .DEF DIG54 =R2 .DEF LC =R3 .DEF HC =R4 .DEF QB =R5 .DEF CSR7 =R6 ;RECEPÇÃO .DEF CSR6 =R7 .DEF CSR5 =R8 .DEF CSR4 =R9 .DEF CSR6A =R10 ;RECEPÇÃO .DEF CSR5A =R11 .DEF CSR4A =R12 .DEF Z1 =R13 .DEF Z2 =R14 .DEF DATA =R15 ;----------------- .DEF CONT =R16 .DEF FLAGS =R17 .DEF MPX =R18 .DEF TEMP =R19 ;TEMPORARIO .DEF TEMP1 =R20 ;USADO PARA CONTAGEM DE 1 SEGUNDO .DEF TEMP2 =R21 ;TEMPORARIO AUX .DEF AUX =R22 .DEF RES0 =R23 .DEF RES1 =R24 .DEF ADDRESS1 =R25 ;RAM DEFINIÇÕES .EQU DIG0 = 0X03D4 ;DIGITO 0 .EQU DIG1 = 0X03D3 ;DIGITO 1 .EQU DIG2 = 0X03D2 ;DIGITO 2 .EQU DIG3 = 0X03D1 ;DIGITO 3 .EQU DIG4 = 0X03D0 ;DIGITO 4 .EQU DIG5 = 0X03CF ;DIGITO 5 .EQU PONTM = 0X03CE ;PONTEIRO AUX .EQU ZZ1 = 0X03CD ;CONTADOR .EQU ZZ0 = 0X03CC ;CONTADOR .EQU PONT_H = 0X03CB ;PONTEIRO HIGH .EQU PONT_L = 0X03CA ;PONTEIRO LOW .EQU PONT_NM = 0X03C9 ;PONTEIRO NUMERO DO TX DA MESA .EQU AUX1 =0X03C8 ;VARIAVÉIS PARA GERAR SOM .EQU AUX2 =0X03C7 ;IDEM .EQU AUX3 =0X03C6 ;IDEM ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== ;PORTB .EQU RFIN = 0 ;PINO 14 - IN - RF .EQU LRN = 1 ;PINO 15 - IN - BOTÃO LEARN .EQU DEL_ALL = 1 ;PINO 15 - IN - BOTÃO 'DELETE TODOS POSIÇÕES DE MEMÓRIA' .EQU UP = 4 ;PINO 18 - IN - BOTÃO 'UP' .EQU DEL = 3 ;PINO 17 - IN - BOTÃO 'DEL' .EQU PROG_RES = 6 ;PINO 09 - IN - BOTÃO 'PROGRAMAÇÃO CONTROLES RESERVAS' ;****** FLAGS DEFINITIONS ************** ;REGISTRADOR 'FLAGS'EM OPERAÇÕES DE TESTE .EQU FLAGX = 6 ;RECEPÇÃO HT6P20B .EQU FLAGNL = 0 ;FLAG DE NOVA LEITURA .EQU FLAG1 = 1 ;FLAG DE SITUAÇÃO .EQU FLAGGR = 2 ;FLAG DE GR .EQU FLAGMP = 3 ;FLAG DE MODO DE PROGRAMAÇÃO ;******VARIAVEIS************************ ;REGISTRADOR 'FLAGS' EM OPERAÇÕES DE SETA/RESETA .EQU WFLAGX = 0B01000000 ;RECEPÇÃO HT6P20B .EQU WFLAGNL = 0B00000001 ;FLAG DE NOVA LEITURA .EQU WFLAG1 = 0B00000010 ;FLAG DE SITUAÇÃO .EQU WFLAGGR = 0B00000100 ;FLAG DE GR .EQU WFLAGMP = 0B00001000 ;FLAG DE MODO DE PROGRAMAÇÃO ;******VARIAVEIS************************ .EQU TGR = 255 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO .EQU TMAX = 50 ;VALOR MAXIMO .EQU C_ZZ0 = 250 ;CARGA DO CONTADOR PARA INCREMENTO DO CONTADOR DE TX A SER GRAVADO/APAGADO .EQU C_ZZ1 = 20 ;IDEM ;***********ACESSO A PILHA DE N. DE TX ********************* .EQU PILHA_INIT = 0X60 ;INICIO DA PILHA .EQU PILHA_END = 0XC4 ;FIM DA PILHA .EQU CHAMAR = 7 ;CSR6,7 ,BOTÃO DE CHAMAR GARÇOM .EQU CANCELAR = 6 ;CSR6,6 ,BOTÃO DE ATENDIMENTO REALIZADO/CANCELAR .EQU TEMPO_PISCADA = 3 ;TEMPO DE PISCADA DOS DISPLAYS (original = 10) ;TABELA DE SIMBOLOS ESPECIAIS: .EQU TRACO = 0XBF ;'-' TRAÇO NO DISPLAY INVERTIDO .EQU APAGADO = 0XFF ;' ' .EQU LETRA_A = 0X88 ;'A' .EQU LETRA_B = 0X83 ;'B' .EQU LETRA_C = 0XC6 ;'C' .EQU LETRA_D = 0XA1 ;'D' .EQU LETRA_E = 0X86 ;'E' .EQU LETRA_F = 0X8E ;'F' .EQU LETRA_G = 0X82 ;'G' .EQU LETRA_H = 0X89 ;'H' .EQU LETRA_I = 0XCF ;'1' .EQU LETRA_N = 0X48 ;'N' .EQU LETRA_L = 0XC7 ;'L' .EQU LETRA_O = 0XC0 ;'O' .EQU LETRA_P = 0X8C ;'P' .EQU LETRA_R = 0XCE ;'R' .EQU LETRA_S = 0X92 ;'S' .EQU LETRA_U = 0XC1 ;'U' ;======================================================================================== ; RESET ;======================================================================================== ; .CSEG .ORG 0X00 ;ENDEREÇO DE RESET RJMP START ;VAI PARA INICIO DO PROGRAMA START: ; CLI ;DESABILITA INTERRUPÇÕES LDI TEMP,0X5F ;ACERTA STACK POINTER OUT SPL,TEMP ;para uma boa operaçao de retorno LDI TEMP,0X04 ;USANDO A ULTIMA POSIÇÃO DE MEMÓRIA SRAM OUT SPH,TEMP ;DEFINIÇÕES DE PINOS I/O ;PORTA B LDI TEMP,0B10100100 ;B7=LED; B6=PROG1; B=4 UP; B=3 DEL ; LEARN B0=IN RF; B1= IN BOTÃO LEARN OUT DDRB,TEMP LDI TEMP,0B11111110 ;DESLIGA PULL UP DA IN RF B0 OUT PORTB,TEMP ;PORTA C LDI TEMP,0B11111111 ; COMO SAIDAS (4 e 5 entradas i2c) OUT DDRC,TEMP LDI TEMP,0B00000000 ;INICIA COM ZERO / DESLIGA PULLUP (pull up em 4 e 5 i2c) OUT PORTC,TEMP ;PORTA D LDI TEMP,0B11111111 ;PD0 5 COMO ENTRADA PARA TIMER 1 (O RESTO COMO SAIDA) OUT DDRD,TEMP LDI TEMP,0B00000000 ;INICIA COM ZERO / DESLIGA PULLUP OUT PORTD,TEMP ;DEFINIÇÃO DA COMUNICAÇÃO I2C COM MEMÓRIA EXTERNA - BAUD RATE LDI TEMP,8 ;8 PARA 100KHZ OUT TWBR,TEMP ;CARGA PARA FREQ=100KHZ ;DEFINIÇÃO DO COMPARADOR ANALOGICO LDI TEMP,0B10000000 ;DESABILITA COMPARADOR ANALOGICO OUT ACSR,TEMP ;DEFINIÇÕES DO CONVERSOR ANAL/DIG ; VVA-0CCC VV=01/11 A=DIREITA CCC=CANAL 0 A 5 LDI TEMP,0B11000000 ;DEFINE VREF,APRESENTAÇÃO E CANAL (adc 0) OUT ADMUX,TEMP ; LSDFIXXX L=LIGA S=START(1)/END(0),D=DIRETO F=FLAG LDI TEMP,0B00000101 ; DE INTERRUPÇÃO,I=LIGA INT. XXX=CLOCK:X OUT ADCSRA,TEMP ;OBS:S=1 INICIA CONV.(ADCSRA,7 OU ADSC) LDS TEMP1,SFIOR ;RESETA ACME ANDI TEMP1,0B11110111 STS SFIOR,TEMP1 ;DEFINIÇÕES DO TIMER COUNTER LDI TEMP,0B00000000 ;DESABILITA TIMER COUNTER OUT TIMSK,TEMP LDI TEMP,2 ;2 ;PRESCALER T0 (0=D,1=S/P,2=:8,3=:64,4=:256 OUT TCCR0,TEMP ; 5=:1024,6=CLOCK EXT T0 SUB,7=IDEM DESCIDA LDI TEMP,250 ;TEMPO DE RECARGA DO TIMER COUNTER 158 OUT TCNT0,TEMP ; LDI TEMP,0B00000000 ; DESLIGA RECEPÇÃO DO SINAL A MEDIR (TIMER 1=CONTADOR) OUT TCCR1B,TEMP ; ;CARGA INICIAL DOS PONTEIROS LDI TEMP,0 ;INICIALIZA PONTEIROS STS PONT_H,TEMP ;INICIA COM '0' STS PONT_L,TEMP ;INICIA COM '0' LDI TEMP,1 STS PONT_NM,TEMP ;INICIA COM '1' ;mostra '------' no display LDI TEMP,0B10111111 ;- STS DIG0,TEMP STS DIG1,TEMP STS DIG2,TEMP STS DIG3,TEMP STS DIG4,TEMP STS DIG5,TEMP RCALL APAGAR_PILHA_GERAL ;PREPARA A PILHA ;INICIALIZAÇÃO DAS VARIAVÉIS INICIAIS ; LDI TEMP,0 ;APAGA DISPLAY OUT PORTC,TEMP LDI TEMP,50 ;CARGA DO TEMPO DE APRESENTAÇÃO DO LCD MOV RTA,TEMP CLR FLAGS CLR CSR6A CLR CSR5A CLR CSR4A ;=========================================================================== ; ROTINA PRINCIPAL ;=========================================================================== INICIO: CLR CSR7 ; APAGA RESULTADOS DE COMPARAÇÃO CLR CSR6 CLR CSR5 CLR CSR4 LDI TEMP,28 MOV QB,TEMP ;QUANTIDADE DE BITS A RECEBER L0: CBR FLAGS,WFLAG1 ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLR HC ;APAGA REGISTRADORES DE UNS E ZEROS CLR LC L1: ;--------------------------------- SBRS FLAGS,FLAGMP RJMP SEG777 LDS TEMP,ZZ0 DEC TEMP STS ZZ0,TEMP CPI TEMP,0 BRNE SEG777AUX LDS TEMP,ZZ1 DEC TEMP STS ZZ1,TEMP CPI TEMP,0 BRNE SEG777 RCALL POR_CARGA_ZZ0 RJMP TESTA_BOT_MP SEG777AUX: RJMP SEG777 ;*********************************************************************** ; FUNÇÃO INCREMENTAR E DELETAR ;********************************************************************** TESTA_BOT_MP: ;TESTAR BOTÃO DE 'UP' E DEPOIS, O DE 'DEL' SBIC PINB,UP RJMP TESTA_DEL1 ;VAI TESTAR 'DEL' LDS TEMP,PONT_NM ;INCREMENTA PONTEIRO NM INC TEMP STS PONT_NM,TEMP SUBI TEMP,0X64 BRCC RESETA_PNM RJMP SS98 RESETA_PNM: LDI TEMP,1 STS PONT_NM,TEMP SS98: RJMP VAPR ;=================================================================== ;RECARGA DE TEMPO EM ZZ0,ZZ1 POR_CARGA_ZZ0: LDI TEMP, C_ZZ0 STS ZZ0,TEMP LDI TEMP, C_ZZ1 STS ZZ1,TEMP RET SEG777: ;=========================================================== SBIC PINB,UP ;TESTA POR 'UP' E 'DEL' PRESSIONADOS RJMP L_Z SBIS PINB,DEL ;BTFSS TESTA BOTÃO 'LEARN' APERTADO RJMP IN_MODE_PROG ;APERTADO, COMEÇA A CONTAR TEMPO MAX.PARAR ENTRAR EM MODO DE PROGRAMAÇÃO L_Z: LDI TEMP,TGR MOV Z2,TEMP ;RECARGA DO TEMPO PARA ENTRAR EM MODO DE PROGRAMAÇÃO CLR Z1 ;LIMPA REGISTRADORES L1H: RJMP SS5 IN_MODE_PROG: ;COMEÇA CONTAGEM DE TEMPO PARA ENTRAR EM MODO DE PROGRAMAÇÃO LDI TEMP,0 DEC Z1 CP Z1,TEMP BRNE L1H DEC Z2 CP Z2,TEMP BRNE L1H RCALL RESETAR_PONTEIROS ;=================================================================================== ; MODO DE PROGRAMAÇÃO ;=================================================================================== ;ENTROU EM MODO DE PROGRAMAÇÃO PROG_MODE: SBR FLAGS,WFLAGMP ;SETA FLAG DE 'MODO DE PROGRAMAÇÃO' SBIC PINB,DEL_ALL ;TESTA SE BOTÃO DE DELETAR TODA MEMÓRIA ESTA ACIONADO RJMP OUTRAS_FUNC ;============================================================================= ;CARGA DE TEMPO PARA DELETAR TODA MEMÓRIA INTERNA OU EXTERNA LDI TEMP,TGR MOV Z2,TEMP ;RECARGA DO TEMPO DE APAGAMENTO CLR Z1 ;LIMPA REGISTRADORES L1HN: SBIC PINB,DEL_ALL ;TESTA SE BOTÃO DE DELETAR TODA MEMÓRIA ESTA ACIONADO RJMP OUTRAS_FUNC LDI TEMP,0 DEC Z1 CP Z1,TEMP BRNE L1HN DEC Z2 CP Z2,TEMP BRNE L1HN SBIC PINB,PROG_RES RJMP APAGAR_EXTERNA ;SEM JUMPER COLOCADO, APAGAR EXTERNA RCALL CARGA_CODE_DEL_ALL_INT ;COM JUMPER: CARREGA 'APG I' NO VISOR LDI TEMP,200 RCALL DELAYM SBIC PINB,DEL_ALL RJMP CANCELAR_APAG RCALL CARGA_DESLIGA_DISP ;APAGA DISPLAY DURANTE O APAGAMENTO RCALL APAGAEEPROM ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA RCALL CARGA_APAG_MEM_INT_OK CANC_RET: LDI TEMP,100 RCALL DELAYM RJMP SAI_APAGAMENTO CANCELAR_APAG: RCALL CARGA_CANCEL RJMP CANC_RET CARGA_CANCEL: ;CARREGA 'CANCEL' NO VISOR LDI TEMP,LETRA_C ;MENSAGEM 'CANCEL' = CANCELAR APAGAMENTO STS DIG5,TEMP LDI TEMP,LETRA_A STS DIG4,TEMP LDI TEMP,LETRA_N STS DIG3,TEMP LDI TEMP,LETRA_C STS DIG2,TEMP LDI TEMP,LETRA_E STS DIG1,TEMP LDI TEMP,LETRA_L STS DIG0,TEMP RET CARGA_APAG_MEM_INT_OK: ;CARREGA 'APAGOU' NO VISOR LDI TEMP,LETRA_A STS DIG5,TEMP LDI TEMP,LETRA_P STS DIG4,TEMP LDI TEMP,LETRA_A STS DIG3,TEMP LDI TEMP,LETRA_G STS DIG2,TEMP LDI TEMP,LETRA_O STS DIG1,TEMP LDI TEMP,LETRA_U STS DIG0,TEMP RET CARGA_CODE_DEL_ALL_INT: ;CARREGA 'APG I' NO VISOR LDI TEMP,LETRA_A STS DIG5,TEMP LDI TEMP,LETRA_P STS DIG4,TEMP LDI TEMP,LETRA_G STS DIG3,TEMP LDI TEMP,APAGADO STS DIG2,TEMP LDI TEMP,APAGADO STS DIG1,TEMP LDI TEMP,LETRA_I STS DIG0,TEMP RET CARGA_CODE_DEL_ALL_EXT: ;CARREGA 'APG E' NO VISOR LDI TEMP,LETRA_A STS DIG5,TEMP LDI TEMP,LETRA_P STS DIG4,TEMP LDI TEMP,LETRA_G STS DIG3,TEMP LDI TEMP,APAGADO STS DIG2,TEMP LDI TEMP,APAGADO STS DIG1,TEMP LDI TEMP,LETRA_E STS DIG0,TEMP RET CARGA_DESLIGA_DISP: IN TEMP,PORTB ANDI TEMP,0B11111011 ;APAGA ANODO 'A4' EM B2 PINO 16 OUT PORTB,TEMP LDI TEMP,0 OUT PORTC,TEMP ;DESLIGA ANODOS 'A0 A A3' LDI TEMP,0 OUT PORTD,TEMP ;APAGA 7 SEG E ANODO 'A5' RET ;==================================================================== ; APAGAMENTO GERAL DA MEMÓRIA EXTERNA (CONTROLES RESERVAS) ;==================================================================== ;APAGA EEPROM EXTERNA COM CONTEUDO DOS CONTROLES DE RESERVA APAGAR_EXTERNA: RCALL CARGA_CODE_DEL_ALL_EXT LDI TEMP,200 RCALL DELAYM SBIC PINB,DEL_ALL RJMP CANCELAR_APAG RCALL CARGA_DESLIGA_DISP ;APAGA DISPLAY DURANTE O APAGAMENTO LDI XH,0 LDI XL,0 VKTY1: LDI TEMP,0XFF MOV DATA,TEMP RCALL W_I2C INC XL CPI XL,0 BRNE VKTY1 INC XH CPI XH,2 BREQ MENS_APAG RJMP VKTY1 MENS_APAG: RCALL CARGA_APAG_MEM_INT_OK LDI TEMP,100 RCALL DELAYM ;==================================================================== SAI_APAGAMENTO: XD0: SBIS PINB,DEL_ALL ;BTFSS AGUARDA SOLTAR BOTÃO 'DEL_ALL' RJMP PROG_MODE ;================================================================================= ; PROGRAMAR CONTROLES RECEBIDOS (EM MODO DE PROGRAMAÇÃO) ;================================================================================= OUTRAS_FUNC: ;TESTAR J1: COM JUMPER COLOCADO ->MEMÓRIA INTERNA, SEM JUMPER ->EXTERNA (TX RESERVAS) SBIC PINB,PROG_RES ;TESTA J1:JUMPER COLOCADO PARA MEMÓRIA INTERNA RJMP PROG_MEM_EXTERNA LDI TEMP,LETRA_P ;MOSTRA 'P' DE PROGRAMAÇÃO STS DIG5,TEMP LDI TEMP,APAGADO STS DIG4,TEMP LDI TEMP,APAGADO STS DIG3,TEMP LDI TEMP,APAGADO STS DIG2,TEMP LDI TEMP,10 RCALL DELAYM LOOP1: SBIC PINB,UP ;ESPERA SOLTAR AMBOS BOTÕES (UP E DEL) RJMP VAPR SBIC PINB,DEL ; RJMP VAPR LDI TEMP,1 RCALL DELAYM RJMP LOOP1 ; VAPR: LDS TEMP,PONT_NM RCALL CONV_1BH_2BDEC_7SEG STS DIG0,TEMP STS DIG1,TEMP1 RJMP INICIO PROGRAMAR_ESTE_TX: ;PROGRAMA TX RECEBIDO NA EEPROM INTERNA SBIC PINB,PROG_RES ;TESTA BOTÃO 'PROG_RES' MEMÓRIA EXT=1 INT=0 RJMP PROGRAMAR_ESTE_TX_RESERVA LDS CONT,PONT_NM DEC CONT ;SUBTRAI '1' RCALL MULTIPLICA_POR_TRES ;OBTEM O ENDEREÇO MOV TEMP,CSR4 ;COLOCA EM 'TMP' RCALL EEWRITE ;ROTINA DE ESCRITA NA EEPROM INC XL ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM RCALL INC_H ;TESTA SE DEVE INCREMENTAR HIGH MOV TEMP,CSR5 RCALL EEWRITE INC XL RCALL INC_H ;TESTA SE DEVE INCREMENTAR HIGH MOV TEMP,CSR6 CBR TEMP,0B11000000 ;APAGA BOTÕES NOS BITS 6 E 7 RCALL EEWRITE RJMP SALVA_INC PROGRAMAR_ESTE_TX_RESERVA: ;PROGRAMA TX RECEBIDO NA EEPROM EXTERNA 24C08 (TX DE RESERVA APENAS) LDS CONT,PONT_NM DEC CONT ;SUBTRAI '1' RCALL MULTIPLICA_POR_TRES ;OBTEM O ENDEREÇO MOV DATA,CSR4 ;COLOCA EM 'DATA' RCALL W_I2C ;ROTINA DE ESCRITA NA EEPROM INC XL ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM RCALL INC_H ;TESTA SE DEVE INCREMENTAR HIGH MOV DATA,CSR5 RCALL W_I2C INC XL RCALL INC_H ;TESTA SE DEVE INCREMENTAR HIGH MOV TEMP,CSR6 CBR TEMP,0B11000000 ;APAGA BOTÕES NOS BITS 6 E 7 MOV DATA,TEMP RCALL W_I2C SALVA_INC: INC XL RCALL INC_H ;TESTA SE DEVE INCREMENTAR HIGH LDS TEMP,PONT_NM INC TEMP STS PONT_NM,TEMP CPI TEMP,100 BRCC RESET_PNM1 STS PONT_L,XL ;SALVA PONTEIROS STS PONT_H,XH RJMP PROG_MODE RESET_PNM1: RCALL RESETAR_PONTEIROS RJMP PROG_MODE RESETAR_PONTEIROS: LDI TEMP,1 STS PONT_NM,TEMP LDI TEMP,0 STS PONT_L,TEMP STS PONT_H,TEMP RET ;=============================================================== ; INCREMENTO DO PONTEIRO COM TESTE DE LIMITE MÁXIMO INC_PONTEIRO: LDS TEMP,PONT_L ;LIMITA INCREMENTO ATÉ 99 TX SUBI TEMP,0X29 ;0X0129 = 99D X 3 BRCS PP35 LDS TEMP,PONT_H SUBI TEMP,1 BRCC RELOAD PP35: LDS TEMP,PONT_L INC TEMP STS PONT_L,TEMP BRCC PP33 LDS TEMP,PONT_H INC TEMP STS PONT_H,TEMP PP33: RET RELOAD: RCALL RESETAR_PONTEIROS RET ;********************************************************************** ; APAGAMENTO INDIVIDUAL DE TX DE MESA ; OBJ:TESTA SE DEVE DELETAR OU NÃO O NUMERO MOSTRADO NO DISPLAY ;====================================================================== TESTA_DEL1: SBIC PINB,DEL RJMP L_Z ;VOLTA A ROTINA DE RECEPÇÃO DE TX SBIC PINB,PROG_RES ;TESTA BOTÃO 'PROG_RES' MEMÓRIA EXT=1 INT=0 RJMP APAGAR_TX_RESERVA ;APAGAMENTO INDIVIDUAL DE CONTROLE DA EEPROM INTERNA LDS CONT,PONT_NM DEC CONT ;SUBTRAI '1' RCALL MULTIPLICA_POR_TRES ;OBTEM O ENDEREÇO LDI TEMP,0XFF ;ESCREVE 'FF' RCALL EEWRITE RCALL INC_PONTEIRO LDI TEMP,0XFF ;ESCREVE 'FF' RCALL EEWRITE RCALL INC_PONTEIRO LDI TEMP,0XFF ;ESCREVE 'FF' RCALL EEWRITE RCALL INC_PONTEIRO LDI TEMP,LETRA_D ;LETRA D (DELETAR) STS DIG2,TEMP LDI TEMP,50 RCALL DELAYM LDI TEMP,APAGADO ;APAGA DIG2 STS DIG2,TEMP RJMP SALVA_PONT2 APAGAR_TX_RESERVA: ;APAGAMENTO INDIVIDUAL DE TX DE MESA DE RESERVA (MEMÓRIA EXTERNA) LDS CONT,PONT_NM DEC CONT ;SUBTRAI '1' RCALL MULTIPLICA_POR_TRES ;OBTEM O ENDEREÇO LDI TEMP,0XFF ;ESCREVE 'FF' MOV DATA,TEMP RCALL W_I2C RCALL INC_PONTEIRO RCALL W_I2C RCALL INC_PONTEIRO RCALL W_I2C RCALL INC_PONTEIRO LDI TEMP,LETRA_D ;LETRA D STS DIG2,TEMP LDI TEMP,50 RCALL DELAYM LDI TEMP,APAGADO ;APAGA DIG2 STS DIG2,TEMP SALVA_PONT2: RCALL INC_PONTEIRO LDS TEMP,PONT_NM INC TEMP ;ATUALIZA NUMERO DO CONTROLE DE MESA STS PONT_NM,TEMP CPI TEMP,100 BRCC RESET_PNM2 STS PONT_L,XL ;SALVA PONTEIROS STS PONT_H,XH RJMP PROG_MODE RESET_PNM2: RCALL RESETAR_PONTEIROS RJMP PROG_MODE PROG_MEM_EXTERNA: ;PROGRAMA TX RECEBIDO NA EEPROM EXTERNA LDI TEMP,LETRA_P STS DIG5,TEMP LDI TEMP,APAGADO STS DIG4,TEMP LDI TEMP,LETRA_R STS DIG3,TEMP LDI TEMP,APAGADO STS DIG2,TEMP LDI TEMP,10 RCALL DELAYM LOOP2: SBIC PINB,UP ;ESPERA SOLTAR AMBOS BOTÕES (UP E DEL) RJMP VAPR SBIC PINB,DEL ; RJMP VAPR LDI TEMP,1 RCALL DELAYM RJMP LOOP2 ; RJMP VAPR OUTRAS_FUNC1: ;ROTINA DE APRESENTAÇÃO RJMP PROG_MODE ;========================================================================== ;CONVERTE 1 BYTE HEXA PARA 2 BYTES DECIMAIS CONV_1BH_2BDEC_7SEG: ; ENTRAR EM 'TEMP' O BYTE A CONVERTER DE HEXA PARA 2 BYTES DEC RETORNANDO: ; TEMP= LSB E TEMP1=MSB RCALL BCD_TO_DEC MOV TEMP1,TEMP ;SALVA CONVERSÃO SWAP TEMP ANDI TEMP,0X0F RCALL CONV_7SEG PUSH TEMP ;SALVA DIG MSB MOV TEMP,TEMP1 ANDI TEMP,0X0F RCALL CONV_7SEG POP TEMP1 ;RETORNA EM TEMP1 = MSB E TEMP = LSB RET ;===================ROTINA DE RECEPÇÃO HT6P20B ========================== SS5: ;A SBRS FLAGS,FLAG1 ;BTFSS TESTA FLAG DE HUM/ZERO RECEBIDO RJMP L2 ;FLAG=0 ;-------------------------------- ;B SBIS PINB,RFIN ;BTFSS RFIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF RJMP M0 ; RFIN=0 ;---------------------------------- L2: ;C SBIS PINB,RFIN ;BTFSS SIN ? RJMP LA1 ;SIN=0 ;------------------------------------- ;E LDI TEMP,0 SBR FLAGS,WFLAG1 ;BSF SIN=1 INC HC CP TEMP,HC BRNE LA2 DEC HC RJMP LA2 ;VAI CONTAR TEMPO DE 50 MICRO SEGUNDOS ;--------------------------------------------------------- LA1: ;D LDI TEMP,0 INC LC ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF CP TEMP,LC BRNE LA2 DEC LC LA2: LDI TEMP,110 ;110 = 50 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) LDI TEMP1,0 DEC RTA CP RTA,TEMP1 BRNE L1X RCALL MUDA_APR LDI TEMP1,50 MOV RTA,TEMP1 LDI TEMP,100 L1X: XD1: DEC TEMP CPI TEMP,0 BRNE XD1 RJMP L1 M0: ;---------------------------------- ;F LDI TEMP,TMAX ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF SUB TEMP,LC BRCC NT ;SE TMAX>LC VAI PARA NT RJMP INICIO ;C=0 (-) - LC>TMAX (REJEITAR DADO - PAUSA INICIAL) ;F' ;----------------------------------- ;G NT: SUB HC,LC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) ROR CSR7 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO ROR CSR6 ROR CSR5 ROR CSR4 ;------------------------------------- ;H LDI TEMP,0 DEC QB ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO CP TEMP,QB BREQ NW2 RJMP L0 ;LE PROXIMO BIT NW2: LDI TEMP,4 ;DESPREZA OS BITS DE 'ANTICODE' 1010 MOV QB,TEMP ACERTA: LSR CSR7 ROR CSR6 ROR CSR5 ROR CSR4 ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DEC QB LDI TEMP,0 CP TEMP,QB BRNE ACERTA SBRC FLAGS,FLAGNL ;BTFSC TESTA SE É A PRIMEIRA OU A SEGUNDA RECEPÇÃO RJMP PULA1 MOV CSR6A,CSR6 MOV CSR5A,CSR5 MOV CSR4A,CSR4 SBR FLAGS,WFLAGNL ;BSF SETA FLAG DE PRIMEIRA RECEPÇÃO RJMP INICIO PULA1: CBR FLAGS,WFLAGNL ;BCF SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA CP CSR6A,CSR6 BREQ ZA1 RJMP RESETAC ZA1: CP CSR5A,CSR5 BREQ ZA2 RJMP RESETAC ZA2: CP CSR4A,CSR4 BREQ ZA3 RJMP RESETAC ;ERRO DE RECEPÇÁO ZA3: RJMP ACAO ;OK - BOA RECEPÇÃO RESETAC: CLR CSR6A CLR CSR5A CLR CSR4A RJMP INICIO ;================================================= DEC_H: CPI XL,0XFF ;ACERTA CONTADOR ALTO BRNE SEGA1 DEC XH SEGA1: RET ;================================================= INC_H: CPI XL,0X00 ;ACERTA CONTADOR ALTO BRNE SEGA2 INC XH SEGA2: RET ;=================================================== ACAO: SBRC FLAGS,FLAGMP RJMP PROGRAMAR_ESTE_TX ;PROGRAMAR O CONTROLE RECEBIDO CLR XL CLR XH MADDRESS: PUSH XH PUSH XL RCALL EEREAD CP TEMP,CSR4 BRNE PROXIMO INC XL RCALL INC_H RCALL EEREAD CP TEMP,CSR5 ;COMPARA COM CSR5 BRNE PROXIMO INC XL RCALL INC_H RCALL EEREAD MOV TEMP1,CSR6 CBR TEMP1,0B11000000 ;APAGA BITS 6 E 7 (BOTÕES) CP TEMP,TEMP1 ;COMPARA COM CSR6 BRNE PROXIMO POP TEMP ;INCREMENTA PILHA PARA EVITAR CRESCIMENTO POP TEMP ; INDEVIDO RJMP ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO: ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA PROCURAR.... POP XL POP XH LDI TEMP,3 ADD XL,TEMP BRCC CHEG_MAX INC XH CHEG_MAX: MOV TEMP,XH SUBI TEMP,1 BRCS MADDRESS MOV TEMP,XL SUBI TEMP,0X2B BRCC POM RJMP MADDRESS ;====================================================================== POM: CLR XL CLR XH ;=====================================a MADDRESS_EXT: PUSH XH ;SALVA PUSH XL RCALL R_I2C CP DATA,CSR4 ;COMPARA COM CSR5 BRNE PROXIMO_EXT INC XL RCALL INC_H RCALL R_I2C CP DATA,CSR5 ;COMPARA COM CSR5 BRNE PROXIMO_EXT INC XL RCALL INC_H RCALL R_I2C MOV TEMP1,CSR6 CBR TEMP1,0B11000000 ;APAGA BITS 6 E 7 (BOTÕES) CP DATA,TEMP1 ;COMPARA COM CSR6 BRNE PROXIMO_EXT POP TEMP ;INCREMENTA PILHA PARA EVITAR CRESCIMENTO POP TEMP ; INDEVIDO RJMP ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO_EXT: ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA PROCURAR.... POP XL POP XH LDI TEMP,3 ADD XL,TEMP BRCC CHEG_MAX_EXT INC XH CHEG_MAX_EXT: MOV TEMP,XH SUBI TEMP,1 BRCS MADDRESS_EXT MOV TEMP,XL SUBI TEMP,0X2B BRCC M_N_ENC ;NÃO ENCONTROU RJMP MADDRESS_EXT M_N_ENC: RJMP INICIO ;NÃO ESTÁ. ACIONAR: ;========================================================================================= ; ROTINA DE ATENDIMENTO ;========================================================================================= RCALL QUAL_MESA ;OBTEM O NUMERO DO TX DA MESA QUE FOI ACIONADO EM 'CONT' SBRC CSR6,CHAMAR ;TESTA SE BOTÃO DE CHAMAR GARÇOM FOI ACIONADO RJMP CHAMANDO_GARCOM SBRC CSR6,CANCELAR ;TESTA SE BOTÃO DE CHAMAR GARÇOM FOI ACIONADO RJMP CANCELAR_GARCOM RJMP INICIO NAO_ACHADO1X: RJMP NAO_ACHADO1 CANCELAR_GARCOM: RCALL APAGAR_MESA_NA_PILHA BRCC NAO_ACHADO1X RCALL GERAR_SOM ;GERA SOM DE ATENDIMENTO CPI XL,0X60 BRNE PR_1 LDI AUX,3 LP1: LDI TEMP,APAGADO ;APAGA STS DIG5,TEMP STS DIG4,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM STS DIG5,CONT ;COLOCA '-' STS DIG4,CONT LDI TEMP,TEMPO_PISCADA RCALL DELAYM DEC AUX CPI AUX,0 BRNE LP1 RJMP SAI_DESLOCANDO PR_1: CPI XL,0X61 BRNE PR_2 LDI AUX,3 LP2: LDI TEMP,APAGADO ;APAGA STS DIG3,TEMP STS DIG2,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM STS DIG3,CONT ;COLOCA '-' STS DIG2,CONT LDI TEMP,TEMPO_PISCADA RCALL DELAYM DEC AUX CPI AUX,0 BRNE LP2 RJMP SAI_DESLOCANDO PR_2: CPI XL,0X62 BRNE PR_3 LDI AUX,3 LP3: LDI TEMP,APAGADO ;APAGA STS DIG1,TEMP STS DIG0,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM STS DIG1,CONT ;COLOCA '-' STS DIG0,CONT LDI TEMP,TEMPO_PISCADA RCALL DELAYM DEC AUX CPI AUX,0 BRNE LP3 RJMP SAI_DESLOCANDO PR_3: ; ACIMA DE 0X62 IRÁ APAGAR E PISCAR DIG0 E 1 COM TRAÇO , RETORNANDO A INFORMAÇÃO ANTERIOR LDS TEMP,DIG0 PUSH TEMP LDS TEMP,DIG1 PUSH TEMP LDI AUX,3 LP4: LDI TEMP,APAGADO ;APAGA STS DIG0,TEMP STS DIG1,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM STS DIG0,CONT ;COLOCA '-' STS DIG1,CONT LDI TEMP,TEMPO_PISCADA RCALL DELAYM DEC AUX CPI AUX,0 BRNE LP4 POP TEMP STS DIG1,TEMP POP TEMP STS DIG0,TEMP SAI_DESLOCANDO: RCALL DESLOCAR_PILHA LDS CONT,0X60 RCALL MOSTRA_EM_DIG5_4 LDS CONT,0X61 RCALL MOSTRA_EM_DIG3_2 LDS CONT,0X62 RCALL MOSTRA_EM_DIG1_0 NAO_ACHADO1: RJMP INICIO PISCA_DIG1_0: LDS CONT,PILHA_INIT ;CARREGA CONTEUDO DA POSIÇÃO INICIAL DA PILHA (DIG1 E 0) RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RET CHAMANDO_GARCOM: RCALL PROCURAR_MESA ;VERIFICA SE JÁ ESTÁ GRAVADO NA PILHA O TX DA MESA RECEBIDO BRCS JA_ESTA_GRAVADO RCALL GRAVAR_NA_PILHA ;SE NÃO FOI GRAVADO,GRAVA NA PILHA O CONTEUDO DE 'CONT' RCALL MOSTRA_MESA ;MOSTRA NO DISPLAY QUAL MESA FEZ O PEDIDO JA_ESTA_GRAVADO: RJMP INICIO QUAL_MESA: RCALL DIVIDE_POR_TRES INC CONT RET MOSTRA_MESA: ; MOSTRA A MESA EM DIG0 E 1 PISCANDO CPI XL,0X60 BRNE PROX_OPM1 RCALL LIGA_DIG5_4 ;MOSTRA RCALL GERAR_SOM ;GERA SOM DE ATENDIMENTO RCALL APAGO_DIG5_4 ;APAGA RCALL LIGA_DIG5_4 RCALL APAGO_DIG5_4 RCALL LIGA_DIG5_4 RCALL APAGO_DIG5_4 RCALL LIGA_DIG5_4 RET PROX_OPM1: CPI XL,0X61 BRNE PROX_OPM2 RCALL LIGA_DIG3_2 RCALL GERAR_SOM ;GERA SOM DE ATENDIMENTO RCALL APAGO_DIG3_2 RCALL LIGA_DIG3_2 RCALL APAGO_DIG3_2 RCALL LIGA_DIG3_2 RCALL APAGO_DIG3_2 RCALL LIGA_DIG3_2 RET PROX_OPM2: CPI XL,0X62 BRNE PROX_OPM3 RCALL LIGA_DIG1_0 ;=> 0X62 RCALL GERAR_SOM ;GERA SOM DE ATENDIMENTO RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RET PROX_OPM3: LDS TEMP,DIG0 PUSH TEMP ;SALVA O 3º DA FILA LDS TEMP,DIG1 PUSH TEMP RCALL LIGA_DIG1_0 ;CONT> 0X62 RCALL GERAR_SOM ;GERA SOM DE ATENDIMENTO RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RCALL APAGO_DIG1_0 RCALL LIGA_DIG1_0 RCALL APAGO_DIG1_0 POP TEMP ;RETORNA O 3º DA FILA STS DIG1,TEMP POP TEMP STS DIG0,TEMP RET LIGA_DIG1_0: ;APRESENTA O CONTEUDO DE 'CONT' NO DISPLAY DIG1 E 0 RCALL MOSTRA_EM_DIG1_0 ;MOSTRA EM DIG0 E DIG1 LDI TEMP,TEMPO_PISCADA RCALL DELAYM RET APAGO_DIG1_0: ;APAGA OS DISPLAY DIG0 E 1 LDI TEMP,APAGADO ;APAGA OS 2 DIGITOS STS DIG0,TEMP STS DIG1,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM RET LIGA_DIG3_2: ;APRESENTA O CONTEUDO DE 'CONT' NO DISPLAY DIG1 E 0 RCALL MOSTRA_EM_DIG3_2 ;MOSTRA EM DIG0 E DIG1 LDI TEMP,TEMPO_PISCADA RCALL DELAYM RET APAGO_DIG3_2: ;APAGA OS DISPLAY DIG0 E 1 LDI TEMP,APAGADO ;APAGA OS 2 DIGITOS STS DIG3,TEMP STS DIG2,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM RET LIGA_DIG5_4: ;APRESENTA O CONTEUDO DE 'CONT' NO DISPLAY DIG1 E 0 RCALL MOSTRA_EM_DIG5_4 ;MOSTRA EM DIG0 E DIG1 LDI TEMP,TEMPO_PISCADA RCALL DELAYM RET APAGO_DIG5_4: ;APAGA OS DISPLAY DIG0 E 1 LDI TEMP,APAGADO ;APAGA OS 2 DIGITOS STS DIG5,TEMP STS DIG4,TEMP LDI TEMP,TEMPO_PISCADA RCALL DELAYM RET MOSTRA_EM_DIG1_0: ;CONTEUDO DE 'TEMP' MOSTRADO EM 7SEG EM DIG0 E DIG1 MOV TEMP, CONT CPI TEMP,TRACO BREQ POEM_DIRETO1 RCALL BCD_TO_DEC ;CONVERTE EM DECIMAL MOV TEMP1,TEMP ;SALVA CONVERÇÃO ANDI TEMP, 0X0F RCALL CONV_7SEG STS DIG0,TEMP ;SALVA MOV TEMP, TEMP1 SWAP TEMP ANDI TEMP, 0X0F RCALL CONV_7SEG STS DIG1,TEMP ;SALVA RET POEM_DIRETO1: STS DIG0,TEMP STS DIG1,TEMP RET MOSTRA_EM_DIG3_2: ;CONTEUDO DE 'TEMP' MOSTRADO EM 7SEG EM DIG0 E DIG1 MOV TEMP, CONT CPI TEMP,TRACO BREQ POEM_DIRETO2 RCALL BCD_TO_DEC ;CONVERTE EM DECIMAL MOV TEMP1,TEMP ;SALVA CONVERÇÃO ANDI TEMP, 0X0F RCALL CONV_7SEG STS DIG2,TEMP ;SALVA MOV TEMP, TEMP1 SWAP TEMP ANDI TEMP, 0X0F RCALL CONV_7SEG STS DIG3,TEMP ;SALVA RET POEM_DIRETO2: STS DIG3,TEMP STS DIG2,TEMP RET MOSTRA_EM_DIG5_4: ;CONTEUDO DE 'TEMP' MOSTRADO EM 7SEG EM DIG0 E DIG1 MOV TEMP, CONT CPI TEMP,TRACO BREQ POEM_DIRETO3 RCALL BCD_TO_DEC ;CONVERTE EM DECIMAL MOV TEMP1,TEMP ;SALVA CONVERÇÃO ANDI TEMP, 0X0F RCALL CONV_7SEG STS DIG4,TEMP ;SALVA MOV TEMP, TEMP1 SWAP TEMP ANDI TEMP, 0X0F RCALL CONV_7SEG STS DIG5,TEMP ;SALVA RET POEM_DIRETO3: STS DIG5,TEMP STS DIG4,TEMP RET ;====================================================================== ; ROTINAS DE ACESSO A PILHA COM O NÚMERO DOS TX'S DAS MESAS ; OBJ: LOCALIZAR NA PILHA SE JÁ FOI GRAVADO O NÚMERO DE MESA RECEBIDO ; SE POSITIVO, SETA O CARRY, SENÃO ZERA O CARRY. ;===================================================================== PROCURAR_MESA: CLR XH LDI XL,PILHA_INIT ;CARREGA COM INICIO DA PILHA VAI_PROCURAR: LD TEMP,X CP CONT,TEMP BREQ ACHOU INC XL CPI XL,PILHA_END ;TESTA SE CHEGOU NO FIM DA PILHA BRNE VAI_PROCURAR CLC ;APAGA CARRY , NÃO ENCONTRADO RET ACHOU: SEC ;SETA CARRY , ENCONTROU RET ;--------------------------------------------------------------------- APAGAR_PILHA_GERAL: ;APAGA A INTEIRA PILHA DE N. DE TX RECEBIDOS DAS MESAS CLR XH LDI XL,PILHA_INIT ;CARREGA COM INICIO DA PILHA APAGA_PROXIMO: LDI TEMP,TRACO ; (-) ST X+,TEMP CPI XL,PILHA_END + 2 BRNE APAGA_PROXIMO RET ;=================================================================== ; COLOQUE EM XL 0X60 OU 0X61 DESLOCAR_PILHA: ;DESLOCAR CONTEUDO DA PILHA UMA POSIÇÃO PARA BAIXO CLR XH INC XL DESLOCA_PROXIMO: LD TEMP,X DEC XL ST X+,TEMP INC XL CPI XL,PILHA_END + 1 BRNE DESLOCA_PROXIMO RET ;====================================================================== GRAVAR_NA_PILHA: ;PROCURA POSIÇÃO SUPERIOR LIVRE E GRAVA O CONTEUDO DE 'CONT' CLR XH LDI XL,PILHA_INIT ;CARREGA COM INICIO DA PILHA TENTA_PROXIMO: LD TEMP,X CPI TEMP,TRACO BREQ LIVRE CPI XL,PILHA_END BREQ CHEIA INC XL RJMP TENTA_PROXIMO RET LIVRE: ST X,CONT ;GRAVA N. NA PILHA SEC RET CHEIA: CLC RET ;======================================================================= ;APAGA O NUMERO CONTIDO EM 'CONT' NA PILHA E RETORNA (-) TRAÇO ; SE NÃO ACHOU O NÚMERO, APAGA CARRY. APAGAR_MESA_NA_PILHA: RCALL PROCURAR_MESA ;BUSCA O NUMERO NA PILHA BRCC NAO_ACHOU_NUM LDI CONT,TRACO ;RETORNA UM (-) TRAÇO EM 'CONT' SEC RET NAO_ACHOU_NUM: CLC RET ;=============================================================== ;DIVIDE VALOR DOS REG XH/XL PARA SABER O NUMERO DO TX DA MESA EM 'CONT' DIVIDE_POR_TRES: CLR CONT PROSG1: SUBI XL,3 BRCC SEG70 SUBI XH,1 BRCS SEG71 SEG70: INC CONT ;RETORNA EM CONT EM 'HEXADECIMAL' RJMP PROSG1 SEG71: RET ;============================================================== ;MULTIPLICA VALOR DO TX DA MESA POR 3 PARA OBTER ENDEREÇO ;COLOQUE EM 'CONT' O VALOR A SER MULTIPLICADO E O RESULTADO EM XL/XH MULTIPLICA_POR_TRES: CLR XL CLR XH MOV TEMP,CONT CPI TEMP,0 BREQ SEG73 PROSG2: LDI TEMP,3 ADD XL,TEMP BRCC SEG72 LDI TEMP,1 ADD XH,TEMP BRCS SEG73 SEG72: DEC CONT MOV TEMP,CONT CPI TEMP,0 BREQ SEG73 RJMP PROSG2 SEG73: RET ;==================================================================================== ; MULTIPLEXAÇÃO DOS DISPLAYS ;==================================================================================== ;APRESENTA NOS DISPLAYS DE A0 A A5 OS VALORES DE DIG0 A DIG5 ;DEVERÁ SER CHAMADA, NO MÁXIMO A CADA 5 MS. MPLEX: MUDA_APR: ;======================================================== ;DESLIGA TODOS OS ANODOS PUSH TEMP ;SALVA NA PILHA PUSH TEMP1 ;IDEM IN TEMP,PORTB ANDI TEMP,0B11111011 ;APAGA ANODO 'A4' EM B2 PINO 16 OUT PORTB,TEMP LDI TEMP,0 OUT PORTC,TEMP ;DESLIGA ANODOS 'A0 A A3' LDI TEMP,0 OUT PORTD,TEMP ;APAGA 7 SEG E ANODO 'A5' ;======================================================= INC MPX ;INCREMENTA MPX CPI MPX,6 ;COMPARA: JÁ CHEGOU A 6? BRNE SEGX0A LDI MPX,0 ;ZERA MPX SEGX0A: ANDI MPX,0B00000111 ;LIMITA CONTAGEM ATÉ 7 CPI MPX,0X00 ;COMPARA SE É ZERO BRNE SEGX1A ;SE IGUAL ,VAI PARA LIGA ANODO 1 ;============================================================= ;CARREGA VALOR A SER APRESENTADO NOS SEGUIMENTOS LDS TEMP,DIG0 ANDI TEMP,0B01111111 ;APAGA B7 (QUE É O ANODO 'A5') .IFDEF INVERTE_SEGUIMENTOS LDI TEMP1,0B01111111 EOR TEMP,TEMP1 .ENDIF OUT PORTD,TEMP ;============================================================== ;LIGA O ANODO 'A0' PINO 23 LDI TEMP,1 ;SETA PC,0 OUT PORTC,TEMP ;LIGA ANODO DO DISPLAY 'A0' (PC0- PINO 23) RJMP RET_ SEGX1A: CPI MPX,0X01 BRNE SEGX2A ;SE IGUAL ,VAI PARA LIGA ANODO 2 ;============================================================= ;CARREGA VALOR A SER APRESENTADO NOS SEGUIMENTOS LDS TEMP,DIG1 ANDI TEMP,0B01111111 ;APAGA B7 (QUE É O ANODO 'A5') .IFDEF INVERTE_SEGUIMENTOS LDI TEMP1,0B01111111 EOR TEMP,TEMP1 .ENDIF OUT PORTD,TEMP ;============================================================== LDI TEMP,2 ;SETA PC,1 OUT PORTC,TEMP ;LIGA ANODO DO DISPLAY 'A1' (PC1 - PINO 24) RJMP RET_ SEGX2A: CPI MPX,0X02 BRNE SEGX3A ;SE IGUAL ,VAI PARA LIGA ANODO 3 ;============================================================= ;CARREGA VALOR A SER APRESENTADO NOS SEGUIMENTOS LDS TEMP,DIG2 ANDI TEMP,0B01111111 ;APAGA B7 (QUE É O ANODO 'A5') .IFDEF INVERTE_SEGUIMENTOS LDI TEMP1,0B01111111 EOR TEMP,TEMP1 .ENDIF OUT PORTD,TEMP ;============================================================== LDI TEMP,4 ;SETA PC,2 OUT PORTC,TEMP ;PARA LIGAR ANODO DO DISPLAY 'A2'(PC2 - PINO 25) RJMP RET_ SEGX3A: CPI MPX,0X03 BRNE SEGX4A ;SE IGUAL ,VAI PARA LIGA ANODO 4 ;============================================================= ;CARREGA VALOR A SER APRESENTADO NOS SEGUIMENTOS LDS TEMP,DIG3 ANDI TEMP,0B01111111 ;APAGA B7 (QUE É O ANODO 'A5') .IFDEF INVERTE_SEGUIMENTOS LDI TEMP1,0B01111111 EOR TEMP,TEMP1 .ENDIF OUT PORTD,TEMP ;============================================================== LDI TEMP,8 ;SETA PC,3 OUT PORTC,TEMP ;LIGA ANODO DO DISPLAY 'A3' (PC3 - PINO 26) RJMP RET_ SEGX4A: CPI MPX,0X04 BRNE SEGX5A ;SE IGUAL ,VAI PARA LIGA ANODO 1 ;============================================================= ;CARREGA VALOR A SER APRESENTADO NOS SEGUIMENTOS LDS TEMP,DIG4 ANDI TEMP,0B01111111 ;APAGA B7 (QUE É O ANODO 'A5') .IFDEF INVERTE_SEGUIMENTOS LDI TEMP1,0B01111111 EOR TEMP,TEMP1 .ENDIF OUT PORTD,TEMP ;============================================================== IN TEMP,PORTB ;LIGA ANODO 'A4' (PB2 - PINO 16) ORI TEMP,0B00000100 OUT PORTB,TEMP RJMP RET_ SEGX5A: CPI MPX,0X05 BRNE SEGX6A ;SE IGUAL ,VAI PARA LIGA ANODO 1 ;============================================================= ;CARREGA VALOR A SER APRESENTADO NOS SEGUIMENTOS LDS TEMP,DIG5 ANDI TEMP,0B01111111 ;APAGA B7 (QUE É O ANODO 'A5') .IFDEF INVERTE_SEGUIMENTOS LDI TEMP1,0B01111111 EOR TEMP,TEMP1 .ENDIF OUT PORTD,TEMP ;============================================================== IN TEMP,PORTD ORI TEMP,0X80 ;LIGA ANODO 'A5' (PD7 - PINO 13) OUT PORTD,TEMP ;ENVIA PARA A PORTA D (CATODOS) RJMP RET_ SEGX6A: LDI MPX,0 ;QUALQUER VALOR DIFERENTE RJMP SEGX0A RET_: POP TEMP1 ;RECUPERA VALORES SALVOS NA PILHA POP TEMP RET ;========================================================================= ; ROTINAS DE DELAY COM MULTIPLEXAÇÃO EMBUTIDA ;========================================================================== DELAYM: MOV TEMP2,TEMP XC: RCALL AGUARDE DEC TEMP2 CPI TEMP2,0 BRNE XC RET AGUARDE: ;ROTINA DE ATRASO LDI TEMP1,255 CG2: LDI TEMP,255 XB4: DEC TEMP CPI TEMP,0 BRNE XB4 RCALL MPLEX ;REALIZA MULTIPLEXAÇÃO DEC TEMP1 CPI TEMP1,0 BRNE CG2 RET ;====================================================================== ; ROTINAS PARA EEPROM INTERNA ;====================================================================== EEWRITE: ; ******* EEPROM WRITE ENABLE ****************** ;endereço esta em XL E XH ;DADOS A ESCREVER ESTA EM TEMP ; Wait for completion of previous write sbic EECR,EEWE rjmp EEWRITE ; Set up address (r18:r17) in address register out EEARH, XH out EEARL, XL ; Write data (r16) to data register out EEDR,TEMP ; Write logical one to EEMWE sbi EECR,EEMWE ; Start eeprom write by setting EEWE sbi EECR,EEWE ret ESPERA1: ;DELAY ENTRE APAGAMENTOS RCALL AGUARDE RET EEREAD: ;endereço esta NO PONTEIRO X ;DADOS LIDOS SERÃO ESCRITOS EM TEMP ; Wait for completion of previous write sbic EECR,EEWE rjmp EEREAD ; Set up address in address register out EEARH, XH out EEARL, XL ; Start eeprom read by writing EERE sbi EECR,EERE ; Read data from data register in TEMP,EEDR ret ;------------------------------------------------------------------------------ APAGAEEPROM: ; ROTINA PARA APAGAR TODAS AS POSIÇOES DOS CONTROLES NA EEPROM INTERNA DO ATMEGA8 LDI XH,1 RET7Y: LDI XL,0XFF ;TOTAL DE 128 + 1 BYTES DE EEPROM RET6Y: LDI TEMP,0XFF RCALL EEWRITE DEC XL CPI XL,0XFF BRNE RET6Y DEC XH CPI XH,0XFF BRNE RET7Y RET ;=============================================================================== ;ROTINAS I2C (TWO WIRE) PARA MEMÓRIA EEPROM EXTERNA ;=============================================================================== W_I2C: RCALL I2C_START RCALL I2C_DEVICE_W MOV TEMP,XL ;ENVIA ENDEREÇO EM XL RCALL I2C_ADDRESS RCALL I2C_DATA ;ENVIA DADO PARA O ENDEREÇO RCALL I2C_STOP RCALL DELAY_GR ;TEMPO DE 10 MSEG ENTRE GRAVAÇÃO 24C08 RET R_I2C: ;ROTINA DE LEITURA DE EEPROM EXTERNA I2C - ADDRESS=ENDEREÇO DATA=DADO LIDO RCALL I2C_START RCALL I2C_DEVICE_W MOV TEMP,XL ;ENVIA ENDEREÇO EM XL RCALL I2C_ADDRESS RCALL I2C_START RCALL I2C_DEVICE_R RCALL I2C_RECEBE ;RECEBE DADO RCALL I2C_STOP RCALL MPLEX ;INCLUIDO PARA EVITAR PISCAR DISPLAY RET TST_TWINT: ;TESTA SE TWINT JÁ É =1 WAIT1: IN TEMP,TWCR SBRS TEMP,TWINT RJMP WAIT1 RET I2C_RECEBE: ;RETORNA EM 'DADO' O BYTE LIDO' LDI TEMP,(1< 7 ANDI XL,0xf0 ; RESULTADO LOW >7 SOMA 3 SBRC RES0,7 ; TESTA SE RESULTADO É > 7 ANDI XL,0x0f ; MAIOR QUE 7 ENTÃO OK SUB RES0,XL ; RESULTADO <= 7 RETORNA RETORNA VALOR ANTERIOR LSL TEMP ; DESLOCA ROL RES0 DEC CONT ; CONVERSÃO CHEGOU AO FIM? CPI CONT,0 BRNE VRP1X MOV TEMP,RES0 ;RETORNA EM 'TEMP' O NÚMERO CONVERTIDO POP XL POP XH POP CONT RET ; RETORNA COM EXITO ;====================================================================== ;CONVERTE DECIMAL/HEXA EM 7 SEGUIMENTOS CONV_7SEG: LDI ZH, high(TAB_NUM * 2) ; Initialize Z pointer LDI ZL, low(TAB_NUM * 2) ANDI TEMP,0X0F ;LIMITA A 15 ADD ZL,TEMP BRCC SEGJA1 INC ZH SEGJA1: LPM TEMP, Z RET ;======================================================================================= ; ROTINA GERADORA DE SOM ;======================================================================================= GERAR_SOM: ;GERA SOM DE CAMPAINHA COM 3 NOTAS DIFERENTES SEGUIDAS LDI TEMP,63 ;FREQUENCIA DA 1ºNOTA STS AUX1,TEMP LDI TEMP,0X7F ;0xff STS AUX2,TEMP RCALL G_FREQ LDI TEMP,77 ;FREQUENCIA DA 2ºNOTA STS AUX1,TEMP LDI TEMP,0X7F ;0xff STS AUX2,TEMP RCALL G_FREQ LDI TEMP,91 ;FREQUENCIA DA 3ºNOTA STS AUX1,TEMP LDI TEMP,0X7F ;0xff STS AUX2,TEMP RCALL G_FREQ RET G_FREQ: LDS TEMP,AUX1 STS AUX3,TEMP RECNOTA: RCALL MPLEX LDS TEMP,AUX3 STS AUX1,TEMP IN TEMP,PORTB ORI TEMP,0B00100000 ;SETA SAIDA DE SOM PINO 19 PB5 OUT PORTB,TEMP C3F: LDI TEMP,20 ;20 JÓIA LLOP1: DEC TEMP CPI TEMP,0 BRNE LLOP1 LDS TEMP,AUX1 DEC TEMP STS AUX1,TEMP CPI TEMP,0 BRNE C3F IN TEMP,PORTB ANDI TEMP,0B11011111 ;ZERA SAIDA DE SOM PINO 19 PB5 OUT PORTB,TEMP LDS TEMP,AUX3 STS AUX1,TEMP C3A: LDI TEMP,20 ;20 JÓIA LLOP2: DEC TEMP CPI TEMP,0 BRNE LLOP2 LDS TEMP,AUX1 DEC TEMP STS AUX1,TEMP CPI TEMP,0 BRNE C3A LDS TEMP,AUX2 DEC TEMP STS AUX2,TEMP CPI TEMP,0 BRNE RECNOTA RET ;========================================================================================== ;TABELA USADA NA CONVERÇÃO DE HEXA OU DECIMAL PARA 7 SEGUIMENTOS TAB_NUM: ;0 A 9 ,A,B,C,D,E,F -> NA ORDEM : PGFEDCBA .db 0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E ;======================FIM=================================================================