Cara
Legal que voce está programando em Assembly!!!!!
Anexo um bootloader para o 8051 que fiz no final dos anos 80.
Espero que ajude. Eu escrevo no LCD e tambem implementei rotina para imprimer byte na usart e no lcd.
asm code
;***************************************************************************
;MONITOR PARA O SISTEMA MINIMO BASEADO NO MICROCONTROLADOR 8031
;DA FAMILIA MCS-51
; MIGUEL ALEXANDRE WISINTAINER
; 11/02/1989
;OBJETIVO: DAR A CARGA DE UM PROGRAMA .COM GERADO PELO ASSEMBLADOR 8031
; PELA INTERFACE SERIAL (9600 BPS) NO ENDERECO 4000H DA RAM E
; EXECUTA-LO.
;**************************************************************************
.org 0
LJMP INICIO
.org h'3
LJMP ext_0
.org h'b
LJMP timer_0
.org h'13
LJMP ext_1
.org h'1b
LJMP timer_1
.org h'23
LJMP serial
.org h'2b
LJMP timer_2
INFO_1:.DB "SISTEMA",0
INFO_2:.DB "8031",0
INFO_3:.DB "MCS51"
;********************************************************************
COMMAND_OUT:
PUSH DPH
PUSH DPL
MOV DPTR,#LCD_STATUS
PUSH ACC
BUSY:
MOVX A,@DPTR
JB ACC.7,BUSY
POP ACC
MOV DPTR,#INSTRUCTION_INPUT
MOVX @DPTR,A
POP DPL
POP DPH
RET
;********************************************************************
DATA_OUT:
PUSH DPH
PUSH DPL
MOV DPTR,#LCD_STATUS
PUSH ACC
BUSY1:
MOVX A,@DPTR
JB ACC.7,BUSY1
POP ACC
MOV DPTR,#DATA_INPUT
MOVX @DPTR,A
POP DPL
POP DPH
RET
;********************************************************************
CLEAR_DISPLAY:
PUSH ACC
MOV A,#1
ACALL COMMAND_OUT
POP ACC
RET
;********************************************************************
HOME_CURSOR:
PUSH ACC
MOV A,#2
ACALL COMMAND_OUT
POP ACC
RET
;********************************************************************
CURSOR_OFF:
PUSH ACC
MOV A,#H'0C
ACALL COMMAND_OUT
POP ACC
RET
;********************************************************************
SET_C_M:
PUSH ACC
ADD A,#H'80
ACALL COMMAND_OUT
POP ACC
RET
;********************************************************************
SET_C_R:
PUSH ACC
ADD A,#H'C0
ACALL COMMAND_OUT
POP ACC
RET
;********************************************************************
I_MEN_LCD:
PUSH ACC
PUSH DPH
PUSH DPL
COMPARA_SE_NULL_L:
MOVX A,@DPTR
CJNE A,#0,IMP_L
LJMP SAI_MEN_L
IMP_L:
ACALL DATA_OUT
INC DPTR
LJMP COMPARA_SE_NULL_L
SAI_MEN_L:
POP DPL
POP DPH
POP ACC
RET
;********************************************************************
LE_BYTE:
MOV SBUF,#255
ESP_BYTE:
JNB RI,ESP_BYTE
CLR RI
MOV A,SBUF
CLR TI
RET
;********************************************************************
LE_WORD:
MOV SBUF,#254
ESP_LOW_BYTE:
JNB RI,ESP_LOW_BYTE
CLR RI
MOV DPL,SBUF
ESP_HIG_BYTE:
JNB RI,ESP_HIG_BYTE
CLR RI
MOV DPH,SBUF
CLR TI
RET
;********************************************************************
LE_STRING:
PUSH ACC
PUSH DPH
PUSH DPL
MOV SBUF,#253
ESP_LETRA:
JNB RI,ESP_LETRA
CLR RI
MOV A,SBUF
CJNE A,#0,NOR_LETRA
LJMP SAI_LETRA
NOR_LETRA:
MOVX @DPTR,A
INC DPTR
LJMP ESP_LETRA
SAI_LETRA:
MOVX @DPTR,A
POP DPL
POP DPH
POP ACC
CLR TI
RET
;********************************************************************
I_MEN_SERIAL:
PUSH ACC
PUSH DPH
PUSH DPL
COM_SE_NULL_S:
MOVX A,@DPTR
CJNE A,#0,IMP_S
LJMP S_MEN_S
IMP_S:
MOV SBUF,A
ESP_S:
JNB TI,ESP_S
CLR TI
; ESPERA CONFIRMACAO DA IMPRESSAO DO CARACTER
IMS:
JNB RI,IMS
CLR RI
MOV A,SBUF ; SEM VALOR ALGUM PARA A, APENAS CONFIRMACAO
INC DPTR
LJMP COM_SE_NULL_S
S_MEN_S:
POP DPL
POP DPH
POP ACC
RET
;********************************************************************
IMP_BYTE_lcd:
PUSH ACC
PUSH B
PUSH H'00
MOV H'00,#0
NAO_FIM:
MOV B,#D'10
DIV AB
INC H'00
PUSH B
CJNE A,#0,NAO_FIM
IMP_DIGITO:
POP B
MOV A,B
ADD A,#H'30
ACALL DATA_OUT
DJNZ H'00,IMP_DIGITO
POP H'00
POP B
POP ACC
RET
;********************************************************************
IMP_B_serial:
PUSH ACC
PUSH B
PUSH H'00
MOV H'00,#0
NAO_F_S:
MOV B,#D'10
DIV AB
INC H'00
PUSH B
CJNE A,#0,NAO_F_s
IMP_DI_s:
POP B
MOV A,B
ADD A,#H'30
MOV SBUF,A
ESPE_S:
JNB TI,ESPE_S
CLR TI
; ESPERA CONFIRMACAO DA IMPRESSAO DO CARACTER
IBS:
JNB RI,IBS
CLR RI
MOV A,SBUF ; SEM VALOR ALGUM PARA A, APENAS PARA CONFIRMACAO
DJNZ H'00,IMP_DI_s
POP H'00
POP B
POP ACC
RET
;********************************************************************
CLEAR_TERMINAL:
PUSH ACC
MOV SBUF,#252
ESP_TI:
JNB TI,ESP_TI
CLR TI
;ESPERA A TELA APAGAR COMPLETAMENTE
ESP_APAGAR:
JNB RI,ESP_APAGAR
CLR RI
MOV A,SBUF ; AX SEM EFEITO
POP ACC
RET
;*********************************************************************
IMP_CHAR_S:
PUSH ACC
MOV SBUF,A
ESP_TI_C:
JNB TI,ESP_TI_C
CLR TI
; ESPERA CONFIRMACAO DA IMPRESSAO DO CARACTER
ICS:
JNB RI,ICS
CLR RI
MOV A,SBUF ; SEM VALOR ALGUM PARA A, SO PARA CONFIRMACAO
POP ACC
RET
;*********************************************************************
CURS_ON:
PUSH ACC
MOV A,#H'0F
ACALL COMMAND_OUT
POP ACC
RET
;*********************************************************************
VERIFICA_SE_TECLA_PRESSIONADA:
MOV SBUF,#251
ESP_VST:
JNB RI,ESP_VST
CLR RI
MOV A,SBUF
CJNE A,#0,FOI_PRESSIONADA
CLR C
SJMP NAO_FOI_PRESSIONADA
FOI_PRESSIONADA:
SETB C
NAO_FOI_PRESSIONADA:
CLR TI
RET
;*********************************************************************
LE_CODIGO_PRESSIONADA:
MOV SBUF,#250
ESP_COD1:
JNB RI,ESP_COD1
CLR RI
MOV A,SBUF
CJNE A,#0,NA_T_EXTENDIDA
SETB C
SJMP T_EXTENDIDA
NA_T_EXTENDIDA:
CLR C
T_EXTENDIDA:
ESP_COD2:
JNB RI,ESP_COD2
CLR RI
MOV A,SBUF
CLR TI
RET
;*********************************************************************
INICIO:
; PALAVRA DE CONTROLE AO DISPLAY
MOV A,#H'6
ACALL COMMAND_OUT
MOV A,#H'0C
ACALL COMMAND_OUT
MOV A,#H'38
ACALL COMMAND_OUT
ACALL CLEAR_DISPLAY
ACALL HOME_CURSOR
ACALL CURSOR_OFF
; IDENTIFICACAO DO SISTEMA
MOV DPTR,#INFO_1
LCALL I_MEN_LCD
MOV A,#0
LCALL SET_C_R
MOV DPTR,#INFO_2
LCALL I_MEN_LCD
; PROGRAMA TAXA DE TRANSMISSAO 19200 BPS, 10 BITS
MOV h'98,#B'01010000 ; scon
MOV TMOD,#H'20 ; tmod
MOV TH1,#H'FD ; th1 (e6)
MOV h'87,#b'10000000 ; Duplica velocidade
SETB TR1
; ENDERECO INICIAL DA RAM
MOV DPTR,#PROGRAMA_EM_RAM
; CLEAR BUFFER SERIAL
MOV A,SBUF
;*********************************************************************
PED_H:
MOV SBUF,#'M'
ESP_H:
JNB RI,ESP_H
CLR RI
MOV R1,SBUF
MAN_H_R:
MOV SBUF,R1
ESP_FF_H:
JNB RI,ESP_FF_H
CLR RI
MOV A,SBUF
;*********************************************************************
PED_L:
MOV SBUF,#'M'
ESP_L:
JNB RI,ESP_L
CLR RI
MOV R0,SBUF
MAN_L_R:
MOV SBUF,R0
ESP_FF_L:
JNB RI,ESP_FF_L
CLR RI
MOV A,SBUF
; ******************************************************************
PED_C:
MOV SBUF,#'M'
ESP_C:
JNB RI,ESP_C
CLR RI
MOV A,SBUF
MOVX @DPTR,A
MAN_C_R:
MOVX A,@DPTR
MOV SBUF,A
INC DPTR
ESPERA_FF_C:
JNB RI,ESPERA_FF_C
CLR RI
MOV A,SBUF
;******************************************************************
MOV A,R0
DEC R0
JNZ MSB
DEC R1
MSB:
MOV A,R0
ORL A,R1
JNZ PED_C
CLR TI
; AQUI CARREGA ROTINA DE CHECKSUM E EXECUTA O PROGRAMA
CLR RI
MOV DPTR,#H'3FC0
MOV R0,#0
ECHECK:
JNB RI,ECHECK
MOV A,SBUF
CLR RI
MOVX @DPTR,A
MOVX A,@DPTR
MOV SBUF,A ;Apenas confirma o recebimento}
INC DPTR
INC R0
CJNE R0,#D'52,ECHECK
; EXECUTANDO CHECKSUM (PROGRAMA NA RAM)
LJMP H'3FC0
.org h'2000
PROGRAMA_EM_RAM:
.org h'2003
ext_0:
.org h'200b
timer_0:
.org h'2013
ext_1:
.org h'201b
timer_1:
.ORG h'2023
serial:
.ORG h'202b
timer_2:
;********************************************************************
.org h'4000
INSTRUCTION_INPUT:
.org h'4001
DATA_INPUT:
.org h'4002
LCD_STATUS:
.END INICIO
;3FC0