por pomboeletronic » 04 Dez 2006 19:47
estou enviando um codigo em asm....
#include <89s8252.inc>
en bit p1.6;p3.6
rs bit p1.5;p3.7
DI BIT P1.5
dado equ p0
DISPLAY EQU P0
org 0000h ; RESET
ljmp inicio
org 0003h ; INT0
reti
org 000bh ; TIMER0
reti
org 0013h ; INT1
reti
org 001bh ; TIMER1
reti
org 0023h ; SERIAL
reti
inicio:
clr DI
clr EN
lcall clear
lcall escreve
;*****************************************************************************
CLR A
MOV SBUF,#0
MOV DPTR,#0
LCALL CONFIG_SERIAL
LCALL ENVIA
lcall delay1s
lcall delay1s
ljmp inicio
escreve:
mov a,#0
mov dptr,#mensagem1
;------------
escreve2:
movc a,@a+dptr
setb di
lcall write
cjne a,#'$',desvio
ret
;-----------
desvio:
inc dptr
mov a,#0
ljmp escreve2
;-----------
clear:
clr rs
mov a,#38H ;caracter 5x7
lcall write
lcall write
mov a,#0cH ;cursor off, blink off
lcall write
mov a,#01H ;coloca o cursor na linha 1 coluna 1
lcall write
ret
;-------------
write:
setb en
mov display,a
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
clr en
ret
;***************************************************
; Rotinas de Delay
;***************************************************
delay1ms: push 05h
mov r5,#255
djnz r5,$
mov r5,#255 ; 12
djnz r5,$ ; 1842 x -----------
mov r5,#255 ; Freq. Clock
djnz r5,$
mov r5,#150
djnz r5,$
pop 05h
ret;
delay10m: push 06h
mov r6,#10
loop10ms: lcall delay1ms
djnz r6,loop10ms
pop 06h
ret
delay50m: mov r7,#5
ldely50m: lcall delay10m
djnz r7,ldely50m
ret
delay200: mov r7,#20
loop200m: lcall delay10m
djnz r7,loop200m
ret
delay1s: mov r7,#100
ldelay1s: lcall delay10m
djnz r7,ldelay1s
ret
CONFIG_SERIAL: mov scon, #50h ; 01010000 (modo 1 e habilita recepção)
mov tmod, #20h ; timer 1 - 8 bits com re-load
mov th1, #0FDh ; constante a ser carregado no TH1 (9600 bps)
mov tl1, th1 ; cópia do valor de TH1 em TL1
setb tr1 ; liga o timer 1
RET
ENVIA: MOV DPTR, #MSG3
PROX_CHAR: MOVC A, @A+DPTR
CJNE A, #0FFH, TRANSMITE
RET
TRANSMITE: MOV SBUF, A
loop_envia: jnb ti, loop_envia
clr ti
INC DPTR
MOV A, #0
LJMP PROX_CHAR
delay: mov r0, #21 ; (1c) rotina de delay de 1 segundo => q = 21
loop0: mov r1, #255 ; (1c) => m = 255
loop1: mov r2, #255 ; (1c) => n = 255
loop2: djnz r2, loop2 ; (2c)
djnz r1, loop1 ; (2c)
djnz r0, loop0 ; (2c)
ret ; (2c) retorno da rotina delay
; 1 ciclo de maquinta => 1c = 4*T
; T = 1 / 11,0592MHz = 90,4224537037ns
; 1c = 4*T = 361,689814815ns
; Tempo de 1 segundo equivale a 1s/361,689814815ns = 2764800 ciclos de máquina
; # ciclos = 1c + { 1c + [ 1c + ( 2c ) * n + 2c ] * m + 2c } * q + 2c
; n = m = 255
; calculando q temos = 21,13 => 21
mensagem1: db " ENVIANDO-DADO. $"
MSG3: DB "_TESTANDO O ENVIO DE CARACTERES DO uC8051 PARA O PC VIA SERIAL ", 00DH, 0FFH
END