With the first version was not easy to set the time. So I made a second version.
Circuit:
Keyboard:
Mainprint (With osme small faults in).
Mar 25 2008
With the first version was not easy to set the time. So I made a second version.
Circuit:
Keyboard:
Mainprint (With osme small faults in).
Apr 26 2008
The code is ready:
Device 16F877A Config XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, PWRTE_ON XTAL 3',2768 MHz ALL_DIGITAL true 'Lcd declaraties Symbol Lengte = 16 Symbol Regels = 2 Declare LCD_DTPIN PORTD.4 Declare LCD_ENPIN PORTD.1 Declare LCD_RSPIN PORTD.0 Declare LCD_INTERFACE 4 Declare LCD_LINES Regels 'Knoppen Symbol Knop1 = PORTE.2 Symbol Knop2 = PORTA.0 Symbol Knop3 = PORTA.4 Symbol Knop4 = PORTC.0 Symbol Knop5 = PORTA.1 Symbol Knop6 = PORTA.5 Symbol Knop7 = PORTC.1 Symbol Knop8 = PORTA.2 Symbol Knop9 = PORTE.0 Symbol Knop0 = PORTA.3 Symbol Knopenter = PORTE.1 Symbol Knopback = PORTC.2 Symbol Back = 10 Symbol Enter = 11 Dim Knop As Byte Dim Uren10 As Byte Dim Uren1 As Byte Dim Min10 As Byte Dim Min1 As Byte 'Algemeen Dim Index As Byte Dim intAan As Bit Dim temp As Byte Dim initbit As Bit 'Leds Symbol rij0 = PORTC.7 Symbol rij1 = PORTC.6 Symbol rij2 = PORTC.5 Symbol rij3 = PORTC.4 Symbol rij4 = PORTD.3 Symbol rij5 = PORTD.2 Symbol ledKolom = PORTB Dim ledTabel[6] As Byte TRISB = 0 'Tijden Dim Uren As Byte Dim Minuten As Byte Dim Seconden As Byte Dim Tijd As DWord Dim LedTijd As Word 'Interupt Symbol T0IE = INTCON.5 'TMR0 Overflow Interrupt Enable Symbol T0IF = INTCON.2 'TMR0 Overflow Interrupt Flag Symbol GIE = INTCON.7 'Global Interrupt Enable Symbol PS0 = OPTION_REG.0 'Prescaler bit-0 Symbol PS1 = OPTION_REG.1 'Prescaler bit-1 Symbol PS2 = OPTION_REG.2 'Prescaler bit-2 Symbol PSA = OPTION_REG.3 'Prescaler Assignment Symbol T0CS = OPTION_REG.5 'Timer0 Clock Source Select Dim klaarBit As Bit '**************************************************************** Init: 'Interupt (Maar nog niet inschakelen) '3276800/4*256*128*25=1sec PSA = 0 'Prescaler op het externe cristal zetten PS0 = 1 'De prescaler op 255x zetten PS1 = 1 PS2 = 1 T0CS = 0 TMR0 = 128 T0IF = 0 T0IE = 0 GIE = 0 'Lcd wissen Cls DelayMS 30 GoSub DispClear 'registers clearen Clear 'Opstartscherm Print At 1, 1, " Elektro-Stynus " Print At 2, 1, "Led-Aftelklok V2" DelayMS 1000 'Tijd instellen GoSub Instellen If initbit = 1 Then initbit = 0 GoTo Init EndIf Uren = Uren10 * 10 Uren = Uren + Uren1 Minuten = Min10 * 10 Minuten = Minuten + Min1 'Tijd per led uitrekenen Tijd = Uren * 60 Tijd = Tijd + Minuten LedTijd = Tijd / 37 GoSub DispClear Print At 1, 1, "Resterende tijd:" T0IE = 1 GIE = 1 'Alle leds aan ledTabel[0] = 255 ledTabel[1] = 255 ledTabel[2] = 255 ledTabel[3] = 255 ledTabel[4] = 255 ledTabel[5] = 255 GoTo Main '**************************************************************** Main: 'Leds berekenen 'Array's invullen If Tijd > (LedTijd * 30) Then '5de rij array plaatsen If Tijd > (LedTijd * 36) Then ledTabel[5] = %00111111 Else If Tijd > (LedTijd * 35) Then ledTabel[5] = %00011111 Else If Tijd > (LedTijd * 34) Then ledTabel[5] = %00001111 Else If Tijd > (LedTijd * 33) Then ledTabel[5] = %00000111 Else If Tijd > (LedTijd * 32) Then ledTabel[5] = %00000011 Else ledTabel[5] = %00000001 EndIf EndIf EndIf EndIf EndIf ledTabel[0] = 255 ledTabel[1] = 255 ledTabel[2] = 255 ledTabel[3] = 255 ledTabel[4] = 255 Else '4de rij array plaatsen If Tijd > (LedTijd * 24) Then If Tijd > (LedTijd * 30) Then ledTabel[4] = %00111111 Else If Tijd > (LedTijd * 29) Then ledTabel[4] = %00011111 Else If Tijd > (LedTijd * 28) Then ledTabel[4] = %00001111 Else If Tijd > (LedTijd * 27) Then ledTabel[4] = %00000111 Else If Tijd > (LedTijd * 26) Then ledTabel[4] = %00000011 Else ledTabel[4] = %00000001 EndIf EndIf EndIf EndIf EndIf ledTabel[0] = 255 ledTabel[1] = 255 ledTabel[2] = 255 ledTabel[3] = 255 ledTabel[5] = 0 Else '3de rij array plaatsen If Tijd > (LedTijd * 18) Then If Tijd > (LedTijd * 24) Then ledTabel[3] = %00111111 Else If Tijd > (LedTijd * 23) Then ledTabel[3] = %00011111 Else If Tijd > (LedTijd * 22) Then ledTabel[3] = %00001111 Else If Tijd > (LedTijd * 21) Then ledTabel[3] = %00000111 Else If Tijd > (LedTijd * 20) Then ledTabel[3] = %00000011 Else ledTabel[3] = %00000001 EndIf EndIf EndIf EndIf EndIf ledTabel[0] = 255 ledTabel[1] = 255 ledTabel[2] = 255 ledTabel[4] = 0 ledTabel[5] = 0 Else '2de rij array plaatsen If Tijd > (LedTijd * 12) Then If Tijd > (LedTijd * 18) Then ledTabel[2] = %00111111 Else If Tijd > (LedTijd * 17) Then ledTabel[2] = %00011111 Else If Tijd > (LedTijd * 16) Then ledTabel[2] = %00001111 Else If Tijd > (LedTijd * 15) Then ledTabel[2] = %00000111 Else If Tijd > (LedTijd * 14) Then ledTabel[2] = %00000011 Else ledTabel[2] = %00000001 EndIf EndIf EndIf EndIf EndIf ledTabel[0] = 255 ledTabel[1] = 255 ledTabel[3] = 0 ledTabel[4] = 0 ledTabel[5] = 0 Else '1ste rij array plaatsen If Tijd > (LedTijd * 6) Then If Tijd > (LedTijd * 12) Then ledTabel[1] = %00111111 Else If Tijd > (LedTijd * 11) Then ledTabel[1] = %00011111 Else If Tijd > (LedTijd * 10) Then ledTabel[1] = %00001111 Else If Tijd > (LedTijd * 9) Then ledTabel[1] = %00000111 Else If Tijd > (LedTijd * 8) Then ledTabel[1] = %00000011 Else ledTabel[1] = %00000001 EndIf EndIf EndIf EndIf EndIf ledTabel[0] = 255 ledTabel[2] = 0 ledTabel[3] = 0 ledTabel[4] = 0 ledTabel[5] = 0 Else '0ste rij array plaatsen If Tijd > (LedTijd * 6) Then ledTabel[0] = %00111111 Else If Tijd > (LedTijd * 5) Then ledTabel[0] = %00011111 Else If Tijd > (LedTijd * 4) Then ledTabel[0] = %00001111 Else If Tijd > (LedTijd * 3) Then ledTabel[0] = %00000111 Else If Tijd > (LedTijd * 2) Then ledTabel[0] = %00000011 Else ledTabel[0] = %00000001 EndIf EndIf EndIf EndIf EndIf ledTabel[1] = 0 ledTabel[2] = 0 ledTabel[3] = 0 ledTabel[4] = 0 ledTabel[5] = 0 EndIf EndIf EndIf EndIf EndIf TRISB = 0 'Leds aansturen Call ledUit 'Display aansturen Print At 2, 4, DEC2 Uren, ":", DEC2 Minuten, ":", DEC2 Seconden If klaarBit = 1 Then GoTo Klaar EndIf If Knopback = 0 Then GoTo cancel EndIf GoTo Main '**************************************************************** Klaar: klaarBit = 0 T0IE = 0 GIE = 0 GoSub DispClear Print At 1, 1, " Klaar! " Print At 2, 1, " (enter = reset) " While 1 = 1 If Knopenter = 0 Then GoTo Init EndIf Wend '**************************************************************** cancel: klaarBit = 0 T0IE = 0 GIE = 0 GoSub DispClear Print At 1, 1, " Druk op Enter om" Print At 2, 1, " te resetten " While 1 = 1 If Knopenter = 0 Then GoTo Init EndIf Wend '**************************************************************** 'Interrupt routine ON_HARDWARE_INTERRUPT GoTo Interupt Interupt: 'Checken of de interrrupt wel van timer0 komt If T0IF = 1 Then T0IF = 0 'Timer overflow flag weer resetten TMR0 = 118 'Normaal 128 maar door afweiking kristal 118 Inc Index '1 sec is afgelopen If Index = 26 Then Index = 0 'Tijd aftellen Dec Seconden 'Als de seconden "op zijn" dan minuut aftellen If Seconden = 255 Then Seconden = 59 Dec Minuten Dec Tijd 'Als de minuten "op zijn" dan uur aftellen If Minuten = 255 Then Minuten = 59 Dec Uren 'Als uren "op" zijn dan klaar If Uren = 255 Then 'Klaar! T0IE = 1 GIE = 1 klaarBit = 1 EndIf EndIf EndIf EndIf EndIf Context Restore ' Restore the registers and exit the interrupt '**************************************************************** subroutines: '************************************************************ 'Tijden instellen Instellen: 'Scherm wissen GoSub DispClear Print At 1, 1, "Tijd: uu:mm" '**************************************************** 'Tientallen van de uren urenInstellenHoog: 'Cursor op positie 6 zetten Print $FE ,128 For Index = 1 To 6 Print $FE, $14 Next Print $FE, $0F GoSub Inlezen 'Terug If Knop = Back Then DelayMS 500 GoTo urenInstellenHoog EndIf 'Enter If Knop = Enter Then GoTo urenInstellenHoog EndIf 'Lcd aansturen Print Dec Knop 'Tijd in variabele zetten Uren10 = Knop * 10 DelayMS 500 '**************************************************** 'Eenheden uren urenInstellenLaag: 'Cursor op positie 7 zetten Print $FE ,128 'cursor naar pos 1,1 For Index = 1 To 7 Print $FE, $14 'Cursor 1 positie naar rechts opschuiven Next Print $FE, $0F GoSub Inlezen 'Terug If Knop = Back Then DelayMS 500 GoTo urenInstellenHoog EndIf 'Enter If Knop = Enter Then GoTo urenInstellenLaag EndIf 'Lcd aansturen Print Dec Knop 'Tijd in variabele zetten Uren1 = Knop DelayMS 500 '**************************************************** 'Tientallen van de Minuten minutenInstellenHoog: 'Cursor op positie 9 zetten Print $FE ,128 For Index = 1 To 9 Print $FE, $14 Next Print $FE, $0F GoSub Inlezen 'Terug If Knop = Back Then DelayMS 500 GoTo urenInstellenLaag EndIf 'Kijken of het aantal niet hoger is dan 6 If Knop > 5 And Knop < 10 Then 'Bij 6 accepteren maar volgende input automatisch 0 maken If Knop = 6 Then Min10 = 6 Min1 = 0 Print "60" GoTo StartenOfTerug Else GoTo minutenInstellenHoog EndIf EndIf 'Enter If Knop = Enter Then GoTo minutenInstellenHoog EndIf 'Lcd aansturen Print Dec Knop 'Tijd in variabele zetten Min10 = Knop DelayMS 500 '**************************************************** 'Eenheden Minuten minutenInstellenLaag: 'Cursor op positie 10 zetten Print $FE ,128 'cursor naar pos 1,1 For Index = 1 To 10 Print $FE, $14 Next Print $FE, $0F GoSub Inlezen 'Terug If Knop = Back Then DelayMS 500 GoTo minutenInstellenHoog EndIf 'Enter If Knop = Enter Then GoTo minutenInstellenLaag EndIf 'Lcd aansturen Print Dec Knop 'Tijd in variabele zetten Min1 = Knop DelayMS 500 '**************************************************** 'Starten of terug? StartenOfTerug: Print $FE, $0C Print At 2, 11, "KLAAR?" DelayMS 500 If Knopback = 0 Then DelayMS 500 GoTo minutenInstellenLaag EndIf 'Enter If Knopenter = 0 Then GoTo Vergrendelen EndIf GoTo StartenOfTerug '**************************************************** Vergrendelen: Print At 1,1, " Tijd Ingesteld " Print At 2,1, " Starten? " DelayMS 500 While 1 = 1 If Knopback = 0 Then initbit = 1 Return EndIf If Knopenter = 0 Then DelayMS 1000 Return EndIf Wend Return '************************************************************ 'Knoppen inlezen Inlezen: While 1 = 1 If Knop0 = 0 Then Knop = 0 Return EndIf If Knop1 = 0 Then Knop = 1 Return EndIf If Knop2 = 0 Then Knop = 2 Return EndIf If Knop3 = 0 Then Knop = 3 Return EndIf If Knop4 = 0 Then Knop = 4 Return EndIf If Knop5 = 0 Then Knop = 5 Return EndIf If Knop6 = 0 Then Knop = 6 Return EndIf If Knop7 = 0 Then Knop = 7 Return EndIf If Knop8 = 0 Then Knop = 8 Return EndIf If Knop9 = 0 Then Knop = 9 Return EndIf If Knopback = 0 Then Knop = 10 Return EndIf If Knopenter = 0 Then Knop = 11 Return EndIf Wend Return '************************************************************ 'cls wil niet werken bij dit lcd dus daarom zo: DispClear: Print At 1, 1, " " Print At 2, 1, " " DelayMS 500 Return '************************************************************ 'Led matrix aansturen ledUit: 'Rij 0 High rij0 ledKolom = ledTabel[0] DelayMS 1 Low rij0 'Rij 1 High rij1 ledKolom = ledTabel[1] DelayMS 1 Low rij1 'Rij 2 High rij2 ledKolom = ledTabel[2] DelayMS 1 Low rij2 'Rij 3 High rij3 ledKolom = ledTabel[3] DelayMS 1 Low rij3 'Rij 0 High rij4 ledKolom = ledTabel[4] DelayMS 1 Low rij4 'Rij 5 High rij5 ledKolom = ledTabel[5] DelayMS 1 Low rij5 'Rij 0 High rij5 ledKolom = ledTabel[5] DelayMS 1 Low rij5 Return '**************************************************************** End