Documente Academic
Documente Profesional
Documente Cultură
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
.CSEG
.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
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:
STOPIIC:
PUSH TEMPO
IN TEMPO, SREG
PUSH TEMPO
sts twsr,tempo
sts twar,tempo
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
Tx_IIC:
sts TWDR,DATO
ldi r16, (1<<TWINT) | (1<<TWEN)
sts TWCR, r16
lds r16,TWCR
sbrs r16,TWINT
wait3:
rjmp wait1
lds r16,TWCR
pop tempo
sbrs r16,TWINT
out sreg,tempo
rjmp wait3
pop tempo
RET
RET
wait1:
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****
'******ACTIVO INTERRUPCIONES
PARA PULSADORES Y
COMUNICACION******
On Int0 Pulsadores
'******CONFIGURO LCD******
Config Lcd = 16 * 2
Config Lcdbus = 4
'****DEFINO VARIABLES****
Cls
Cursor Of
'************************************
******
'***********PROGRAMA
PRINCIPAL*************
Do
Dim M As Byte
Dim Aux As Byte
If Cont = 1 Then
Gosub Cambios
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
" ; Bcd(hora)
I2cwbyte Dir_w
I2cwbyte Addr
Up = Makedec(minu)
I2cstart
Do
I2cwbyte Dir_r
Minu = Makebcd(up)
Locate 1 , 1
Locate 2 , 1
Lcd "
" ; Bcd(minu)
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)
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
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
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