Sunteți pe pagina 1din 15

SOFTWARE

ASSEMBLER
.INCLUDE "M164PDEF.INC"

JMP MENU

.DEF TEMPO=R16

INICIO:

.DEF DATA=R26

;CONFIGURO PUERTOS

.DEF SEG=R18

LDI TEMPO,0XFF

.DEF MIN=R19

OUT DDRA,TEMPO

.DEF HORA=R20

LDI TEMPO,0B11100000

.DEF FECHA=R21

OUT DDRC,TEMPO

.DEF MES=R22

LDI TEMPO,0X00

.DEF YEAR=R23

OUT DDRB,TEMPO

.DEF DIA=R24

OUT DDRD,TEMPO

.DEF DATO=R25

;INICIALIZO SP

.DEF TECLA=R27

LDI TEMPO,HIGH(RAMEND)

.DEF ANT=R28

OUT SPH,TEMPO

.DEF CONT=R29

LDI TEMPO,LOW(RAMEND)
OUT SPL,TEMPO

.EQU EN=7
.EQU RS=6
.EQU RW=5
.EQU WA = 0XD0 ; Direccion
escritura
.EQU RA = 0XD1 ; Direecio lectura

;CONFIGURO PCINT PARA


CONFIGURAR RTS
LDI TEMPO,0B00000111
STS PCMSK1,TEMPO
LDI TEMPO,0B00000010
STS PCICR,TEMPO
LDI TEMPO,0B00001111
OUT PCIFR,TEMPO

.CSEG

SEI ;interrupciones globales

.ORG 0X0

;INICIALIZACION DE IIC

JMP INICIO

RCALL INICIAIIC

.ORG 0XA

;INICIALIZACION DE VARIABLES

ldi hora,12

RCALL WRITE_TEXT

ldi seg,0

LDI DATA,'E'

ldi min,0

RCALL WRITE_TEXT

ldi year,12

LDI DATA,':'

ldi fecha,28

RCALL WRITE_TEXT

ldi dia,3

MOV DATA,YEAR

ldi mes,3

RCALL WRITE_TEXT

CLR CONT

LDI DATA,'/'

CLR ANT

RCALL WRITE_TEXT

;ON LCD

MOV DATA,MES
RCALL WRITE_TEXT

CBI PORTC,RS

LDI DATA,'/'

LDI DATA,0X38

RCALL WRITE_TEXT

OUT PORTA,DATA

MOV DATA,FECHA

SBI PORTC,EN

RCALL WRITE_TEXT

CBI PORTC,EN

LDI DATA,' '

RCALL WAIT_LCD

RCALL WRITE_TEXT
LDI DATA,' '

MAIN:

RCALL WRITE_TEXT

rcall READIIC

MOV DATA,DIA

RCALL INIT_LCD

RCALL WRITE_TEXT

RCALL CLEAR_LCD
RCALL WAIT_LCD
LDI DATA,'D'

;SEGUNDA LINEA

RCALL WRITE_TEXT

CBI PORTC,RS

LDI DATA,'A'

LDI DATA,0XC0

RCALL WRITE_TEXT

OUT PORTA,DATA

LDI DATA,'T'

SBI PORTC,EN

CBI PORTC,EN

CPI R17,0X00

RCALL WAIT_LCD

BRNE NEXT

RCALL WAIT_LCD

RET

RCALL WAIT_LCD
LDI DATA,'T'

INIT_LCD:

RCALL WRITE_TEXT

CBI PORTC,RS

LDI DATA,'I'

LDI DATA,0X38

RCALL WRITE_TEXT

OUT PORTA,DATA

LDI DATA,'M'

SBI PORTC,EN

RCALL WRITE_TEXT

CBI PORTC,EN

LDI DATA,'E'

RCALL WAIT_LCD

RCALL WRITE_TEXT

CBI PORTC,RS

LDI DATA,':'

LDI R16,0X0E

MOV DATA,HORA

OUT PORTA,DATA

RCALL WRITE_TEXT

SBI PORTC,EN

LDI DATA,'/'

CBI PORTC,EN

RCALL WRITE_TEXT

RCALL WAIT_LCD

MOV DATA,MIN

CBI PORTC,RS

RCALL WRITE_TEXT

LDI DATA,0X06

LDI DATA,'/'

OUT PORTA,DATA

RCALL WRITE_TEXT

SBI PORTC,EN

MOV DATA,SEG

CBI PORTC,EN

RCALL WRITE_TEXT

RCALL WAIT_LCD

RJMP MAIN

RET

WAIT_LCD:

CLEAR_LCD:

LDI R17,0XAA

CBI PORTC,RS

NEXT:

LDI DATA,0X01

DEC R17

OUT PORTA,DATA

SBI PORTC,EN

CPI CONT,0

CBI PORTC,EN

BREQ MSEG

RCALL WAIT_LCD

CPI CONT,1

RET

BREQ MMIN

WRITE_TEXT:

CPI CONT,2

SBI PORTC,RS

BREQ MHORA

OUT PORTA,DATA

CPI CONT,3

SBI PORTC,EN

BREQ MFECHA

CBI PORTC,EN

CPI CONT,4

RCALL WAIT_LCD

BREQ MMES

RET

CPI CONT,5
BREQ MYEAR

MENU:

MSEG:

PUSH TEMPO

INC SEG

IN TEMPO,SREG

RJMP SALIR

PUSH TEMPO

MMIN:

RCALL WAIT_LCD

INC MIN

RCALL WAIT_LCD

RJMP SALIR

RCALL WAIT_LCD

MHORA:

IN TECLA,PINB

INC HORA

EOR TECLA,ANT

RJMP SALIR

SBRC TECLA,0

MFECHA:

RCALL SUBIR

INC FECHA

SBRC TECLA,1

RJMP SALIR

RCALL BAJAR

MMES:

SBRC TECLA,2

INC MES

RCALL SELECT

RJMP SALIR

SUBIR:

MYEAR:

INC YEAR

DMES:

RJMP SALIR

DEC MES
RJMP SALIR

BAJAR:

DYEAR:

CPI CONT,0

DEC YEAR

BREQ DSEG

RJMP SALIR

CPI CONT,1

SELECT:

BREQ DMIN
CPI CONT,2

CPI CONT,6

BREQ DHORA

BREQ RESETCONT

CPI CONT,3

INC CONT

BREQ DFECHA

RJMP SALIR

CPI CONT,4

RESETCONT:

BREQ DMES

CLR CONT

CPI CONT,5

RJMP SALIR

BREQ DYEAR
DSEG:

SALIR:

DEC SEG

RET

RJMP SALIR

RCALL WRITEIIC

DMIN:

RJMP SALIR2

DEC MIN

SALIR2:

RJMP SALIR

POP TEMPO

DHORA:

OUT SREG,TEMPO

DEC HORA

POP TEMPO

RJMP SALIR

RETI

DFECHA:
DEC FECHA
RJMP SALIR

;SUBRUTINAS DE COMUNICACIOON
IIC
INICIAIIC:

;configuro frecuencia de SCL en IIC


a 100khz
ldi tempo,8
sts twbr,tempo
ldi tempo,0x0;preescaler =1

STOPIIC:
PUSH TEMPO
IN TEMPO, SREG
PUSH TEMPO

sts twsr,tempo

ldi r16, (1<<TWINT)|(1<<TWEN)|


(1<<TWSTO)

sts twar,tempo

sts TWCR, r16

ldi tempo,(1<<twen)

pop tempo

sts twcr,tempo

out sreg,tempo

RET

pop tempo

STARTIIC:

RET

PUSH TEMPO

;error:

IN TEMPO, SREG

;rjmp IIC

PUSH TEMPO

;RET

;Send START condition


ldi r16, (1<<TWINT)|(1<<TWSTA)|
(1<<TWEN)
sts TWCR, r16
;Wait for TWINT Flag set. This
indicates that the START condition
has been transmitted

Tx_IIC:
sts TWDR,DATO
ldi r16, (1<<TWINT) | (1<<TWEN)
sts TWCR, r16

lds r16,TWCR

;Wait for TWINT Flag set. This


indicates that the DATA has been
transmitted, and ACK/NACK has
been received.

sbrs r16,TWINT

wait3:

rjmp wait1

lds r16,TWCR

pop tempo

sbrs r16,TWINT

out sreg,tempo

rjmp wait3

pop tempo

RET

RET

Rx_IICACK:;envio ACK despues de


recibir

wait1:

ldi r16, (1<<TWINT)|(1<<TWEN)|


(1<<TWEA)
RJMP wait2
;envia NACK despues de recibir
RX_IICNACK:
ldi r16, (1<<TWINT) | (1<<TWEN)
sts TWCR, r16
;Wait for TWINT Flag set. This
indicates that the SLA+W has been
transmitted, and ACK/NACK has
been received.
wait2:
lds r16,TWCR
sbrs r16,TWINT
rjmp wait2
lds dato,twdr
ret
WRITEIIC:
RCALL STARTIIC

RCALL TX_IIC
MOV DATO,HORA
RCALL TX_IIC
LDI DATO,0X04
RCALL TX_IIC
MOV DATO,FECHA
RCALL TX_IIC
LDI DATO,0X05
RCALL TX_IIC
MOV DATO,MES
RCALL TX_IIC
LDI DATO,06
RCALL TX_IIC
MOV DATO,YEAR
RCALL TX_IIC
RCALL STOPIIC
RET

LDI DATO,WA
RCALL TX_IIC

READIIC:

LDI DATO,0X0
RCALL TX_IIC
MOV DATO,SEG
RCALL TX_IIC
LDI DATO,0X01
RCALL TX_IIC
MOV DATO,MIN
RCALL TX_IIC
LDI DATO,0X02

RCALL STARTIIC
LDI DATO,WA
RCALL TX_IIC
LDI DATO,00
RCALL TX_IIC
RCALL STARTIIC
LDI DATO,RA
RCALL TX_IIC

RCALL RX_IICACK

LDI DATO,RA

MOV SEG,DATO

RCALL TX_IIC

RCALL STARTIIC

RCALL RX_IICACK

LDI DATO,WA

MOV FECHA,DATO

RCALL TX_IIC

RCALL STARTIIC

LDI DATO,01

LDI DATO,WA

RCALL TX_IIC

RCALL TX_IIC

RCALL STARTIIC

LDI DATO,05

LDI DATO,RA

RCALL TX_IIC

RCALL TX_IIC

RCALL STARTIIC

RCALL RX_IICACK

LDI DATO,RA

MOV MIN,DATO

RCALL TX_IIC

RCALL STARTIIC

RCALL RX_IICACK

LDI DATO,WA

MOV MES,DATO

RCALL TX_IIC

RCALL STARTIIC

LDI DATO,02

LDI DATO,WA

RCALL TX_IIC

RCALL TX_IIC

RCALL STARTIIC

LDI DATO,06

LDI DATO,RA

RCALL TX_IIC

RCALL TX_IIC

RCALL STARTIIC

RCALL RX_IICACK

LDI DATO,RA

MOV HORA,DATO

RCALL TX_IIC

RCALL STARTIIC

RCALL RX_IICNACK

LDI DATO,WA

MOV YEAR,DATO

RCALL TX_IIC
LDI DATO,04

PUSH DATO

RCALL TX_IIC

RCALL STOPIIC

RCALL STARTIIC

POP DATO

RET

BASCOM
$regfile "m164pdef.dat"
$crystal = 8000000

'****DECLARO SUBRUTINAS****
Declare Sub Wr()

'***CONFIGURACION DE
PUERTOS****

Declare Sub Rd()


Declare Sub Cambios()

Config Portb = Input


Portb = 255
'Config Portd = Input
'Portd = 255

'******ACTIVO INTERRUPCIONES
PARA PULSADORES Y
COMUNICACION******

On Int0 Pulsadores
'******CONFIGURO LCD******
Config Lcd = 16 * 2
Config Lcdbus = 4

Config Int0 = Falling


Enable Int0
Enable Interrupts

Config Lcdpin = Pin , Db4 = Porta.0 ,


Db5 = Porta.1 , Db6 = Porta.2 , Db7
= Porta.3 , E = Porta.5 , Rs =
Porta.4

'****DEFINO VARIABLES****

Cls

Dim Dir_r As Byte

Cursor Of

Dim Dir_w As Byte


Dim Addr As Byte
Dim Dia As Byte

'*****CONFIGURACION I2C ****

Dim Mes As Byte

Config Scl = Portc.0

Dim Year As Byte

Config Sda = Portc.1

Dim Hora As Byte

Dim Minu As Byte


Dim Seg As Byte
Dim Fecha As Byte
Dim A As Byte

'************************************
******
'***********PROGRAMA
PRINCIPAL*************

Dim Cont As Byte


Dim Up As Byte

Do

Dim M As Byte
Dim Aux As Byte

If Cont = 1 Then
Gosub Cambios

'Cambio Alias Portd.0


End If
Cont = 0
Dir_w = &HD0
Dir_r = &HD1
Dia = 2
Mes = &H02
Year = &H12
Hora = &B00100011

Gosub Rd
Locate 1 , 1
Lcd "FECHA:" ; Bcd(fecha) ; "/" ;
Bcd(mes) ; "/20" ; Bcd(year) ; " "
Locate 2 , 1
Lcd " HORA: " ; Bcd(hora) ; ":" ;
Bcd(minu) ; ":" ; Bcd(seg) ; " "

Minu = &H59
Seg = &H50

Loop

Fecha = &H28
Addr = 0
A=0
Up = 0
M=0
Gosub Wr

Sub Wr()
Addr = 0
I2cstart
I2cwbyte Dir_w
I2cwbyte Addr

I2cwbyte Seg
I2cwbyte Minu

Sub Cambios()

I2cwbyte Hora

Cls

I2cwbyte Dia
I2cwbyte Fecha
I2cwbyte Mes

Up = Makedec(hora)

I2cwbyte Year

Do

I2cstop

Hora = Makebcd(up)

End Sub

Locate 1 , 1
Lcd " CAMBIO HORA"

Sub Rd()

Locate 2 , 1

Addr = 0

Lcd "

I2cstart

Loop Until Cont > 1

" ; Bcd(hora)

I2cwbyte Dir_w
I2cwbyte Addr

Up = Makedec(minu)

I2cstart

Do

I2cwbyte Dir_r

Minu = Makebcd(up)

I2crbyte Seg , Ack

Locate 1 , 1

I2crbyte Minu , Ack

Lcd " CAMBIO MINUTOS"

I2crbyte Hora , Ack

Locate 2 , 1

I2crbyte Dia , Ack

Lcd "

I2crbyte Fecha , Ack

Loop Until Cont > 2

" ; Bcd(minu)

I2crbyte Mes , Ack


I2crbyte Year , Nack

Up = Makedec(year)

I2cstop

Do

End Sub

Year = Makebcd(up)

Locate 1 , 1
Lcd " CAMBIO YEAR

M = 29
"

End If

Locate 2 , 1

If Aux = 2 Then

Lcd "

M = 28

20" ; Bcd(year)

Loop Until Cont > 3

End If
End If

If Up = 0 Or Up = 4 Or Up = 8 Or Up
= 12 Or Up = 16 Or Up = 20 Or Up
= 24 Or Up = 28 Then

If Up = 3 Then M = 31

Aux = 1

If Up = 4 Then M = 30

Else
If Up = 5 Then M = 31

Aux = 2
End If

If Up = 6 Then M = 30
Up = Makedec(mes)
If Up = 7 Then M = 31

Do
Mes = Makebcd(up)

If Up = 8 Then M = 31

Locate 1 , 1
Lcd " CAMBIO MES

"

Locate 2 , 1
Lcd "

If Up = 9 Then M = 30

" ; Bcd(mes) ; " "

Loop Until Cont > 4

If Up = 10 Then M = 31

If Up = 1 Then M = 31

If Up = 11 Then M = 30

If Up = 2 Then

If Up = 12 Then M = 31

If Aux = 1 Then

Up = Up + 1
Up = Makedec(fecha)

End If

Do

If Up = 24 Then Up = 0

Fecha = Makebcd(up)

End If

Locate 1 , 1
Lcd " CAMBIO DIA

"

If Cont = 2 Then

Locate 2 , 1

If Up < 60 Then

Lcd "

Up = Up + 1

" ; Bcd(fecha) ; " "

Loop Until Cont > 5

End If
If Up = 60 Then Up = 0

Cont = 0

End If

Gosub Wr
If Cont = 3 Then
End Sub

If Up < 60 Then
Up = Up + 1

'******INTERRUPCION******

End If
If Up = 60 Then Up = 0

Pulsadores:

End If

A = Pinb
If A = &B11111110 Then

If Cont = 4 Then

Cont = Cont + 1

If Up < 13 Then

End If

Up = Up + 1
End If

If A = &B11111101 Then
If Cont = 1 Then
If Up < 24 Then

If Up = 13 Then Up = 1
End If

If Cont = 5 Then
If Up <= M Then

If Cont = 3 Then

Up = Up + 1

If Up > 0 Then

End If

Up = Up - 1

If Up > M Then Up = 1

Else

End If

Up = 59
End If

End If

End If

If Cont = 4 Then
If A = &B11111011 Then
If Cont = 1 Then

If Up > 1 Then
Up = Up - 1

If Up > 0 Then

Else

Up = Up - 1

Up = 12

Else

End If

Up = 23

End If

End If
End If

If Cont = 5 Then
If Up > 1 Then

If Cont = 2 Then

Up = Up - 1

If Up > 0 Then

Else

Up = Up - 1

Up = M

Else

End If

Up = 59
End If
End If

End If
End If
Return

HARDWARE

S-ar putea să vă placă și