visor

.
;*******************************************************************************
.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