Visor

.
;********************************************************************************
.MESSAGE "rotinas do visor ativadas."
;********************************************************************************
;
;
;*******************************************************************************
;* Variáveis e fixos do visor.inc

;* v_PORTA_C
;* ES_LCD_RS
;* ES_74164_DAD
;* ES_74164_CLK
;*
;* f_LCD_RTD
;* f_LCD_RTD
;* f_LCD_RTD
;* f_mascD0E
;* f_mascD1Ou
;*******************************************************************************
;
;
;*******************************************************************************
; destroi: nada
re_lcd_cnfg:        push r16                ; barramento de 8 bits
                    push r22
                    ;
                    ldi r22,0x30
                    rcall re_retardo        ; espera um tempo antes da inicialização
                    ldi r16,0x38
                    rcall cnfg_lcd1
                    ;
                    ldi r16,0x38
                    rcall cnfg_lcd1
                    ldi r16,0x06
                    rcall cnfg_lcd1
                    ldi r16,0x0C            ; 0C = sem, 0E = fixo e 0F = piscante
                    rcall cnfg_lcd1
                    ;
                    ldi r16,0x01
                    rcall cnfg_lcd1
                    ldi r16,0x80
                    rcall cnfg_lcd1
                    ;
                    pop r22
                    pop r16
                    ret
                    ;
cnfg_lcd1:            rcall re_lcd_cmd
                    ldi r22,f_LCD_RTD
                    rcall re_retardo
                    ret
;********************************************************************************
;
;
;
;********************************************************************************
;* O ci 74164 tem o rst ativo no nível 0 e o clock ativa na borda de subida      *
;* com filtro de tensão.                                                      *
;********************************************************************************
; entrada: r16
re_lcd_cmd:            push r17
                    push r22
                    rcall r_lcd_rs_cmd            ; LCD no modo comando
                    rcall r_lcd_transf
                    pop r22
                    pop r17
                    ret
;------------------------------------------------------------------------------
; entrada: r16
re_lcd_dado:        push r17
                    push r22
                    rcall r_lcd_rs_dad            ; LCD no modo dado
                    rcall r_lcd_transf
                    pop r22
                    pop r17
                    ret
;------------------------------------------------------------------------------
r_lcd_transf:        push r17
                    push r22
                    rcall r_lcd_74164            ; dado no CI74164, era re_pre_E1
                    ldi r22,f_LCD_RTD            ; 5
                    rcall re_retardo
                    rcall r_lcd_en_101            ; pulso de habilitação no LCD
                    pop r22
                    pop r17
                    ret
;********************************************************************************
;
;
;
;********************************************************************************
;
;
;        acesso ao hardware
;
;
;********************************************************************************
; rs: 1=dado
;     0=instrução
; leva o bit de controle RS do LCD a nível 0 isto é, instrução.
r_lcd_rs_cmd:        push r16
                    lds r16,v_PORTA_C            ; busca valor atual da porta
                    andi r16,0b11011111            ; E lógico, 0, RS = PC5
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_LCD_RS,r16
                    pop r16
                    ret
;------------------------------------------------------------------------------
; leva o bit de controle RS do LCD a nível 1 isto é, dado.
r_lcd_rs_dad:        push r16                    ; 
                    lds r16,v_PORTA_C            ; busca valor atual da porta
                    ori r16,0b00100000            ; OU lógico, 1, RS = PC5
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_LCD_RS,r16
                    pop r16
                    ret
;********************************************************************************
;
;********************************************************************************
;* api: re_lcd_en_101
;* chama: lcd_en_0 e lcd_en_1
;* 
; en: descida habilita, 1-0-1
r_lcd_en_101:        push r16
                    push r22
                    rcall lcd_en_1
                    rcall lcd_en_0                ; função na descida
                    ldi r22,f_LCD_RTD
                    rcall re_retardo
                    rcall lcd_en_1
                    pop r22
                    pop r16
                    ret
;------------------------------------------------------------------------------
; leva o bit de controle EN do LCD a nível 0 isto é, desabilitado.
lcd_en_0:            lds r16,v_PORTA_C            ; busca valor atual da porta
                    andi r16,0b11101111            ; E lógico, 0, EN = PC4
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_LCD_EN,r16
                    ret
                    ;
; leva o bit de controle EN do LCD a nível 1 isto é, habilitado.
lcd_en_1:            lds r16,v_PORTA_C            ; busca valor atual da porta
                    ori r16,0b00010000            ; OU lógico, 1, EN = PC4
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_LCD_EN,r16
                    ret
;********************************************************************************
;
;********************************************************************************
; Geração dos sinais de controle e dados do LCD.                              *
; Tem que salvar o valor da porta na variável e manipular estes dados somente *
; pelo fato da preempção.                                                      *
; Altera somente o bit correspondente.                                          *
;********************************************************************************
;* api: re_lcd_74164                                                          *
;* chama: lcd_dado_0 e lcd_dado_1                                              *
;*                                                                              *
;* transfere oito bits no 74als164                                              *
;* entrada: r16                                                                  *
;********************************************************************************
r_lcd_74164:        ldi r17,8                    ; contador de bits
lcd_74164a:            clc
                    rol r16                        ; C <- D7 ... D0 <- C
                    brcc lcd_741640                ; dado = 0 ?
                    rcall lcd_dado_1            ; bit na porta = 1
                    rjmp lcd_741641
                    ;
lcd_741640:            rcall lcd_dado_0            ; bit na porta = 0
                    ;
lcd_741641:            nop
                    rcall r_lcd_74164_clk        ; pulso positivo, clock = 0 1 0
                    dec r17
                    brne lcd_74164a
                    ret                            ; única saída
;------------------------------------------------------------------------------
; leva o bit de dados do 74ALS164 ao nível 0.
lcd_dado_0:            push r16
                    lds r16,v_PORTA_C            ; busca valor atual da porta
                    andi r16,f_mascD0E            ; E lógico, 0, DAD=PC3
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_74164_DAD,r16
                    pop r16
                    ret
;------------------------------------------------------------------------------
; leva o bit de dados do 74ALS164 ao nível 1.
lcd_dado_1:            push r16
                    lds r16,v_PORTA_C            ; busca valor atual da porta
                    ori r16,f_mascD1Ou            ; OU lógico, 1, DAD=PC3
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_74164_DAD,r16
                    pop r16
                    ret
;********************************************************************************
;
;
;
;********************************************************************************
;* api: lcd_74164_clk                                                          *
;* usada por lcd_74164_clk: lcd_74164_0 e lcd_74164_1                          *
;*                                                                              *
;* gera um pulso positivo no pino de clock do 74ALS164.                          *
;* borda de subida                                                              *
;********************************************************************************
r_lcd_74164_clk:    rcall lcd_74164_clk0
                    rcall lcd_74164_clk1        ; transfere na borda de subida
                    rcall lcd_74164_clk0
                    ret
;------------------------------------------------------------------------------
lcd_74164_clk0:        push r16
                    lds r16,v_PORTA_C            ; busca valor atual da porta
                    andi r16,0b11111011            ; E lógico, 0, CLK=PC2
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_74164_CLK,r16
                    pop r16
                    ret
;------------------------------------------------------------------------------
lcd_74164_clk1:        push r16
                    lds r16,v_PORTA_C            ; busca valor atual da porta
                    ori r16,0b000000100            ; OU lógico, 1, CLK=PC2
                    sts v_PORTA_C,r16            ; restaura valor da porta
                    out ES_74164_CLK,r16
                    pop r16
                    ret
;********************************************************************************
.

Nenhum comentário:

Postar um comentário