por robertofonte » 30 Nov 2006 15:21
boas amigos
Vou deixar aki alguma programação ja feita por min num outro trabalho ... ( maquina de calcular de 16 bits )
Aproveitei a inicialização so lcd e do teclado ...
; declaracao de variaveis
n1 equ 52H ; numero 1
n2 equ 53H ; numero2 alarme com 4 digitos …
n3 equ 54H ; numero 3
n4 equ 55H ; numero 4
CLK equ p3.2 ;sinal de CLK que faz sincronismo para os dados
D equ p3.3 ;DATA linha para enviar e receber dados do teclado
E equ p3.5 ;strobe para indicação de nova leitura ou escrita
RW equ p3.6 ;selector leitura / escrita
RS equ p3.7 ;selector de registo
lcd equ p1 ;db0......db7 ligado ao Porto P1
oper equ 60h ;FLAG
ORG 00H
LJMP INICIO
ORG 03H ;inicializacao do RSI da interrupção externa 0
LJMP RSI
INICIO: ;configuração do LCD
LCALL ESPERA1
CLR RS
CLR RW
MOV lcd,#00111100b ;Seleccionar modo funcionamento
LCALL ESPERA2
MOV lcd,#00001110b ; Ligar/desligar LCD
MOV lcd,#00000001b ; Limpar LCD
LCALL ESPERA2
MOV lcd,#00000110b ; Modo de Entrada de Dados
LCALL ESPERA2
SETB RS ; mete o lcd em modo de receber dados
MOV IE,#10000001b ;Permita a interrupção externa 0
MOV TCON,#00000001b ; 8ºbit=1 indica q a interrupção e activada por transição
; limpeza das flags, registos e posições de memoria
mov R3,#00H
mov R6,#00H ;contador de bits
mov R2,#00H ;contador de bits
mov R0,#00H ;registo para guardar valor da tabela ASCII
mov R5,#00H
clr 0H ; flag para prender o micro ….
reb: jnb 0H,$ ;nao salta enquanto nao receber os 8 bits dados ; espera pela interru
clr 0H ;limpa a flag 0h
lcall guarda_dados ;guarda os dados enviados pelo teclado
ret
ljmp reb ;salta para reb (para aguardar a recepção de outro bit)
; sempre que há recepção dos dados do teclado é activada a interrupção externa0
RSI: inc R2 ;contador do numero de bits
cjne r2,#33,teste ; enquanto não receber os 33 bits salta para teste
mov r2,#0h ;se já recebeu os 33 bits coloca r2=0 (contador a 0)
RETI
teste: cjne r2,#1,ps10 ; compara se forem ! =, salta para ps10
ljmp sai ;se for 1 sai
ps10: cjne r2,#10,ps11 ;compara se forem ! =, salta para ps11
ljmp sai ; se for 10
ps11: cjne r2,#11,recebe ; compara se forem ! =, salta para recebe
setb 0H ; coloca a flag 0H =1
lcall reb ; quando receber 8 bits de dados salta p/ reb
RETI
recebe: cjne r2,#10, mque10 ; testa se e maior ou menor
reti
mque10: jnc sai ; "salta se for zero" se for maior que 10 nao interessa
mov c,p3.3 ,se for 1 carrega o carry com que " DATA" recebeu
RRc A ;faz a rotacao a esquerda para o ACUMULADOR
sai: RETI
;conf iguraçao dos tempos de espera do lcd (porque o LCD tem um micro interno)
ESPERA1: MOV TMOD,#00000001B ;ESPERA 30ms ; TIMER 0 no modo 0
MOV TL0,#0FEH
MOV TH0,#93H
CLR TF0 ;limpa flag do TIMER 0
SETB TR0 ; active o TIMER
JNB TF0,$ ;salta se for zero
CLR TR0
RET
ESPERA2: SETB E
LCALL ESPERA1
CLR E ;limpa strobe
LCALL ESPERA1
RET
; função que envia os dados para o LCD
envia: mov lcd,R0
lcall ESPERA2
mov p1,R0 ;Ao Porto P1 esta lido o lcd
ret
; funções para armazenamento de dados
guarda_dados: mov A,nx ;guarda dados numero "1" ;LSB
RlC A ;faz a rotação a esquerda para o ACUMULADOR
mov n1lsb,A
mov A,n1msb ;bits MSB
rlc A ;rotação a esq para ACUMULADOR
mov n1msb,A
ret
; tabela de conversão ......
Em relação a webcam estava a pensar em gravar a imagem apenas kuando o alarme disparar ....
Tipo estava a pensar gravar a imagem num SD e depois ver num pc com windows media player ou outro soft parecido....
Se calhar é um projecto maluco ....