Sie sind auf Seite 1von 8

;************************************************* www.x-robotics.

com *******
; PROGRAMA : X-Temp_LM35.asm
; Funcion :Medicion de temperatura de 4 canales con 2,56V +Vref externo y
;
sensores LM35, indicacion de temp. en LCD 2x16.
;
;
Medicin de 0 a +150 C
;
;--------------------------------------------------------------------------; Revision : 1.00
Fecha: 22/2/2003
Programa para : PIC16F876
; CPU Clock : 4 MHz
Tiempo instruccion : 1uS
;
WDT : OFF
Tipo de reloj : XT
; Code Prot : OFF
cfg USART rs232 ; none
;
Autor : Daniel C. Martin -> ionitron@x-robotics.com <;************************************************* www.x-robotics.com *******
processor 16F876
LIST

P=16F876

INCLUDE <P16f876.inc>

;Se indica el modo de procesador


;se incluye la definicion de los
;registros internos

__config 3D31

PDel0
PDel1
PDel2
BUFFER
DATO_A
DATO_B
Digito
INNER
OUTER
cnt_bit

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

0x21
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2A

ASCII_H
ASCII_M
ASCII_L
HEXADECIMAL

EQU
EQU
EQU
EQU

0x2B
0x2C
0x2D
0x2E

Canal

EQU

0x2F

;---------------------------------------------------------------------------org
goto

0x00
INICIO

;vector de inicio

org

0x05

;despues del vector de interrupcion

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>


;---------------------------------------------------------------------------INICIO

bcf
bcf

STATUS,RP0
STATUS,RP1

clrf

PORTA

;banco 0

bsf

STATUS,RP0

;banco 1

clrf
clrf

TRISB
TRISC

;portb como salida

bcf

STATUS,RP0

;banco 0

clrf
clrf
clrf

PORTA
PORTB
PORTC

;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
START
CALL
LCD_INI
;Inicia LCD (CFG puertos...)
START_1

REPETIR

acabar

MOVLW
CALL
MOVLW
CALL
MOVLW

b'00000001'
LCD_REG
b'00000110'
LCD_REG
b'00001100'

CALL
LCD_REG
MOVLW 0x80
CALL
LCD_REG
;MOVF
Digito,w
;CALL
DATO_1
;IORLW 0x00
;BTFSC STATUS,2
;GOTO
acabar
;CALL
LCD_DATOS
;INCF
Digito,f
;GOTO
REPETIR

;Borrar LCD y Home


;
;LCD On, cursor Off,Parpadeo Off
;Direccion caracter
;W=Digito
;Coge el caracter
;Compara
;Es el ultimo?
;Si
;Visualiza caracter
;Incrementa numero de Digito
;Vuelve a escribir

;termino inicializacion de lcd y muestra primeros datos

;===========================================================================
;
Inicio de conversion de valores analogicos
;===========================================================================
;---------------------Configuracion CONVERTIDOR A/D------------------------CFGADC
bsf
STATUS,RP0
;Banco 1
bcf
STATUS,RP1
movlw
movwf
movlw
movwf

b'00000011'
ADCON1
b'11111111'
TRISA

;seleccion tipo puertos A/D

bcf
movlw
movwf
bcf

STATUS,RP0
b'01000001'
ADCON0
PIR1,ADIF

;Banco 0
;seleccion Tad, canales para
;conversion y A/D=ON
;limpia flag de conversion completa

;PORTA como entrada

;
FIN de configuracion de registros
;--------------------------------------------------------------------------lecturas

movlw

d'0'

;selecciona canal ADC

movwf
call

Canal
RUN_ADC

movlw
call
movlw
call
movlw
call
movlw
call

0x80
LCD_REG
'T'
LCD_DATOS
'1'
LCD_DATOS
'='
LCD_DATOS

;pone cursor en 80-----------------;Visualiza caracter


;Visualiza caracter
;Visualiza caracter

call
inLCD
;visualiza dato--------------------movlw 0xDF
;
call
LCD_DATOS
;Visualiza caracter
movlw 0x20
;" "
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'1'
;selecciona canal ADC
movwf Canal
call
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call

0x88
LCD_REG
'T'
LCD_DATOS
'2'
LCD_DATOS
'='
LCD_DATOS

;pone cursor en 80-----------------;Visualiza caracter


;Visualiza caracter
;Visualiza caracter

call
inLCD
;visualiza dato--------------------movlw 0xDF
;
call
LCD_DATOS
;Visualiza caracter
movlw 0x20
;" "
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'2'
;selecciona canal ADC
movwf Canal
call
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call

0xC0
LCD_REG
'T'
LCD_DATOS
'3'
LCD_DATOS
'='
LCD_DATOS

;pone cursor en 80-----------------;Visualiza caracter

call
movlw
call
movlw

inLCD
0xDF
LCD_DATOS
0x20

;visualiza dato--------------------;
;Visualiza caracter
;" "

;Visualiza caracter
;Visualiza caracter

call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'4'
;selecciona canal ADC
movwf Canal
call
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call

0xC8
LCD_REG
'T'
LCD_DATOS
'4'
LCD_DATOS
'='
LCD_DATOS

;pone cursor en 80-----------------;Visualiza caracter


;Visualiza caracter
;Visualiza caracter

call
inLCD
;visualiza dato--------------------movlw 0xDF
;
call
LCD_DATOS
;Visualiza caracter
movlw 0x20
;" "
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
goto

lecturas

;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////

;--------------------------------------------------------------------------RUN_ADC

bcf
bcf

STATUS,RP0
STATUS,RP1

;Banco 0
;Banco 0

movlw
movwf
;bcf
rlf
rlf
rlf
iorwf
;bsf
rrf
rrf
bcf

b'01000001'
ADCON0
ADCON0,ADON
Canal,F
Canal,F
Canal,W
ADCON0,F
ADCON0,ADON
Canal,F
Canal,F
PIR1,ADIF

;repone a cero para que iorlw pueda


;apaga el convertidor
;posiciona los bits

;enciende el convertidor
;retorna a la anterior
;limpia flag de conversion completa

nop
nop
GO_ADC

bsf

ADCON0,GO_DONE ;Inicio conversion

wait_ADC

btfsc

ADCON0,GO_DONE ;espera a que finalice la conversion

goto
READ_OK

wait_ADC

;bucle

;La conversion esta en ADRESH:ADRESL


return

;mostrar en lcd!************************************************************
inLCD
movf
ADRESH,W
call
Hex_Ascii
bcf
bcf

STATUS,RP0
STATUS,RP1

bcf
movf
xorlw
btfsc
goto
movf
CALL

STATUS,Z
ASCII_H,W
;sobreescribe el dato distancia
0x30
;Comprueba si es cero a la izquierda
STATUS,Z
cero_izquierda
ASCII_H,W
LCD_DATOS
;Visualiza caracter

cero_izquierda movf
ASCII_M,W
;iorlw 0x00
;btfss STATUS,Z
CALL
LCD_DATOS
movf
CALL

ASCII_L,W
LCD_DATOS

call
call

DELAY_5MS
DELAY_5MS

;banco 0

;Comprueba si es cero a la izquierda


;Visualiza caracter
;Visualiza caracter

return

;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////

;#########################################################RUTINAS DE LCD####
LCD_E
BSF
PORTC,2
;Activa seal E
NOP
NOP
NOP
;Espera 1uS
BCF
PORTC,2
;Desactiva seal E
RETURN
LCD_BUSY

L_BUSY

BSF
BSF
MOVLW
MOVWF
BCF
BSF
NOP
BTFSC
GOTO

PORTC,1
STATUS,RP0
0xFF
TRISB
STATUS,RP0
PORTC,2

;Pone el LCD en modo lectura


;Selecciona el Banco 1

PORTB,7
L_BUSY

;Chequea el bit BUSY


;Est a "1" (Ocupado)

;Puerta B acta de entrada


;Selecciona el Banco 0
;Activa el LCD (Seal E)

BCF
BSF
CLRF
BCF
BCF
RETURN

PORTC,2
STATUS,RP0
TRISB
STATUS,RP0
PORTC,1

;Desactiva el LCD (Seal E)


;Selecciona el Banco 1
;Puerta B actua como salida
;Selecciona el Banco 0
;Pone el LCD en modo escritura

LCD_REG

BCF
MOVWF
CALL
GOTO

PORTC,0
PORTB
LCD_BUSY
LCD_E

;Desactiva RS (Modo instruccion)


;Saca el codigo de instruccion
;Espera a que se libere el LCD
;Genera pulso en seal E

LCD_DATOS

BCF
MOVWF
CALL
BSF
GOTO

PORTC,0
PORTB
LCD_BUSY
PORTC,0
LCD_E

;Desactiva RS (Modo instruccin)


;Valor ASCII a sacar por PORTB
;Espera a que se libere el LCD
;Activa RS (Modo dato)
;Genera pulso en seal E

LCD_INI

MOVLW
CALL
CALL
MOVLW
CALL
CALL
MOVLW
CALL
CALL
RETURN

b'00111000'
LCD_REG
DELAY_5MS
b'00111000'
LCD_REG
DELAY_5MS
b'00111000'
LCD_REG
DELAY_5MS

;Codigo de instruccion
;Temporiza 5 mS.
;Codigo de instruccion
;Temporiza 5 mS.
;Codigo de instruccion
;Temporiza 5 mS.

;****************************************************************************
;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de
;inicio del LCD
DELAY_5MS

movlw .6
; 1 set number of repetitions (B)
movwf PDel0
; 1 |
PLoop1
movlw .207
; 1 set number of repetitions (A)
movwf PDel1
; 1 |
PLoop2
nop
; 1 clear watchdog
decfsz PDel1, 1
; 1 + (1) is the time over? (A)
goto
PLoop2
; 2 no, loop
decfsz PDel0, 1
; 1 + (1) is the time over? (B)
goto
PLoop1
; 2 no, loop
PDelL1
goto
PDelL2
; 2 cycles delay
PDelL2
nop
; 1 cycle delay
return
; 2+2 Done
;###########################################################################

del_1ms
in_lp

delay
out_lp

movlw
movwf
nop
nop
decfsz
goto
return

d'199'
INNER

movwf
call

OUTER
del_1ms

;delay 1mS

INNER,F
in_lp
;vueltas de 1mS

decfsz OUTER,F
goto
out_lp
return
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
Hex_Ascii
;

;cargar en W el dato hex.


;MOVLW
MOVWF
clrf
clrf
clrf

.254
HEXADECIMAL
ASCII_H
ASCII_M
ASCII_L

;Para BCD D'0'


;Para BCD D'0'
;Para BCD D'0'

movlw
subwf
btfss
goto
movwf
incf
goto

D'100'
HEXADECIMAL,W
STATUS,C
Decenas
HEXADECIMAL
ASCII_H,F
Centenas

;D'100' --> W
;HEXADECIMAL - D'100' --> W
; HEXADECIMAL es menor que D'100' ?
;Si
;Salva el resto
;Incrementa el contador de centenas BCD
;Vuelve por otros D'100'

movlw
subwf
btfss
goto
movwf
incf
goto

D'10'
HEXADECIMAL,W
STATUS,C
Unidades
HEXADECIMAL
ASCII_M,F
Decenas

;D'10' --> W
;HEXADECIMAL - D'10' --> W
; HEXADECIMAL es menor que D'10' ?
;Si
;Salva el resto
;Incrementa el contador de decenas BCD
;Vuelve por otros D'10'

movf
movwf
clrf

HEXADECIMAL,W
ASCII_L
HEXADECIMAL

;El resto pertenece


;a las unidades BCD
;Pone a cero el registro HEXADECIMAL

movlw
iorwf
iorwf

H'30'
ASCII_L,F
ASCII_M,F

;H'30' --> W
;Convierte de BCD a ASCII
;Convierte de BCD a ASCII

movf
btfsc
goto
movlw
iorwf
return

ASCII_H,F
STATUS,Z
Espacio
H'30'
ASCII_H,F

;ASCII_H --> F
;? ASCII_H es D'00' ?
;Si
;H'30' --> W
;Convierte de BCD a ASCII
;Retorna

movlw
movwf

'0'
ASCII_H

;
Centenas
;

;
Decenas
;

;
Unidades
;

;
Bcd_A_Ascii
;

;
Espacio
;
;A' ' --> W
;A' ' --> ASCII_H

;movwf ASCII_M
;A' ' --> ASCII_H
;movwf ASCII_L
;A' ' --> ASCII_H
return
;Retorna
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
; Description: Waits 100 cycles
;------------------------------------------------------------Delayp1
movlw .23
; 1 set number of repetitions
movwf PDel0
; 1 |
PLoop02
nop
; 1 clear watchdog
decfsz PDel0, 1
; 1 + (1) is the time over?
goto
PLoop02
; 2 no, loop
PDelL12
goto
PDelL22
; 2 cycles delay
PDelL22
nop
; 1 cycle delay
return
; 2+2 Done
END
;************************************************* www.x-robotics.com *******

Das könnte Ihnen auch gefallen