ARAMA YAPIN

20 Ekim 2016 Perşembe

16f88 ile Dijital Saat Devresi

                         
   16F628A ile sürülmüş LCD Ekran Bağlantısı, 16F88 microchipe uygulanabilir.
Portlar benzer olduğundan sorunsuz çalışır.
Alttaki bas kodlarını kopyalayıp derleyici programına atabilirsiniz.

' PIC16F88 microchip ile LCD Ekranlı Saat Projesi
'04 ekim 2016
'
' Demonstrate operation of an LCD in 4-bit mode
'
' LCD should be connected as follows:
'       LCD     PICmicro
'       DB4     PortA.0
'       DB5     PortA.1
'       DB6     PortA.2
'       DB7     PortA.3
'       RS      PortA.4 (add 4.7K pullup resistor to 5 volts)
'       E       PortB.3
'       RW      Ground
'       Vdd     5 volts
'       Vss     Ground
'       Vo      20K potentiometer (or ground)
'       DB0-3   No connect
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

' Turn off Watchdog Timer and disable reset so button can be used to set clock

  OSCCON = %01100000  ' kristalsiz çalışıyor

 @ DEVICE pic16F88, INTRC_OSC_NOCLKOUt,MCLR_off

       CMCON = 7       ' PORTA digital
       Pause 100       ' Wait for LCD to startup




        ANSEL = 0       ' PORTA is digital
        CMCON = 7       ' PORTA digital
        Pause 100       ' Wait for LCD to startup

        hour = 0        ' Set initial time to 12:00:00 AM
        minute = 0
        second = 0
        ticks = 0

        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


' Main program loop - in this case, it only updates the LCD with the time
mainloop:
        ' Check any button pressed to set time
        If PORTB.7 = 0 Then decmin
        If PORTA.5 = 0 Then incmin

        ' Check for time to update screen
chkup:  If update = 1 Then
                Lcdout $fe, 1   ' Clear screen

                ' 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

        Goto mainloop   ' Do it all forever


' 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