|
APLICANDO UM LCD
16X02 À PLACA Z80 BY ARNE Código do programa teste_LCD.asm ;******************************************************************************
; Projeto - LCD_drZ80
; Arquivo - LCD_drZ80.asm
; Desenv. - Eng. Márcio José Soares
; Versão - 1.0
; Data - 27/10/2021
;
; Controle de LCD 16x2 através da placa drZ80_uP via PPI8255
;
; Compilador: pasmo -d -v teste_LCD.asm teste_LCD.bin
;
; Pinos:
; LCD PPI8255
; ------------------
; RS(4) PB0
; EN(6) PA0
; D4(11) PB4
; D5(12) PB5
; D6(13) PB6
; D7(14) PB7
;
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Declara funções necessárias na placa drZ80_uP
;
wrB8255A equ 0085H ;escreve A no portB
wrA8255A equ 0088H ;escreve A no portA
t_50us equ 0094H ;temporiza 50us
t_50ms equ 00A3H ;temporiza 50ms
t_500ms equ 00A9H ;temporiza 500ms
wrzerodisp equ 007CH ;limpa display 7 segmentos - coloca zeros
;-------------------------------------------------------------------------------
; Declara constantes
;
CR equ 0DH ;ENTER
LF equ 0AH ;Line Feed
RS_ON equ 01H ;bit de controle RS do LCD
RS_OFF equ 0FEH ;bit de controle RS do LCD invertido
;-------------------------------------------------------------------------------
; Declara constantes
;
org 8000H ;endereço inicial da RAM e programa do usuário
jr main ;desvia para main
myout db 1 ;var de saida para dados
mydata db 1 ;var para colocar dados no LCD
myaux3 db 1
;-------------------------------------------------------------------------------
; Subrotina principal
;
main: call initLCD ;configura LCD
call clearLCD
call snd2SPC
main_lc: call clearLCD
ld hl,msgLCD
call sendmsg ;envia mensagem para LCD
call t_500ms ;aguarda
call t_500ms ;
call clearLCD
ld hl,msgTranq
call sendmsg
call t_500ms ;aguarda
call t_500ms ;
call clearLCD
ld hl,msg2022
call sendmsg
ld b,4
main_lc2: call t_500ms
djnz main_lc2
jr main_lc ;laço eterno
halt ;trava aqui se passar ... never!
;-------------------------------------------------------------------------------
; subrotina para enviar msg para a LCD
; ponteiro da mensagem em HL
;
sendmsg: ld a,(hl) ;pega conteudo
ld b,a ;salva em b
cp 00H ;compara com final
ret z ;retorna se chegou ao fim
cp LF ;compara com LF
jp nz,sndcont ;se nao, continua
call lin2LCD ;muda para linha 2 do LCD
inc hl
jr sndcontLF ;pula para não enviar o LF
sndcont: ld de,mydata ;pega end da var de envio
ld a,b ;restaura a com b
ld (de),a ;coloca conteúdo da mensagem em a
inc hl ;incrementa a posição de hl
call schLCD ;envia char para LCD
sndcontLF: call t_50ms ;aguarda
fsndstrlc: jr sendmsg ;continua ate o fim
;-------------------------------------------------------------------------------
; Subrotina para mudar para linha 2 do LCD
;
lin2LCD: push hl
ld hl,mydata ;coloca na var o char a ser escrito
ld a,0C0H ;apaga LCD e coloca na coluna 1
ld (hl),a
call scomLCD ;muda de linha no LCD
pop hl
ret
;-------------------------------------------------------------------------------
; Subrotina para apagar o LCD
;
clearLCD: ld hl,mydata ;coloca na var o char a ser escrito
ld a,01H ;apaga LCD e coloca na coluna 1
ld (hl),a
call scomLCD ;muda de linha no LCD
ret
;-------------------------------------------------------------------------------
; Envia dois caracteres dummies antes de enviar uma string
;
snd2SPC: ld hl,mydata
ld a,' '
ld (hl),a
call schLCD
call t_50ms
ld hl,mydata
ld a,' '
ld (hl),a
call schLCD
call t_50ms
ret
;-------------------------------------------------------------------------------
; Envia um char para o LCD - usa modo 4 bits
;
schLCD: push hl
push bc
ld hl,mydata ;pega endereco da var
ld a,(hl) ;pega o conteudo
and 0F0H ;limpa a parte menos significativa
or RS_ON ;liga o pino de RS
call wrB8255A ;envia A para portB
call EN_on ;liga o pino EN - pulsa EN
call t_50us ;aguarda
call EN_off ;desliga o pino EN
ld hl,mydata ;volta a pegar o end da var
ld a,(hl) ;pega o conteudo
sla a ;posiciona o LSB no MSB
sla a
sla a
sla a
and 0F0H ;limpa o LSB
or RS_ON ;liga o RS
call wrB8255A ;envia A para portB
call EN_on ;liga o pino EN - pulsa EN
call t_50us ;aguarda
call EN_off ;desliga o pino EN
pop bc
pop hl
ret
;-------------------------------------------------------------------------------
; Envia um comando para o LCD - usa modo 4 bits de dados
;
scomLCD: ld hl,mydata ;pega endereco da var
ld a,(hl) ;pega o conteudo
and 0F0H ;limpa a parte menos significativa
and RS_OFF ;desliga o pino de RS
call wrB8255A ;envia A para portB
call EN_on ;liga o pino EN - pulsa EN
call t_50us ;aguarda
call EN_off ;desliga o pino EN
ld hl,mydata ;volta a pegar o end da var
ld a,(hl) ;pega o conteudo
sla a ;posiciona o LSB no MSB
sla a
sla a
sla a
and 0F0H ;limpa o LSB
and RS_OFF ;desliga o RS
call wrB8255A ;envia A para portB
call EN_on ;liga o pino EN - pulsa EN
call t_50us ;aguarda
call EN_off ;desliga o EN de strobe
ret
;-------------------------------------------------------------------------------
; Subrotina para configurar/iniciar o LCD - RS=0 e WR=0
; Le bytes em _initlcd e envia via porta paralela
; Configuracao adotada: modo 4 bits de dados, 2 linhas, caracter 5x7, cursor piscando
;
initLCD: ld a,00H ;sao 5 bytes a enviar, comecando por zero
ld hl,myaux3 ;carrega endereco
ld (hl),a ;guarda
initLCDloop: ld de,myaux3 ;pega o endereco da var
ld b,00H ;zera a var
ld a,(de) ;pega o conteudo de myaux3
ld c,a ;carrega em c
ld hl,_inilcd ;carrega endereco da var de configuracao
add hl,bc ;posiciona o ponteiro
ld a,(hl) ;pega primeiro byte
ld hl,mydata ;pega endereco da var
ld (hl),a ;coloca valor na var
call scomLCD ;envia o comando para o LCD
ld hl,myaux3 ;carrega endereco
ld a,(hl) ;pega conteudo
inc a ;decrementa a
ld (hl),a ;guarda conteudo
cp 05H ;compara com final - sao 7 comandos agora
jp nz,initLCDloop ;se nao eh ainda o valor
ret ;detectado fim, retorna!
;-------------------------------------------------------------------------------
; Subrotina strobe_on - liga pino de strobe
;
EN_on: ld hl,myEN ;carrega end da var
ld a,01H ;carrega valor ON
jr myEN ;desvia
;-------------------------------------------------------------------------------
; Subrotina strobe_off - desliga pino de strobe
;
EN_off: ld hl,myEN ;carrega end da var
ld a,00H ;carrega valor OFF
;-------------------------------------------------------------------------------
; Subrotina mystrobe - liga/desliga pino de strobe
;
myEN: call wrA8255A ;envia dado para portA
ret ;retorna
;-------------------------------------------------------------------------------
; Dados para LCD - inicializacao
; comandos para inicializar o LCD - modo 4 bits
_inilcd: db 02H, 28H, 06H, 0FH, 01H
;-------------------------------------------------------------------------------
; Mensagem para LCD_drZ80
;
msgDummie: db ' ',00H
msgLCD: db ' PLACA drZ80_uP',LF
db ' TESTE LCD ',00H
msgTranq: db ' Bem-vindo ao ',LF
db ' LAB do Arne ',00H
msg2022: db ' FELIZ ',LF
db ' 2022 ',00H
;-------------------------------------------------------------------------------
; Fim do programa
;
end
|
|
Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor. |