;Antes de usar, renomeie este arquivo para terminação '.asm'. *************************************************************************************************** * USANDO CI DS 1302 PARA OBTER RELOGIO (VIA LCD) * * MICROCONTROLADOR MC68HC908QY4 * * PROJETO : 06-11-2011 * CLAUDIO LÁRIOS FINALIZADO EM 09/11/2011 * ------------------------------------------------------------------------------------------------------ * * * USE: * LCD module (2x16 display, 4-bit interface) * * USE: * PB4-PB7 = DB4-DB7 * * PB1 = RS (register select) * * PB2 = RW (Read ! Write) * * PB3 = E_LCD (enable) * * * ********************************************************************* $base 10T ;Base Decimal como default\par $include "C:\pemicro\pkg08sz\Mreg\qtqy_registers.inc" * -------------------------------------------------------------------------------------- * EQUATES PARA DS 1302: RSEG EQU %10000001 ;LER SEGUNDOS WSEG EQU %10000000 ;ESCREVER SEGUNDOS RMIN EQU %10000011 ;LER MINUTOS WMIN EQU %10000010 ;ESCREVER MINUTOS RHORA EQU %10000101 ;LER HORA WHORA EQU %10000100 ;ESCREVER HORA RDATA EQU %10000111 ;LER DATA WDATA EQU %10000110 ;ESCREVER DATA RMES EQU %10001001 ;LER MES WMES EQU %10001000 ;ESCREVER MES RDSEM EQU %10001011 ;LER DIA DA SEMANA WDSEM EQU %10001010 ;ESCREVER DIA DA SEMANA RANO EQU %10001101 ;LER ANO WANO EQU %10001100 ;ESCREVER ANO RCONTR EQU %10001111 ;LER CONTROLE WCONTR EQU %10001110 ;ESCREVER CONTROLE R8BYTE EQU %10111111 ;LER 8 BYTES EM MODO BURST W8BYTE EQU %10111110 ;ESCREVER 8 BYTES EM MODO BURST LIGARTC EQU %00000000 ;LIGAR RELOGIO * EQUATES: RAMSPACE EQU $80 FLASHSPACE EQU $EE00 BUSFREQ EQU 4 USCOUNT EQU $0E USDELAY EQU BUSFREQ*USCOUNT ; Miscellaneous equates DELAYVAL EQU $50 ;Default value for delays PRESCALER2 EQU %00000010 ;Prescaler bits determine timer freq. PRESCALER EQU %00000000 ;Prescaler bits determine timer freq. ; ASCII character definitions SPACE EQU $20 ;ASCII space EOT EQU $04 ;ASCII end-of-text CR EQU $0D ;ASCII carriage return LF EQU $0A ;ASCII linefeed LINHA1 EQU $80 ;LINHA N.1 LINHA2 EQU $C0 ;LINHA N.2 TABLEEND EQU $FF ;LCD Control lines, E = enable, RS = Register Select (Data vs. Instruction) ;R/W = Read ! Write; Referidas a los pines del PORT B RS EQU 1 RW EQU 2 E_LCD EQU 3 ;USE PTA PARA O ABAIXO: RST EQU 4 ;RESET DO DS 1302 PINO 5 LIGADO AO PINO 5 DO HC908 PTA4 IO EQU 0 ;IN/OUT DO DS 1302 PINO 6 LIGADO AO PINO 15 DO HC908 PTB0 CLK EQU 1 ;CLOCK DO DS 1302 PINO 7 LIGADO AO PINO 12 DO HC908 PTA1 ADJ EQU 2 ;ACERTAR RELOGIO PINO 9 DO HC908 PTA2 IADJ EQU 5 ;INCREMENTA CONTADORES PINO 4 DO HC908 PTA5 MAXCHARS EQU $10 ;Maxima cantidad de caracteres por linea del LCD MAXLINE EQU $10 ;$08 TOFMAXCOUNT EQU 2 ;Changed for monitor mode debugging (/2) ;TOFMAXCOUNT EQU 1 PAG EQU $3F ;COLOQUE AQUI A PAGINA A SER USADA COMO EEPROM 64 BYTES (USE DE PREFERENCIA A ULTIMA 0-3F) FADDR EQU {FLASHSPACE+(PAG*$0040)} ; ENDEREÇO DA PAGINA A SER USADA COMO EEPROM * ------------------------------------------------------------------- * RAM variables * ------------------------------------------------------------------- ORG RAMSPACE ;Start of RAM LC RMB 1 ;LOOP COUNTER C0 RMB 1 ;REGISTRADO LOW DO DADO A SER CONVERTIDO DE BCD PARA DECIMAL C1 RMB 1 ;REGISTRADO HIGH DO DADO A SER CONVERTIDO DE BCD PARA DECIMAL RES0 RMB 1 ;REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (UNIDADE) RES1 RMB 1 ;REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (DEZENA) RES2 RMB 1 ;REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (CENTENA) RAU RMB 1 ;AUXILIAR (USO DO CONVERSOR BCD_TO_DEC FLAG RMB 1 ;FLAGS CONT RMB 1 ;CONTADOR CONT1 RMB 1 ;CONTADOR CONT2 RMB 1 ;CONTADOR CONT3 RMB 1 ;CONTADOR CDADO RMB 7 ;INICIO DOS 7 BYTES DE COPIA DE DADOS PARA AJUSTE DO RELOGIO DADOS RMB 7 ;IDEM TEMP RMB 1 ;TEMPORARIO Counter RMB 1 ;CONTADOR PARA DELAY TempVar RMB 1 ;TEMPORARIO 1 BITE TempWord RMB 2 ;TEMPORARIO 2BYTES Count RMB 1 ;CONTADOR DE VARIAVÉIS MsgIndex RMB 2 ;INDEX DO CONTADOR DE VARIAVÉIS MsgStart RMB 2 ;Stores starting point of string TOFCount RMB 1 ; AUX EventCount RMB 1 ;AUX TempPtr RMB 2 ;AUX TIME RMB 8 ;RELOGIO DS 1302 REGISTRADORES LIMITE RMB 1 ;VALOR MAX DE CONTAGEM * ------------------------------------------------------------------- ORG FLASHSPACE ;Start of FLASH memory Start: MOV #$0B,CONFIG1 ;Set LVI5OR3 and COPD, enable STOP MOV #$01,CONFIG2 ;Select bus as SCI clock source, com pino 'reset' ligado NOP NOP CLR PORTA CLR PORTB CLR C0 CLR C1 ;MOV #$FF,PTAPUE ;PORT A PULLUP ENABLE REGISTER MOV #$FF,DDRB ;Setup PB1-PB6 as outputs for LCD E PB0(IO) PARA DS1302 MOV #%00010010,DDRA ;Setup PTA1(CLK) E PTA4(RST) as outputs for DS1302 CLR EventCount BCLR RS,PORTB ;Preset control line output levels BCLR RW,PORTB BCLR E_LCD,PORTB JSR LCDInit ;Initialize LCD JSR LCDClear ;LIMPA TELA JSR EN_WRITE ;HABILITA ESCRITA NO DS1302 JSR LIGA_DS1302 ;RETIRA DO BAIXO CONSUMO JSR DEN_WRITE ;BLOQUEIA ESCRITA NO DS1302 MAIN: BRCLR ADJ,PTA,AJUSTARTC1 ;VERIFICA SE OCORRE UM ACERTO DE HORAS/DATA VAJRTC: BCLR CLK,PTA ;RESETA CLOCK BSET RST,PTA ;SETA RESET LDA #R8BYTE ;CARREGA COMANDO JSR ENV_COM BRA PEGABYTES1 AJUSTARTC1: JMP AJUSTARTC PEGABYTES1: BCLR DDRB0,DDRB ;TORNA IO (PTA0)COMO ENTRADA(0) LDHX #DADOS ;APONTA PARA INICIO DA RAM A ARMAZENAR MOV #$7,CONT1 ;CARGA DO CONTADOR DE BYTES RECEBIDOS RT: MOV #$8,CONT ;COLOCA 8D NO CONTADOR DE BITS RECEBIDOS DNV1: BRSET IO,PTB,CA1 CLC ;ZERA CARRY SEG1: RORA JSR PULSO ;PULSA O CLOCK DBNZ CONT,DNV1 STA TEMP MOV TEMP,X+ DBNZ CONT1,RT BCLR RST,PTA ;RESETA DS1302 BCLR IO,PTB ;RESETA IO BRA MOSTRA CA1: SEC ;SETA CARRY BRA SEG1 MOSTRAL: ;APRESENTA EM UMA LINHA OS 7 REG(2 CARAC.) EM SEQUENCIA JSR LCDClear ;LIMPA LCD E CURSOR HOME MOV #$7,CONT1 ;CARGA DO CONTADOR DE BYTES RECEBIDOS LDHX #DADOS ;APONTA PARA INICIO DA RAM A ARMAZENAR VV4: LDA ,X AIX #1 JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX DBNZ CONT1,VV4 LDA #$FF ;DELAY JSR msDelay LDA #$FF JSR msDelay JMP MAIN ;REINICIA LEITURA *--------------------------------------------------------------- ;APRESENTA NO LCD NA FORMA NORMAL E BEM APRESENTAVEL @#@ MOSTRA: JSR LCDClear ;LIMPA LCD E CURSOR HOME LDHX #ESPAÇOS JSR FRASE LDA DADOS+2 ;PEGA HORAS JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX LDA #":" ;MOSTRA 2 PONTOS JSR LCDData ;MOSTRA NO LCD EM 1 DIGITOS LDA DADOS+1 ;PEGA MINUTOS JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX LDA #":" ;MOSTRA 2 PONTOS JSR LCDData ;MOSTRA NO LCD EM 1 DIGITOS LDA DADOS ;PEGA SEGUNDOS JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX LDA #$C0 ;VAI PARA 2º LINHA JSR LCDCtrl LDA #" " ;MOSTRA ESPAÇO JSR LCDData ;MOSTRA NO LCD EM 1 DIGITOS LDA DADOS+5 ;PEGA DIA DA SEMANA JSR M_DIASM ;CONVERTE EM FRASE E ENVIA PARA LCD LDA DADOS+3 ;PEGA DATA JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX LDA #"/" ;MOSTRA BARRA JSR LCDData ;MOSTRA NO LCD EM 1 DIGITOS LDA DADOS+4 ;PEGA MES JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX LDHX #M_20 ;MOSTRA '/20' JSR FRASE ;MOSTRA NO LCD EM 1 DIGITOS LDA DADOS+6 ;PEGA FINAL DO ANO JSR M_REG ;MOSTRA NO LCD EM 2 DIGITOS CONTEUDO DO REG APONTADO POR HX LDA #$FF JSR msDelay JMP MAIN ;REINICIA LEITURA *------------------------------------------------------------------------ ; ROTINA PARA CONVERTER NUMERO DE 0 - 6 PREVIAMENTE CARREGADO NO 'ACC' EM DOM...SAB E ENVIAR P/ DISPLAY M_DIASM: CMP #0 BEQ DDOM1 CMP #1 BEQ DSEG1 CMP #2 BEQ DTER1 CMP #3 BEQ DQUA1 CMP #4 BEQ DQUI1 CMP #5 BEQ DSEX1 JMP DSAB1 DDOM1: LDHX #DIAS_DOM JSR FRASE RTS DSEG1: LDHX #DIAS_SEG JSR FRASE RTS DTER1: LDHX #DIAS_TER JSR FRASE RTS DQUA1: LDHX #DIAS_QUA JSR FRASE RTS DQUI1: LDHX #DIAS_QUI JSR FRASE RTS DSEX1: LDHX #DIAS_SEX JSR FRASE RTS DSAB1: LDHX #DIAS_SAB JSR FRASE RTS ;------------------------------------------------------------ ;PULSO PARA ENVIO DE CLOCK DO DS1302 PULSO: BSET CLK,PTA NOP BCLR CLK,PTA RTS ;-------------------------------------------------------- ;SUB ROTINA APÓS COMANDO DE LEITURA -LE REGISTRADOR E COLOCA RESULTADO EM 'ACC' LE_REG: MOV #$8,CONT ;COLOCA 8D NO CONTADOR DE BITS RECEBIDOS DNV1A: BRSET IO,PTB,CA1A CLC ;ZERA CARRY SEG1A: RORA JSR PULSO ;PULSA O CLOCK DBNZ CONT,DNV1A RTS CA1A: SEC ;SETA CARRY BRA SEG1A ;--------------------------------------------------- ;ENVIA COMANDO PARA DS1302 previamente carregado em 'acc' ENV_COM: BCLR CLK,PTA ;ZERA CLOCK BSET DDRB0,DDRB ;TORNA IO (PTA0)COMO SAIDA(1) MOV #$8,CONT ;COLOCA 8D NO CONTADOR DNV: LSRA BCS SETAIO BCLR IO,PTB CC: JSR PULSO DBNZ CONT,DNV RTS SETAIO: BSET IO,PTB BRA CC ;----------------------------------------------------- ;ROTINA DE AJUSTE DE HORAS/CALENDARIO AJUSTARTC: XC: LDA #$20 JSR msDelay BRCLR 2,PTA,XC ;AGUARDA SOLTA A CHAVE DE AJUSTE LDA #$20 JSR msDelay MOV DADOS,CDADO ;SEG MOV DADOS+1,CDADO+1 ;MIN MOV DADOS+2,CDADO+2 ;HORA MOV DADOS+3,CDADO+3 ;DIA DO MES MOV DADOS+4,CDADO+4 ;MES MOV DADOS+5,CDADO+5 ;DIA DA SEMANA MOV DADOS+6,CDADO+6 ;ANO VG2: JSR LCDClear ;LIMPA LCD E CURSOR HOME LDHX #AJUSTAR_HORA ;CARGA DE ENDEREÇO DA FRASE 'AJUSTE HORA' JSR FRASE ;ROTINA PARA MOSTRAR FRASE NO LCD LDA CDADO+2 ;MOSTRA CONTEUDO DE HORAS JSR M_REG ;MOSTRA NO DISPLAY EM 2 DIGITOS LDA #$FF JSR msDelay BRCLR IADJ,PTA,AJH1 ;TESTA CHAVE DE INCREMENTO LDA #$FF ;DELAY JSR msDelay BRCLR ADJ,PTA,AJUSTEMIN ;TESTA CHAVE DE AJUSTE ,AGUARDA SER LIGADA BRA VG2 AJH1: MOV #$24,LIMITE ; 24 HORAS LDA CDADO+2 ;REGISTRADOR DE HORAS JSR INCR_REG STA CDADO+2 ;RETORNA INCREMENTO C/ AJUSTE DECIMAL E LIMITE MAX. BRA VG2 ;VOLTA A FAZER NOVA VARREDURA AJUSTEMIN: VG3: JSR LCDClear ;LIMPA DISPLAY LDHX #AJUSTAR_MIN ;CARGA DE ENDEREÇO DA FRASE 'AJUSTE MIN' JSR FRASE ;ROTINA PARA MOSTRAR FRASE NO LCD LDA CDADO+1 ;MOSTRA CONTEUDO DE MINUTOS JSR M_REG ;MOSTRA NO DISPLAY EM 2 DIGITOS LDA #$FF JSR msDelay BRCLR IADJ,PTA,AJM2 ;TESTA CHAVE DE INCREMENTO LDA #$FF ;DELAY JSR msDelay BRCLR ADJ,PTA,AJUSTEDATE ;TESTA CHAVE DE AJUSTE ,AGUARDA SER LIGADA BRA VG3 AJM2: MOV #$60,LIMITE ; 59 MIN LDA CDADO+1 ;REGISTRADOR DE HORAS JSR INCR_REG STA CDADO+1 ;RETORNA INCREMENTO C/ AJUSTE DECIMAL E LIMITE MAX. BRA VG3 ;VOLTA A FAZER NOVA VARREDURA AJUSTEDATE: VG4: JSR LCDClear ;LIMPA DISPLAY LDHX #AJUSTAR_DATA ;CARGA DE ENDEREÇO DA FRASE 'AJUSTE DATA' JSR FRASE ;ROTINA PARA MOSTRAR FRASE NO LCD LDA CDADO+3 ;MOSTRA CONTEUDO DE DATA JSR M_REG ;MOSTRA NO DISPLAY EM 2 DIGITOS LDA #$FF JSR msDelay BRCLR IADJ,PTA,AJD3 ;TESTA CHAVE DE INCREMENTO LDA #$FF ;DELAY JSR msDelay BRCLR ADJ,PTA,AJUSTEMES ;TESTA CHAVE DE AJUSTE ,AGUARDA SER LIGADA BRA VG4 AJD3: MOV #$32,LIMITE ; 31 DIAS LDA CDADO+3 ;REGISTRADOR DE HORAS JSR INCR_REG STA CDADO+3 ;RETORNA INCREMENTO C/ AJUSTE DECIMAL E LIMITE MAX. BRA VG4 ;VOLTA A FAZER NOVA VARREDURA AJUSTEMES: VG5: JSR LCDClear ;LIMPA DISPLAY LDHX #AJUSTAR_MES ;CARGA DE ENDEREÇO DA FRASE 'AJUSTE MES' JSR FRASE ;ROTINA PARA MOSTRAR FRASE NO LCD LDA CDADO+4 ;MOSTRA CONTEUDO DE MES JSR M_REG ;MOSTRA NO DISPLAY EM 2 DIGITOS LDA #$FF JSR msDelay BRCLR IADJ,PTA,AJMS4 ;TESTA CHAVE DE INCREMENTO LDA #$FF ;DELAY JSR msDelay BRCLR ADJ,PTA,AJUSTEDS ;TESTA CHAVE DE AJUSTE ,AGUARDA SER LIGADA BRA VG5 AJMS4: MOV #$13,LIMITE ; 12 MESES LDA CDADO+4 ;REGISTRADOR DE HORAS JSR INCR_REG STA CDADO+4 ;RETORNA INCREMENTO C/ AJUSTE DECIMAL E LIMITE MAX. BRA VG5 ;VOLTA A FAZER NOVA VARREDURA AJUSTEDS: VG6: JSR LCDClear ;LIMPA DISPLAY LDHX #AJUSTAR_DS ;CARGA DE ENDEREÇO DA FRASE 'AJUSTE DSEM ' JSR FRASE ;ROTINA PARA MOSTRAR FRASE NO LCD LDA CDADO+5 ;MOSTRA CONTEUDO DE DIA DA SEMANA JSR M_DIASM ;MOSTRA NO DISPLAY EM 3 DIGITOS LDA #$FF JSR msDelay BRCLR IADJ,PTA,AJS5 ;TESTA CHAVE DE INCREMENTO LDA #$FF ;DELAY JSR msDelay BRCLR ADJ,PTA,AJUSTEANO ;TESTA CHAVE DE AJUSTE ,AGUARDA SER LIGADA BRA VG6 AJS5: MOV #$8,LIMITE ; 7 DIAS LDA CDADO+5 ;REGISTRADOR DE HORAS JSR INCR_REG STA CDADO+5 ;RETORNA INCREMENTO C/ AJUSTE DECIMAL E LIMITE MAX. BRA VG6 ;VOLTA A FAZER NOVA VARREDURA AJUSTEANO: VG7: JSR LCDClear ;LIMPA DISPLAY LDHX #AJUSTAR_ANO ;CARGA DE ENDEREÇO DA FRASE 'AJUSTE DE HORAS' JSR FRASE ;ROTINA PARA MOSTRAR FRASE NO LCD LDA CDADO+6 ;MOSTRA CONTEUDO DE DIA DA SEMANA JSR M_REG ;MOSTRA NO DISPLAY EM 2 DIGITOS LDA #$FF JSR msDelay BRCLR IADJ,PTA,AJN6 ;TESTA CHAVE DE INCREMENTO LDA #$FF ;DELAY JSR msDelay BRCLR ADJ,PTA,GRAVAAJ ;TESTA CHAVE DE AJUSTE ,AGUARDA SER LIGADA BRA VG7 AJN6: LDA CDADO+6 ;REGISTRADOR DE HORAS INCA ;INCREMENTA 'ACC' DAA ;FAZ AJUSTE DECIMAL STA CDADO+6 ;RETORNA INCREMENTO C/ AJUSTE DECIMAL E LIMITE MAX. BRA VG7 ;VOLTA A FAZER NOVA VARREDURA GRAVAAJ: JSR EN_WRITE ;HABILITA ESCRITA NO DS1302 LDHX #CDADO ;CARREGA ENDEREÇO DOS REGISTRADORES A SEREM GRAVADOS NO DS1302 MOV #$8,CONT1 ;CARGA DO NUMERO DE BYTES ENVIADOS BCLR CLK,PTA ;RESETA CLOCK BSET RST,PTA ;SETA RESET LDA #W8BYTE ;CARREGA COMANDO ESCREVER BYTES RET9: JSR ENV_COM ;ENVIA PARA O DS1302 LDA ,X ;PEGA NOVO REGISTRADOR AIX #1 ;INCREMENTA PONTEIRO DBNZ CONT1,RET9 ; SE ZERO, ENCERRA LDA #$80 ;ENVIA 'CONTROL' =80 BLOQUEAR (NECESSÁRIO ENVIAR TODOS 8 BYTES P GRAVAR) JSR ENV_COM ;ENVIA PARA O DS1302 BCLR RST,PTA ;RESETA RESET JMP VAJRTC ;RETORNA AO PROGRAMA PRINCIPAL *-------------------------------------------------------------------------- * FUNÇÃO: INCREMENTAR REGISTRADOR SEG,MIN,HORAS,DATA,DIA,MES(EXCETO:ANO QUE NÃO DA LIMITE) *-------------------------------------------------------------------------- ;CARREGAR 'ACC' COM REGISTRADOR A INCREMENTAR E 'LIMITE' COM CONTAGEM MAX. INCR_REG: INCA ;INCREMENTA 'ACC' DAA ;FAZ AJUSTE DECIMAL CMP LIMITE ;LIMITA A CONTAGEM MAXIMA BEQ ZERAR ;COMPARA RTS ;DIFERENTE ,RETORNA VALOR INCREMENTADO ZERAR: LDA #$0 ;ZERA E RETORNA CONTAGEM RTS * ------------------------------------------------------------------------------ * LCD INITIALIZATION * Called on startup to initialize the LCD into 4-bit mode * Don't use the LCD Control subroutine at first, because initially * the LCD is in 8-bit interface mode. * ------------------------------------------------------------------------------- LCDInit: ;------------------------------------------ ;8-bit interface at first ;------------------------------------------ LDA #$0F ;Wait 15ms JSR msDelay LDA #$30 ;Function set JSR LCD8Ctrl LDA #5 ;Wait 5ms JSR msDelay LDA #$30 ;Function set JSR LCD8Ctrl LDA #1 ;Wait 1ms JSR msDelay LDA #$30 ;Function set JSR LCD8Ctrl LDA #$20 ;Function set first set up 4-bit JSR LCD8Ctrl ;------------------------------------------ ;4-bit operation ;------------------------------------------ LDA #$28 ;Second 4-bit function set JSR LCDCtrl ;Also 2-line setup LDA #$06 ;Increment, no shift JSR LCDCtrl LDA #$01 ;Clear display, cursor home JSR LCDCtrl LDA #$0C ;Display on, cursor off, blink off JSR LCDCtrl RTS * --------------------------------------------------------------------------------- * If the LCD is in 8-bit mode, just send the upper data bits through * the lower port C bits * Acc contains control byte * --------------------------------------------------------------------------------- LCD8Ctrl: AND #$F0 ;Mask out lower data bits PSHA ;Store value to send temporarily LDA PORTB ;Don't change other PORTB pins AND #$0F ;Mask out UPPER nibble ADD 1,SP ;Add value to send STA PORTB ;Store to PORTB BSET E_LCD,PORTB ;Toggle enable line BCLR E_LCD,PORTB JSR _40usDelay ;40us setup time PULA ;Deallocate stack data RTS * ----------------------------------------------------------------------------------------- * Write LCD control byte in 4-bit mode * For 4-bit mode, need to send the nibbles one at a time, high nibble first * Acc contains control byte to send * This routine is also used for Address writes to LCD, when MSbit of * data byte is set. (i.e. $80 for address 00) * --------------------------------------------------------------------------------------- ;------------------------------------------ LCDCtrl: ;ESTA ROTINA DEIXA INSTACTO PTB,0 PARA OUTROS FINS. STA TEMP JSR ENV_N ;Upper nibble LDA TEMP NSA ;INVERTE OS NIBLES STA TEMP JSR ENV_N ;Lower nibble RTS ENV_N: BRCLR 7,TEMP,L7 BSET 7,PTB VL7: BRCLR 6,TEMP,L6 BSET 6,PTB VL6: BRCLR 5,TEMP,L5 BSET 5,PTB VL5: BRCLR 4,TEMP,L4 BSET 4,PTB VL4: BSET E_LCD,PORTB ;Toggle Enable line NOP BCLR E_LCD,PORTB LDA TEMP CMP #$10 ;INSTRUÇÃO 01 REQUER 2MS DE DELAY (CLEAR) BEQ MAISDELAY CMP #$20 ;INSTRUÇÃO 02 REQUER 2MS DE DELAY (HOME) BEQ MAISDELAY JSR _40usDelay ;40us for any other command RTS MAISDELAY: LCLonger: LDA #2 JSR msDelay RTS L7: BCLR 7,PTB BRA VL7 L6: BCLR 6,PTB BRA VL6 L5: BCLR 5,PTB BRA VL5 L4: BCLR 4,PTB BRA VL4 * ------------------------------------------------------------------- * Write data byte to LCD, using 4-bit mode * Acc contains data byte to send * ------------------------------------------------------------------- LCDData: BSET RS,PORTB ;Set RS for control JSR LCDCtrl BCLR RS,PORTB ;Clear RS for data JSR _40usDelay ;40us setup time JSR _40usDelay ;40us setup time RTS * --------------------------------------------------------------------------------- * Clear the LCD display by sending the appropriate command byte * ---------------------------------------------------------------------------------- LCDClear: LDA #$01 ;Clear display AND home cursor JSR LCDCtrl RTS LCDHome: LDA #$02 JSR LCDCtrl RTS * ---------------------------------------------------------------------------------- * DELAY ROUTINES * ---------------------------------------------------------------------------------- * 1ms delay loop, causes _roughly_ 1.3ms delay @ fop = 8MHz * uses constant for loop control * cycles = 4 + X(6+7+1275) + 3 + 6 * cycles = 13 + X(1288) * where X is value loaded into Acc * Causes 1.3ms delay for BUSFREQ values of (1-8 integer values) * --------------------------------------------------------------------------------- _1msDelay: PSHA ;2 cycles LDA #BUSFREQ ;2 DLLoop: DBNZA DLSub ;3 BRA DLDone ;3 DLSub: MOV #$FF,Counter ;4 DBNZ Counter,* ;5 BRA DLLoop ;3 DLDone: PULA ;2 RTS ;4 * ------------------------------------------------------------------- * Variable ms delay loop * Calls DelayLoop Acc number of times * ------------------------------------------------------------------- msDelay: JSR _1msDelay DBNZA msDelay RTS * ------------------------------------------------------------------- * 40usec delay routine. Important for LCD module, which requires 40us * delay for many of its commands, including the "data setup time" * 6+X(3) * Where X = BUSFREQ*USCOUNT = USDELAY * Provides _roughly_ 40us delay * ------------------------------------------------------------------- _40usDelay: LDA #BUSFREQ*USCOUNT ;2 DBNZA * ;3 RTS ;4 * ------------------------------------------------------------------- * Big delay loop * Calls msDelay a predefined number of times * ------------------------------------------------------------------- BigDelay: PSHA LDA #$0A JSR msDelay PULA RTS * ------------------------------------------------------------------- * Bigger delay loop * Calls msDelay a predefined number of times * ------------------------------------------------------------------- BiggerDelay: PSHA LDA #$FF JSR msDelay LDA #$FF JSR msDelay LDA #$FF JSR msDelay LDA #$FF JSR msDelay PULA RTS *-------------------------------------------------------------------- ; MENSAGENS AJUSTAR_HORA: FCB "AJUSTAR HORA " FCB EOT AJUSTAR_DATA: FCB "AJUSTAR DATA " FCB EOT AJUSTAR_DIA: FCB "AJUSTAR DIA " FCB EOT AJUSTAR_MES: FCB "AJUSTAR MES " FCB EOT AJUSTAR_ANO: FCB "AJUSTAR ANO " FCB EOT AJUSTAR_DS: FCB "AJUSTAR DSEM " FCB EOT AJUSTAR_MIN: FCB "AJUSTAR MIN " FCB EOT ESPAÇOS: FCB " " FCB EOT DIAS_DOM: FCB "DOM " FCB EOT DIAS_SEG: FCB "SEG " FCB EOT DIAS_TER: FCB "TER " FCB EOT DIAS_QUA: FCB "QUA " FCB EOT DIAS_QUI: FCB "QUI " FCB EOT DIAS_SEX: FCB "SEX " FCB EOT DIAS_SAB: FCB "SAB " FCB EOT M_20: FCB "/20" FCB EOT Trap: LDHX #ErrorMsg JSR ShowString BRA * ErrorMsg: FCB "Vector trapped" FCB EOT * Show the current string portion on the display. * When called, the X register contains the index offset. *------------------------------------------------------------------ ShowString: FRASE: ;JSR LCDClear ;LDA #$80 ;Starting address ;JSR LCDCtrl NextByte: LDA ,X ;Load ASCII byte of string CMP #EOT ;Check for end of string BEQ Done JSR LCDData AIX #1 ;Increment the index BRA NextByte ;Ready the next byte Done: RTS ; Return * ------------------------------------------------------------------- * Sends an ASCII space character to the LCD * ------------------------------------------------------------------- BlankSpace: LDA #$20 JSR LCDData RTs *=================================================================== ;rotina de conversão bcd para decimal BCD_TO_DEC: MOV #$10,LC ;CARREGA 16 CLR RES0 ;ZERA RESULTADOS CLR RES1 CLR RES2 VOLTA: LSL C0 ;DESLOCA PARA ESQUERDA C0,C1,RES0,1,2 ROL C1 ROL RES0 ROL RES1 ROL RES2 DEC LC ;DECREMENTA LOOPCOUTER LDA LC CMP #$0 ;COMPARA COM ZERO BEQ FIM ;CONVERSÃO COMPLETA LDA #$03 ;SOMA 3 EM RES2 ADD RES2 STA RAU BRCLR 3,RAU,S1 STA RES2 ;ARMAZENA A SOMA S1: LDA #$30 ADD RES2 STA RAU BRCLR 7,RAU,S2 STA RES2 S2: LDA #$03 ;SOMA 3 EM RES2 ADD RES1 STA RAU BRCLR 3,RAU,S10 STA RES1 ;ARMAZENA A SOMA S10: LDA #$30 ADD RES1 STA RAU BRCLR 7,RAU,S20 STA RES1 S20: LDA #$03 ;SOMA 3 EM RES2 ADD RES0 STA RAU BRCLR 3,RAU,S11 STA RES0 ;ARMAZENA A SOMA S11: LDA #$30 ADD RES0 STA RAU BRCLR 7,RAU,S21 STA RES0 S21: BRA VOLTA FIM: RTS *para mcu jk ou jl escrever 'ff' em FLASH BLOCK PROTETOR REGISTER ($FE09) PARA DESPROTEGER MEMÓRIA ;-------------------------------------------------------------- ;MOSTRA REGISTRADOR CUJO ENDEREÇO É CARREGADO NO 'ACC' M_PREG: BCLR CLK,PTA ;RESETA CLOCK BSET RST,PTA ;SETA RESET JSR ENV_COM JSR LE_REG BCLR RST,PTA ;RESETA RESET M_REG: STA RES0 LDA RES0 ;MOSTRA A DEZENA NSA AND #$0F ADD #$30 JSR LCDData LDA RES0 ;MOSTRA A UNIDADE AND #$0F ADD #$30 JSR LCDData RTS ;-------------------------------------------------------------------- ;AUTORIZA ESCRITA DO DS1302 APAGANDO BIT 7 DO CONTROL EN_WRITE: BCLR CLK,PTA ;RESETA CLOCK BSET RST,PTA ;SETA RESET LDA #WCONTR ;ESCREVER CONTROLE JSR ENV_COM LDA #$00 ;AUTORIZAR ESCRITA JSR ENV_COM BCLR RST,PTA ;RESETA RESET LDA #$02 JSR msDelay RTS ;BLOQUEIA ESCRITA DO DS1302 DEN_WRITE: BCLR CLK,PTA ;RESETA CLOCK BSET RST,PTA ;SETA RESET LDA #WCONTR ;ESCREVER CONTROLE JSR ENV_COM LDA #$80 ;AUTORIZAR ESCRITA JSR ENV_COM BCLR RST,PTA ;RESETA RESET LDA #$02 JSR msDelay RTS ;LIGA RELOGIO DS1302 SAINDO DO MODO SLEEP DE BAIXO CONSUMO LIGA_DS1302: BCLR CLK,PTA ;RESETA CLOCK BSET RST,PTA ;SETA RESET LDA #WSEG ;ESCREVER SEGUNDOS JSR ENV_COM LDA #LIGARTC ;LIGAR RELOGIO JSR ENV_COM BCLR RST,PTA ;RESETA RESET LDA #$02 JSR msDelay RTS * ------------------------------------------------------------------- * VECTOR ASSIGNMENTS * ------------------------------------------------------------------- * Trap unused vectors to indicate errors * ------------------------------------------------------------------- ORG ADCVEC FDB Trap ORG KBIVEC FDB Trap ORG TIMOFVEC FDB Trap ORG TIMCH1VEC FDB Trap ORG TIMCH0VEC FDB Trap ORG IRQ1VEC FDB Trap ORG SWIVEC FDB Trap ORG RESETVEC FDB Start