ME Labs, Inc. 719-520-5323 |
ME Labs, Inc. | 1-719-520-5323 | Example Program - CLOCKX4.pbpPICBASIC PRO program for LCD clock using On Interrupt. Uses TMR0 and prescaler. Watchdog Timer should be set to off at program time and Nap and Sleep should not be used. Button may be used to set time' Name : CLOCKX4.pbp ' Compiler : PICBASIC PRO Compiler 2.6 ' Assembler : PM ' Target PIC : 8-pin PIC12F675 or similar type ' Hardware : Lab-X4 board ' Oscillator : 4MHz internal ' Keywords : ON INTERRUPT, SEROUT2, TIMER0 ' Description : PICBASIC PRO program for LCD clock using On Interrupt. ' Uses TMR0 and prescaler. Watchdog Timer should be set to off at program ' time and Nap and Sleep should not be used. Button may be used to set time ' @ device intrc_osc_noclkout, wdt_off, mclr_off Define OSCCAL_1K 1 ' PIC12F675, Calibrate internal oscillator LCD Var GPIO.1 ' LCD TX pin PB Var GPIO.3 ' Alias GPIO.3 to push button T2400 Con 396 ' 2400 baud, true 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 mainloop variable ANSEL = 0 ' Set all digital CMCON = 7 ' Analog comparators off Pause 500 ' Wait for LCD to startup hour = 0 ' Set initial time to 00:00:00 minute = 0 second = 0 ticks = 0 update = 1 ' Force first display ' Set TMR0 to interrupt every 16.384 milliseconds OPTION_REG = $d5 ' Set TMR0 configuration INTCON = $a0 ' Enable TMR0 interrupts On Interrupt Goto tickint ' Main program mainloop mainloop: ' Check button pressed to set time If PB = 0 Then minute = minute + 1 ' Increment minutes If minute >= 60 Then minute = 0 hour = hour + 1 If hour >= 24 Then hour = 0 Endif Endif For i = 1 To 100 ' Debounce and delay for 100ms Pause 1 ' 1ms at a time so no interrupts are lost Next i update = 1 ' Set to update screen Endif ' Check for time to update screen If update = 1 Then ' Display time as hh:mm:ss dhour = hour ' Change hour 0 to 12 If (hour // 12) = 0 Then dhour = dhour + 12 Endif INTCON = $80 ' No interrupts during Serout2 ' Check for AM or PM If hour < 12 Then Serout2 LCD, T2400, [$fe, 1, dec2 dhour, ":", dec2 minute, ":", dec2 second, " AM"] Else Serout2 LCD, T2400, [$fe, 1, dec2 (dhour - 12), ":", dec2 minute, ":", dec2 second, " PM"] Endif update = 0 ' Screen updated INTCON = $a0 ' Enable TMR0 interrupts Endif Goto mainloop ' Do it all forever ' 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 Download the program file. |
Copyright 2022 ME Labs, Inc. PO Box 8250 Asheville NC 28814 (719) 520-5323 (719) 520-1867 fax email: support@melabs.com |
|