;*******************************************************************************
.MESSAGE "rotinas do visor
ativadas."
;*******************************************************************************
; 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
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