DEVICE 16F628A CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_On, BODEN_ON ; niet vergeten mclr pull-uppen XTAL = 4 'Internal xtal = 4 MHz ALL_DIGITAL = 1 'Set PORTA and PORTB to all digital '76543210 TRISA = %00000000 TRISB = %11000010 SYMBOL drivera PORTA.6 SYMBOL driverd PORTA.7 SYMBOL driverb PORTA.0 SYMBOL driverc PORTA.1 SYMBOL TSOP PORTB.1 SYMBOL ltienuren PORTB.0 ; de l van led staat ervoor om botsing met de vars te voorkomen SYMBOL luren PORTA.2 SYMBOL ltienminuten PORTA.3 SYMBOL lminuten PORTB.4 ; --> verhuizen naar b.4 vanaf porta.4 DECLARE SDA_PIN PORTB.3 DECLARE SCL_PIN PORTB.2 DECLARE RC5IN_PIN TSOP DIM RC5_WORD AS WORD ' Create a WORD variable to receive the data DIM RC5_COMMAND AS RC5_WORD.LOWBYTE ' Alias the COMMAND byte to RC5_WORD low byte DIM RC5_SYSTEM AS RC5_WORD.HIGHBYTE ' Alias the COMMAND byte to RC5_WORD high byte DIM Buisje AS BYTE DIM gelezenseconden AS BYTE DIM wgww AS BYTE DIM tienuren AS BYTE DIM uren AS BYTE DIM tienminuten AS BYTE DIM minuten AS BYTE DIM klok01h AS BYTE DIM klok02h AS BYTE DIM klok03h AS BYTE DIM scan AS WORD CLEAR ;[indien nodig osc aan in RTC] BUSIN %11010000, $0000, [gelezenseconden] IF gelezenseconden.7 = 1 THEN ; dat is het osc_aan bit. gelezenseconden.7 = 0 ; wat als het 0 is de osc aan zet BUSOUT %11010000, $0000, [gelezenseconden] END IF GOTO mainloop weergeven: SELECT wgww CASE 0 Buisje = tienuren ltienuren = 1 luren = 0 ltienminuten = 0 lminuten = 0 CASE 1 Buisje = uren luren = 1 ltienuren = 0 lminuten = 0 ltienminuten = 0 CASE 2 Buisje = tienminuten ltienminuten = 1 lminuten = 0 luren = 0 ltienuren = 0 CASE 3 Buisje = minuten lminuten = 1 ltienminuten = 0 luren = 0 ltienuren = 0 CASE ELSE wgww = 0 ENDSELECT drivera = Buisje.0 driverb = Buisje.1 driverc = Buisje.2 driverd = Buisje.3 RETURN instellen: ltienuren = 1 luren = 1 ltienminuten = 1 lminuten = 1 DELAYMS 1000 tienureninstellen: ltienuren = 1 wgww = 0 GOSUB weergeven REPEAT RC5_WORD = RC5IN UNTIL RC5_COMMAND <> 255 SELECT RC5_COMMAND ; ja, deze zooi moet zo omslachtig met select case, omdat anders ook gerageerd word op andere toetsen CASE 0 ; dan de cijfertoetsen binnen het gewenste bereik tienuren = 0 CASE 1 tienuren = 1 CASE 2 tienuren = 2 ENDSELECT IF RC5_SYSTEM = $05 AND RC5_COMMAND = $0b THEN ltienuren = 0 DELAYMS 1000 GOTO ureninstellen END IF GOTO tienureninstellen ureninstellen: luren = 1 wgww = 1 IF tienuren = 2 AND uren > 3 THEN uren = 0 ; voor deze constructie geen endif. Als je eerst uren op uren > 3 zette en daarna ; in een 2e keer instellen tienuren op 2 kon je gewoon de klok van 28:59 naar 29:00 laten lopen. Nu dus niet meer ;) ; deze constructie kun niet in de select case tienuren = 2 want dan zou de conterole pas plaatsvinden nadat er een rc5 commando ; ontvangen was. GOSUB weergeven DELAYMS 800 REPEAT RC5_WORD = RC5IN UNTIL RC5_COMMAND <> 255 SELECT tienuren CASE 2 SELECT RC5_COMMAND CASE 0 uren = 0 CASE 1 uren = 1 CASE 2 uren = 2 CASE 3 uren = 3 ENDSELECT CASE ELSE SELECT RC5_COMMAND CASE 0 uren = 0 CASE 1 uren = 1 CASE 2 uren = 2 CASE 3 uren = 3 CASE 4 uren = 4 CASE 5 uren = 5 CASE 6 uren = 6 CASE 7 uren = 7 CASE 8 uren = 8 CASE 9 uren = 9 ENDSELECT ENDSELECT IF RC5_SYSTEM = $05 AND RC5_COMMAND = $0b THEN luren = 0 DELAYMS 1000 GOTO tienminuteninstellen END IF GOTO ureninstellen tienminuteninstellen: ltienminuten = 1 wgww = 2 GOSUB weergeven DELAYMS 800 REPEAT RC5_WORD = RC5IN UNTIL RC5_COMMAND <> 255 SELECT RC5_COMMAND CASE 0 tienminuten = 0 CASE 1 tienminuten = 1 CASE 2 tienminuten = 2 CASE 3 tienminuten = 3 CASE 4 tienminuten = 4 CASE 5 tienminuten = 5 ENDSELECT IF RC5_SYSTEM = $05 AND RC5_COMMAND = $0b THEN ltienminuten = 0 DELAYMS 1000 GOTO minuteninstellen END IF GOTO tienminuteninstellen minuteninstellen: lminuten = 1 wgww = 3 GOSUB weergeven DELAYMS 800 REPEAT RC5_WORD = RC5IN UNTIL RC5_COMMAND <> 255 SELECT RC5_COMMAND CASE 0 minuten = 0 CASE 1 minuten = 1 CASE 2 minuten = 2 CASE 3 minuten = 3 CASE 4 minuten = 4 CASE 5 minuten = 5 CASE 6 minuten = 6 CASE 7 minuten = 7 CASE 8 minuten = 8 CASE 9 minuten = 9 ENDSELECT IF RC5_SYSTEM = $05 AND RC5_COMMAND = $0b THEN lminuten = 0 DELAYMS 800 GOTO schrijfnaarklok END IF GOTO minuteninstellen schrijfnaarklok: ltienuren = 1 ltienminuten = 1 DELAYMS 500 klok01h.6 = tienminuten.2 klok01h.5 = tienminuten.1 klok01h.4 = tienminuten.0 klok01h.3 = minuten.3 klok01h.2 = minuten.2 klok01h.1 = minuten.1 klok01h.0 = minuten.0 klok02h.6 = 0 ; twaalfuur/vierentwintiguur selectie. 0 betekend 24-uursmodus klok02h.5 = tienuren.1 klok02h.4 = tienuren.0 klok02h.3 = uren.3 klok02h.2 = uren.2 klok02h.1 = uren.1 klok02h.0 = uren.0 BUSOUT %11010000, $0001, [klok01h] ; minuten DELAYMS 15 BUSOUT %11010000, $0002, [klok02h] ; uren en uurinstellingen DELAYMS 15 GOTO mainloop kloklees: BUSIN %11010000, $0001, [klok01h] ; minuten BUSIN %11010000, $0002, [klok02h] ; uren en uurinstellingen tienminuten.2 = klok01h.6 tienminuten.1 = klok01h.5 tienminuten.0 = klok01h.4 minuten.3 = klok01h.3 minuten.2 = klok01h.2 minuten.1 = klok01h.1 minuten.0 = klok01h.0 tienuren.1 = klok02h.5 tienuren.0 = klok02h.4 uren.3 = klok02h.3 uren.2 = klok02h.2 uren.1 = klok02h.1 uren.0 = klok02h.0 RETURN mainloop: GOSUB kloklees GOSUB weergeven FOR scan = 0 TO 3000 STEP 1 RC5_WORD = RC5IN IF RC5_SYSTEM = $05 AND RC5_COMMAND = $37 THEN GOTO instellen END IF NEXT INC wgww IF wgww = 4 THEN wgww = 0 GOTO mainloop