PCF8583 Demo Code
Onderstaand programmaatje is geschreven voor de 18F25K22 in Proton Basic.
Het programma kijkt eerst of de PCF8583 “leeg” is.
Als dit zo is wordt “Do 28 Feb 2012 23:59:55” als start tijd gebruikt.
Verder blijft de klok “oneindig” doorlopen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | '**************************************************************** '* Name : PCF8583.BAS * '* Author : H. Zeeman * '* Notice : Copyright (c) 2012 Knutselaar.eu * '* : All Rights Reserved * '* Date : mrt/23/2012 * '* Version : 1.0 * '* Notes : Demo programma voor de PCF8583 * '* : Voor 16 x 2 LCD met Proton default aanstluiting * '**************************************************************** ;Device 18F25K20 Device 18F25K22 CONFIG_START ;FOSC = HS ;external oscillator For 18F25K20 FOSC = HSMP ;external oscillator for 18F25K22 ;FOSC = INTIO67 ;Internal oscillator block, port function on RA6 and RA7 FCMEN = Off ;Fail-Safe Clock Monitor disabled IESO = Off ;internal external switchover mode ;PWRT = On ;power-up timer For 18F25K20 PWRTEN = On ;power-up timer For 18F25K22 BOREN = On ;brown-out reset ;BORV = 27 ;brown-out reset value (2,7V) For 18F25K20 BORV = 285 ;brown-out reset value (2,85V) for 18F25K22 WDTEN = Off ;watchdog timer WDTPS = 128 ;1:128 WDT prescalar PBADEN = Off ;analog port B<4:0> STVREN = On ;stack overflow reset LVP = Off ;low voltage programming XINST = Off ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode) Debug = Off ;no debug ;CCP2MX = PORTBE ;CCP2 input/output is multiplexed with RB3 For 18F25K20 ;CCP2MX = PORTB3 ;CCP2 input/output is multiplexed with RB3 For 18F25K22 CONFIG_END XTAL 8 ;ALL_DIGITAL TRUE ;Werkt bij mij niet voor de 18F25K22 (moet met ANSELx) ANSELC = %00100111 ;Voor 18F25K22 Poort C RX,TX,SCL en SDA digitaal maken ANSELA = %11011111 ;Voor 18F25K22 Poort A5 (LED) digitaal maken Dim Minuten As Byte ; minuten (decimaal) Dim Seconden As Byte ; seconden (decimaal) Dim Uren As Byte ; uren (decimaal Dim Dag As Byte ; datum v/d maand (decimaal Dim Maand As Byte ; maand (decimaal) Dim JaarVier As Byte ; jaar zoals in PCF8583 (hoogste 2 bits in YearDays) Dim Jaar As Word ; jaar Dim Weekdag As Byte Dim WeekdagString[2] As Byte Dim MaandString[3] As Byte ;Het jaar wordt in de PCF8385 alleen bijgehouden in een vier ;jaars tijdvak (0 tot 3) waarbij 0 het schrikkeljaar is. ;De software waarin de PCF8385 opgenomen is moet zelf een ;variable bijhouden waaruit het uiteindelijke jaar berekend kan worden. ;In dit voorbeeld wordt daar JaarDev4 voor gebruikt. JaarDev4 ;moet met 1 verhoogd worden wanneer het jaar in de PCF8583 ;van 3 naar 0 verandert. Dim YearDays As Byte ;bit 0 tot 3 voor dag eenheden, bit 4 ;en 5 voor dag tientallen (0-3), bit 6 en 7 jaar (0-3). Dim WeekDayMonths As Byte ;bit 0 tot 3 voor maand eenheden, bit 4 voor maand ;tientallen (0-1), bit 5 tot 7 weekdagen (0-6). Dim secs As Byte ;bit 0 tot 3 voor seconden eenheden, bit 4 tot 6 ;voor seconden tientallen (0-5), bit 7 niet gebruikt. Dim mins As Byte ;bit 0 tot 3 voor minuten eenheden, bit 4 tot 6 ;voor minuten tientallen (0-5), bit 7 niet gebruikt. Dim hrs As Byte ;bit 0 t0t 3 voor uren eenheden, bit 4 en 5 ;voor uren tientallen (0-2), bit 6 0=AM 1=PM , bit 7 0=24 ;uur mode, 1=12 uur mode(AM/PM). Dim JaarDev4 As Byte ;hoogste 7 bits = jaar - 2000 gedeeld door 4 ;(wordt niet door PCF8583 geupdate), laagste bit is jaar3 flag Dim jaar3 As Byte ;flag om de jaar overgang van 3 naar 0 ;(schrikkeljaar)te kunnen detecteren voor update van JaarDev4 Dim dummy As Byte ;hulp variable. Symbol Speaker = PORTC.0 Symbol LED = PORTA.5 Sound Speaker , [115,20] Cls Print At 1,1, "Knutselaar.eu" DelayMS 2000 GoSub getTime If hrs = 0 And YearDays = 1 And WeekDayMonths = 1 Then ;reset status van de PCF8583. (PCF8583 is leeg) GoSub setTime ;Stelt klok op "Do 28 Feb 2012 23:59:55" in. End If Loop: GoSub getTime Print At 1 , 1, Str WeekdagString, " ", DEC2 Dag," ",Str MaandString," ", DEC4 Jaar, " " Print At 2 , 1 , @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " " DelayMS 100 Toggle LED GoTo Loop getTime: HBusIn %10100000, $02, [secs, mins, hrs,YearDays,WeekDayMonths] ;haal tijd op vanuit de PCF8583 HBusIn %10100000, $10, [ JaarDev4 , jaar3] ;haal jaar op (-2000 / 4) Seconden = ((secs >> 4) * 10) + (secs & 15) ;zie proton help "Math Operators" Minuten = ((mins >> 4) * 10) + (mins & 15) Uren = ((hrs >> 4) * 10) + (hrs & 15) Dag = (((YearDays >> 4 ) & 3 ) * 10) + (YearDays & 15) Maand = (((WeekDayMonths >> 4) & 1 ) * 10) + (WeekDayMonths & 15) JaarVier = (YearDays >> 6) Weekdag = (WeekDayMonths >> 5) Jaar = 2000 + JaarVier + (JaarDev4*4) If JaarVier = 3 Then ;Twee if statements om JaarDev4 eens in de 4 jaar te verhogen jaar3 = 1 ;Bij overgang naar schrikkeljaar HBusOut %10100000, $11, [ jaar3 ] End If If JaarVier = 0 And jaar3 = 1 Then ; omslag naar jaar 0 (schrikkeljaar) jaar3 = 0 JaarDev4 = JaarDev4 + 1 ; JaarDev ophogen met 1 HBusOut %10100000, $10, [ JaarDev4, jaar3 ] End If Select Case Weekdag Case 0 Str WeekdagString = "Zo" Case 1 Str WeekdagString = "Ma" Case 2 Str WeekdagString = "Di" Case 3 Str WeekdagString = "Wo" Case 4 Str WeekdagString = "Do" Case 5 Str WeekdagString = "Vr" Case 6 Str WeekdagString = "Za" End Select Select Case Maand Case 1 Str MaandString = "Jan" Case 2 Str MaandString = "Feb" Case 3 Str MaandString = "Mar" Case 4 Str MaandString = "Apr" Case 5 Str MaandString = "Mei" Case 6 Str MaandString = "Jun" Case 7 Str MaandString = "Jul" Case 8 Str MaandString = "Aug" Case 9 Str MaandString = "Sep" Case 10 Str MaandString = "Okt" Case 11 Str MaandString = "Nov" Case 12 Str MaandString = "Dec" End Select Return setTime: ;Wordt in dit voorbeeld alleen gebruikt om lege PCF8583 te vullen Seconden = 55 ;Waarden voor "Do 28 Feb 2012 23:59:55" (testen schrikkeldag) Minuten = 59 Uren = 23 Dag = 28 Maand = 2 Jaar = 2012 Weekdag = 4 ; Donderdag dummy=Seconden/10 ;dummy is tientallen van Seconden dummy=dummy*16 ;waarde doorschuiven naar de vier MSB secs=Seconden//10 ;secs is eenheden van Seconden secs=secs | dummy ;Bitwise OR combineert beide waarden in een byte dummy=Minuten/10 dummy=dummy*16 mins=Minuten//10 mins=mins | dummy dummy=Uren/10 dummy=dummy*16 hrs=Uren//10 hrs=hrs | dummy JaarVier = (Jaar - 2000) // 4 'rest van Jaar-2000 gedeelt door 4 YearDays = (JaarVier << 6) + ((Dag / 10) << 4) + (Dag // 10) JaarDev4 = ((Jaar - 2000) / 4) ;Integer van Jaar-2000 gedeeld door 4 WeekDayMonths = (Weekdag << 5) + ((Maand/10) << 4) + (Maand //10) HBusOut %10100000, $02, [ secs,mins,hrs, YearDays,WeekDayMonths ] HBusOut %10100000, $10, [ JaarDev4 ] Return |
Meer demo’s:
Demo code 1 Knops wekker(PCF8583).