Code:
define LOADER_USED 1
define OSC 4
define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_BITS 4
adcon1 = 7
trisa = %11111111
hour var byte ' Define hour variable
dhour var byte ' Define display hour variable
minute var byte ' Define minute variable
second var byte ' Define second variable
ticks var byte ' Define pieces of seconds variable
update var byte ' Define variable to indicate update of LCD
i var byte ' Debounce loop variable
cl var byte
buf var byte(10)
tagNum var byte
idx var byte
char var byte
tag1 data "0010828978"
@ device WDT_OFF
CMCON = 7 ' PORTA digital
Pause 100 ' Wait for LCD to startup
hour = 00 ' Set initial time to 00:00:00
minute = 00
second = 00
ticks = 00
update = 1 ' Force first display
' Set TMR0 to interrupt every 16.384 milliseconds
OPTION_REG = $55 ' Set TMR0 configuration and enable PORTB pullups
INTCON = $a0 ' Enable TMR0 interrupts
On Interrupt Goto tickint
PORTB = 0 ' PORTB lines low to read buttons
TRISB = %11001111 ' Enable buttons
' Main program loop - in this case, it only updates the LCD with the time
mainloop:
' Check any button pressed to set time
If PORTa.0 = 1 Then decmin
If PORTA.1 = 1 Then incmin
bbb:
if porta.2 = 1 then nice
' Check for time to update screen
chkup: If update = 1 Then
Lcdout $fe,1 ' Clear screen
'lcdout $FE,$c0,"Next 12:10:00"
' Display time as hh:mm:ss
dhour = hour ' Change hour 0 to 12
If (hour // 12) = 0 Then
dhour = dhour + 12
Endif
' Check for AM or PM
If hour < 12 Then
Lcdout dec2 dhour, ":", dec2 minute, ":", dec2 second, " AM"
Else
Lcdout dec2 (dhour - 12), ":", dec2 minute, ":", dec2 second, " PM"
Endif
update = 0 ' Screen updated
Endif
lcdout $FE,$c0,"Next 12:10:10 AM"
if (dhour = 12) and (minute = 10) and (second = 10) then aaa
goto mainloop
aaa:
'freqout porta.5,1000*/$100,115*/$100
sound porta.5, [200,100]
lcdout $FE,1,"please"
lcdout $FE,$c0,"Medicine!!"
high portc.0
update = 1
'pause 2000
goto mainloop
nice:
high porta.3
low portc.0
'freqout porta.5,1000*/$100,115*/$100
high porta.3
'pause 3000
serin2 portc.7,84,[str buf\10]
'nextline:
for tagnum = 1 to 2
for idx = 0 to 9
read(((tagnum-1)*10)+idx),char
if(char<>buf(idx)) then goto bad_char
next
goto tag_correct
bad_char:
next
bad_tag:
low porta.3
'pause 500
high portc.0
tagnum = 0
lcdout $FE,1,"Sorry,Wrong"
lcdout $FE,$c0,"Medicine!!"
sound porta.5, [200,100]
'freqout porta.5,1000*/$100,115*/$100
'pause 3000
lcdout $FE,1,"Please Take"
lcdout $FE,$c0,"Medicine A"
goto nice
tag_correct
low porta.4
high porta.5
freqout porta.5,2000*/$100,880*/$100
lcdout $FE,1,"Correct take"
lcdout $FE,$c0,"Medicine!!"
high portc.3
pause 3000
goto mainloop
'Goto mainloop ' Do it all foreve
' Increment minutes
incmin: minute = minute + 1
If minute >= 60 Then
minute = 0
hour = hour + 1
If hour >= 24 Then
hour = 0
Endif
Endif
Goto debounce
' Decrement minutes
decmin: minute = minute - 1
If minute >= 60 Then
minute = 59
hour = hour - 1
If hour >= 24 Then
hour = 23
Endif
Endif
' Debounce and delay for 250ms
debounce: For i = 1 to 25
Pause 10 ' 10ms at a time so no interrupts are lost
Next i
update = 1 ' Set to update screen
Goto chkup
' Interrupt routine to handle each timer tick
disable ' Disable interrupts during interrupt handler
tickint: ticks = ticks + 1 ' Count pieces of seconds
If ticks < 61 Then tiexit ' 61 ticks per second (16.384ms per tick)
' One second elasped - update time
ticks = 0
second = second + 1
If second >= 60 Then
second = 0
minute = minute + 1
If minute >= 60 Then
minute = 0
hour = hour + 1
If hour >= 24 Then
hour = 0
Endif
Endif
Endif
update = 1 ' Set to update LCD
tiexit: INTCON.2 = 0 ' Reset timer interrupt flag
Resume
End
Bookmarks