View Full Version : Assembly


anthead
19-06-2008, 17:06
Ta me a dar erro nas linhas que tiverem uma seta! Nao sei prq!?
Trata se da programacao de um LCD 16x2 para que neste aparece Hello World!!!

ORG 0
;Nome das linhas de dados e controle

DB0 EQU P1.0
DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
ENAB EQU P3.7
RS EQU P3.6
RW EQU P3.5
->DATA EQU P1

;************************************************* *
;Programa Principal *
;Exemplo: Escrever HELLo WORLD n LCD, sendo a *
;primeira palavra no início da primeira linha e a *
;segunda palavra a partir da posição 10 da segunda*
;linha do LCD. *
;************************************************* *

LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#4AH ;posicionar o cursor
LCALL POS_LCD
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT
SJMP $

;************************************************* *
;Sub-rotina de Inicialização do controlador do LCD*
;************************************************* *

INIT_LCD:
CLR RW ;Inicia ciclo de escrita no LCD
SETB ENAB ;Habilita o LCD
CLR RS ;Modo Instucção
->MOV DATA,#38h ;Display de 2 linhas, Modo 8 Bits
CLR ENAB ;Desabilita o LCD
LCALL WAIT_LCD ;Aguarda o LCD executar o comando
;************************************************* ****************
SETB ENAB
CLR RS
->MOV DATA,#0Eh ;Liga o LCD e o cursor
CLR ENAB
LCALL WAIT_LCD
;************************************************* ****************
SETB ENAB
CLR RS
->MOV DATA,#06h ;LCD em recepção e cursor move para
;a direita a cada caracter
CLR ENAB
LCALL WAIT_LCD
RET

;*************************************
;Sub-rotina para limpar a tela do LCD*
;*************************************

CLEAR_LCD:
CLR RW
SETB ENAB
CLR RS
->MOV DATA,#01h
CLR ENAB
LCALL WAIT_LCD
RET

;**********************************************
;Sub-rotina para posicionar o cursor do LCD *
;A posição deve estar armazenada no Acumulador*
;**********************************************

POS_LCD:
CLR RW
SETB ENAB
CLR RS
ADD A,#80H
->MOV DATA,A
CLR ENAB
LCALL WAIT_LCD
RET

;*********************************************
;Sub-rotina para escrever um caractere no LCD*
;O Caracter em ASCII deve estar no Acumulador*
;*********************************************

WRITE_TEXT:
CLR RW
SETB ENAB
SETB RS ;Modo Dados
->MOV DATA,A
CLR ENAB
LCALL WAIT_LCD
RET

;************************************************
;Sub-rotina que espera o LCD executar um comando*
;************************************************

WAIT_LCD:
SETB RW ;Inicia o ciclo de leitura no LCD
SETB ENAB ;Habilita o LCD
CLR RS ;Modo Instrucção
->MOV DATA,#0FFh ;Garante P1 como entrada
JB DB7,$ ;Se o bit DB7 estiver em alto,
;o LCD está ocupado
CLR ENAB ;Desabilita o LCD
CLR RW ;Finaliza o ciclo de leitura no LCD
RET

Alguem me pode ajudar?

cumprimentos,