program Ventilator_in_Ura dim LCD_RS as sbit at RB5_bit 'Inicializacija za LCD LCD_EN as sbit at RB4_bit 'Pogledaš si kak maš vezano na ploščici LCD_D4 as sbit at RB3_bit LCD_D5 as sbit at RB2_bit LCD_D6 as sbit at RB1_bit LCD_D7 as sbit at RB0_bit LCD_RS_Direction as sbit at TRISB5_bit LCD_EN_Direction as sbit at TRISB4_bit LCD_D4_Direction as sbit at TRISB3_bit LCD_D5_Direction as sbit at TRISB2_bit LCD_D6_Direction as sbit at TRISB1_bit LCD_D7_Direction as sbit at TRISB0_bit dim oldstate0, oldstate1, i, j as byte 'Spremenljivke definiramo kot bajt, bajt ima velikost v decimalnem 256 'txt as char[3] 'txt definiramo kot char-rezerviramo si tri polja txt1 as char[3] 'txt1 definiramo kot char-rezerviramo si tri polja 'začetek*******************************************URA********************************************************************** dim oldstate2, oldstate3, oldstate4 as byte 'Spremenljivke definiramo kot bajt, bajt ima velikost v decimalnem 256 dim a as byte '8 bitov zato, ker imamo števec, ki šteje do 256 b, k, x, y, c, v, w, dvopicje, presledek as char'Definirane kot en znak txt2 as char[8] 'To je 8 zaradi 00:00:00 oldstate as byte 'Spremenljivki sta definirani kot bajt 'prekinitvena procedura sub procedure interrupt 'Prekinitvena rutina, ko pride do nje se poveča ta števec za 1 PIR1.TMR1IF = 0 'PIR1 register vsebuje posamezne zastavice bitov za notranje prekinitve. Prekinitev na timerju 'Časovnik_1 ne prekorači 'Vrednost timerja, ki šteje od 40535 do 65535 TMR1H = 0x9E 'Šestanjstiška vrednost za 40535 = 9E57 TMR1L = 0x57 'Tukaj je pa 57 Inc(a) 'Inkrement, povečanje števca za 1 end sub 'Konec prekinitvene procedure 'konec*****************************************URA************************************************************************ main: TRISA = %00000011 'Porti na RA0 in RA1 so definirani kot vhodi za tipki GOR in DOL TRISB = %00000000 'Vsi porti na B so izhodi, LCD zaslon TRISC = %01110000 'Tipke za nastavitev časa na portu C, RC6=RESET ČASA, RC5=START, 'RC4=PAVZA kot vhod ADCON1 = %00000110 'Analogno/Digitalna konfiguracija pinov za katere želimo da so digitalni, 'v tem primeru so vsi digitalni pwm1_Init(5000) 'Frekvenca za PWM signal je 5kHz oldstate0 = 0 'Začetna vrednost spremenljivke oldstate0 je 0 oldstate1 = 0 'Začetna vrednost spremenljivke oldstate1 je 0 i = 0 'Začetna vrednost spremenljivke i je 0 j = 0 'Začetna vrednost spremenljivke j je 0 PORTC = 0 'Začetno stanje na portu C je 0 Lcd_Init() 'Inicializacija za LCD Lcd_Cmd(_LCD_CLEAR) 'Zbriše vse kaj je bilo v pomnilniki da je na začetku prazen Lcd_Cmd(_LCD_CURSOR_OFF) 'Z tem ukazom izklopimo kurzor, ker drugače bi utripal Lcd_Out(1, 3, "Pozdravljeni!") '1 vrstica in 3 stoplpec izpiši ta tekst delay_ms(3000) '3s je izpisan napis "Pritisni + ali -" Lcd_Cmd(_LCD_CLEAR) 'Po 1 sekundi izbriši celi lcd Lcd_Out(1, 1, "Hitrost = 0%") '1 vrstica in 1 stolpec izpiši 0%, to je takrat, ko se mikrokrmilnik na 'novo zažene izpiše to Lcd_Out(2, 1, "Cas: ") 'Izpis na lcd v 2 vrsti, 1 stolpec txt2 = "00:00:00" 'Izpiše se na lcd Lcd_Out(2, 6, txt2) 'Tukaj nadaljuje oni txt od zgorj, torej 00:00:00 pwm1_start() 'Start PWM-a 'začetek***************************************URA************************************************************************** T1CON = %00101100 'Bit 7-6=00, Bit 5-4=10 prescaler 1:4, Bit 3=1 oscilator-ON, 'Bit 2=1 sinhronizacija-ON, 'Bit 1=0 notranja ura-ON, Bit 0=0 izklop timerja1 INTCON = %11000000 'GIE=ON-globalni prekinitveni bit, PEIE=ON-zunanji prekinitveni bit PIR1.TMR1IF = 0 'Časovnika_1 ne prekorači TMR1H = 0x9E 'Šestnajstika vrednost za 40535 = 9E57 TMR1L = 0x57 PIE1.TMR1IE = 1 'PIE1 register vsebuje posamezne omogočitve bitov za zunanje prekinitve. 'Omogoča prekoračitveno prekinitev časovnika_1 a = 0 'Začetne vrednost oldstate = 0 'Začetne vrednost 'te vrednosti so ASCII znaki glej ASCII tabelo w = 47 'To je decimalno / b = 48 'To je decimalno 0 k = 48 'To so te vrednosti za uro 00:00:00 x = 48 'To so te vrednosti za uro 00:00:00 y = 48 'To so te vrednosti za uro 00:00:00 c = 48 'To so te vrednosti za uro 00:00:00 v = 48 'To so te vrednosti za uro 00:00:00 'ti dve spremenljivki sta že shranjeni v spominu LCD-ja, ki ga poda proizvajalec dvopicje = 58 'To je decimalno : presledek = 32 'To je decimalno presledek 'konec***************************************URA************************************************************************ while true 'Neskončna While zanka 'začetek*************************************URA************************************************************************ '******Tipka RESET****** if Button(PORTC, 6, 1, 1) then 'Če je bila sklenjena tipka za RESET oldstate2 = 255 'Postavi oldstate2 na maksimalno vrednost end if 'Konec if stavka if oldstate2 and Button(PORTC, 6, 1, 0) then 'Preveri, če je bil pritisnjena tipka T1CON.0 = 0 'Izklopi časovnik_1 in oldstate2 = 0 'Postavi spremenljivko na 0 v = 48 'Postavi vse vrednosti na 00:00:00 c = 48 y = 48 x = 48 k = 48 b = 48 Lcd_Out(2, 6, txt2) 'Dodamo zato, da se po resetu na lcd izpišejo same ničle in dvopičje end if 'Konec if stavka '******Tipka START****** if Button(PORTC, 5, 1, 1) then 'Če je bila sklenjena tipka za START oldstate3 = 255 'Postavi oldstate3 na maksimalno vrednost end if 'Konec if stavka if oldstate3 and Button(PORTC, 5, 1, 0) then 'Preveri, če je bil pritisnjena tipka T1CON.0 = 1 'Vklopi časovnik oldstate3 = 0 'Posatvi spremenljivko na 0 end if 'Konec if stavka '******Tipka PAVZA****** if Button(PORTC, 4, 1, 1) then 'Če je bila sklenjena tipka za PAVZA oldstate4 = 255 'Postavi oldstate4 na maksimalno vrednost end if 'Konec if stavka if oldstate4 and Button(PORTC, 4, 1, 0) then 'Preveri, če je bil pritisnjena tipka T1CON.0 = 0 'Izklopi časovnik oldstate4 = 0 'Posatvi spremenljivko na 0 end if 'Konec if stavka 'konec************************************************URA**************************************************************** '******MINUS TIPKA*********** if Button(PORTA, 1, 1, 1) then 'Tipka -; Prva številka: port RA1; Druga številka: zakasnitev 1ms-debounce 'to je ono ko malo zaniha ko skleneš tipko; Tretja tipka: stanje 0 ali 1 'za impulz oldstate0 = 255 'Postavi zastavico za maksimalno stanje end if 'Konec if stavka if oldstate0 and Button(PORTA, 1, 1, 0) then 'Ko je pritisnjea tipka -, preverja 'i = i - 63 - 63 pomeni korak med samimi stopnjami ' 100% -> 252 'Ta številka je izbrana na podlagi lažjega odštevanje po korak 63, '252 še smatramo kot maksimu, čeprav je 255 maskimum ' 75% -> 189 ' 50% -> 126 ' 25% -> 64 ' 0% -> 0 if (i > 0) then 'Dokler je i večji od 0 naj odšteva i = i - 126 'Odšteva po korak -126, če je i=252-126=126 je to potem 50% 'na katerih dela ventilator end if 'Konec if stavka if (j > 0) then 'Če je j v prvem koraku 100% ga tukaj odšteje za 50% na 50% j = j - 50 'Odšetvamo po korak 50% end if 'Konec if stavka pwm1_set_duty(i) 'S tem poveš trajanje impulza, toraj s tem si določiš hitrost 'vrtljajev ventilatorja npr. 50% gosub pretvorba 'Skoči v podprogram pretvorba gosub izpis 'Opravi prejšni proces in skoči sem, od tukaj nato skoči v podprogram izpis oldstate0 = 0 'Postavi oldstate0 na vrednost 0 end if 'Konec if stavka '**********PLUS TIPKA****************** if Button(PORTA, 0, 1, 1) then 'Tipka +; Prva številka: port RA0; Druga številka: zakasnitev 1ms-debounce 'to je ono ko malo zaniha ko skleneš tipko; Tretja tipka: stanje 0 ali 1 za impulz oldstate1 = 255 'Postavi zastavico za maksimalno stanje end if 'Konec if stavka if oldstate1 and Button(PORTA, 0, 1, 0) then 'Ko je pritisnjea tipka + if (i < 252) then 'Dokler je i manjši od 252 naj prišteva i = i + 126 'Sešteva po korak +126, če je i=0+126=126 je to potem 50% na katerih dela 'ventilator end if 'Konec if stavka if (j < 100) then 'Če je j v prvem koraku 0% ga tukaj povečuje za 50% j = j + 50 'Sešteva po korak 50% end if 'Konec if stavka 'pwm1_set_duty(252) 'Zaženemo ventilator z 100% 'delay_ms(200) 'za 200ms pwm1_set_duty(i) 'S tem poveš trajanje impulza, toraj s tem si določiš hitrost vrtljajev 'ventilatorja npr. 50% gosub pretvorba 'Skoči v podprogram pretvorba gosub izpis 'Opravi prejšni proces in skoči sem, od tukaj nato skoči v podprogram izpis oldstate1 = 0 'Postavi oldstate0 na vrednost 0 end if 'Konec if stavka 'začetek*********************************URA**************************************************************************** if a = 5 then 'Pomožni števec za določanje takta za sekunde, to vrednost pomnožiš z 'številko, ki jo dobiš pri deljenju z T=1/f 'povečaj števec za 1 Inc(w) 'Povečanje števca za 1, to je prva številka za sekunde iz desne proti levi '*****************************sekunde************************************* '00:00:00 'Puščica ti kaže kje si, to je za w ' ^ 'če je b večji od 9 ga postavi na 0 if b >= (48+10) then 'Če je b večji ali enak 58-to je dvopičje potem b = 48 'ga tukaj postavi na 0 in takoj Inc(k) 'povečaj števec k za 1, to je 2 številka pri sekundah end if 'Konec if stavka '00:00:00 'To prikazuje za k ' ^ 'če je k večji od 6 ga postavi na 0 if k >= (48+6) then 'Če je k večji od 6 k = 48 'postavi k na 0 in Inc(x) 'povečaj x za 1, to je 1 številka pri minutah end if 'Konec if stavka '************************************************************************* '*****************************minute************************************** '00:00:00 ' ^ 'če je x večji od 9 ga postavi na 0 if x >= (48+10) then 'Če je x večji od 9 x = 48 'postavi x na 0 in Inc(y) 'povečaj y za 1, to je 2 številka pri minutah end if 'Konec if stavka '00:00:00 ' ^ 'če je y večji od 6 ga postavi na 0 if y >= (48+6) then 'Če je y večji od 6 y = 48 'posatvi y na 0 in Inc(c) 'povečaj c za 1, to je 1 številka za ure end if 'Konec if stavka '************************************************************************* '**************************ure******************************************** '00:00:00 ' ^ if (v > (48+2)) and (c = (48+3)) then 'Ko pride ura na 23:59:59 se postavi na vse 0 c = 48 'Postavi c na 0 v = 48 'Postavi v na 0 end if 'Konec if stavka 'Tukaj spreminjaš URE-prehode me 09: itd. if (c > (48+9)) and ((v = 48) or (v = (48+1))) then 'Ko je c večji od 9 in v=0 (09:) ali (19:) potem postavi c na 0 c = 48 'c postaviš na 0 Inc(v) 'Povečaš pa v za 1 end if 'Konec if stavka 'skok v podprogram za izpis gosub izpis1 'Skok v podprogram za izpis na LCD 'signalizacija sekund if w mod 2 = 0 then 'S tem omogočiš utripanje dvopičja, to je 2 deljeno z nekaj, torej če deliš 'sodo število in dobiš rezultat 0 potem izpiše dvopičje v nasprotnem primeru 'pa presledek Lcd_Chr(2, 11, dvopicje) 'Izpisuješ dvopičje v 11 stolpcu Lcd_Chr(2, 8, dvopicje) 'Izpisuješ dvopičje v 8 stolpcu Inc(b) 'Po vsakem utripo dvopičja povečaj b za 1, torej povečaj za 1 sekundo else Lcd_Chr(2, 11, presledek) 'V drugem primeru izpiši presledek, torej pustiš prazno Lcd_Chr(2, 8, presledek) 'V drugem primeru izpiši presledek, torej pustiš prazno end if 'Konec if stavka a = 0 end if 'konec************************************URA**************************************************************************** wend 'Konec While zanke pretvorba: 'Podprogram pretvorba ByteToStr(j, txt1) 'j ki je tipa bajt pretvori v znake spremenljivko txt1-besedilo return 'Vrnitev izpis: 'Podprogram izpis 'Lcd_Cmd(_LCD_CLEAR) 'Zbriše vse kaj je bilo v pomnilniki da je na začetku prazen Lcd_Out(1, 1, "Hitrost = ") 'V 1 vrstici na 1 mestu začnemo z tekstom "Hitrost = ", to je 10 znakov Lcd_Out(1, 11, txt1) 'Na 11 znaku se začne številka za procente 0,50,100 to se izpisuje tukaj Lcd_Out(1, 14, "%") 'Na 14 znaku se izpiše % 'začetek***********URA******************* izpis1: Lcd_Chr(2, 13, b) 'V 13 stolpcu izpiši vrednost za b Lcd_Chr(2, 12, k) 'V 12 stolpcu izpiši vrednost za k Lcd_Chr(2, 10, x) 'V 10 stolpcu izpiši vrednost za x Lcd_Chr(2, 9, y) 'V 9 stolpcu izpiši vrednost za y Lcd_Chr(2, 7, c) 'V 7 stolpcu izpiši vrednost za c Lcd_Chr(2, 6, v) 'V 6 stolpcu izpiši vrednost za v 'konec*************URA******************* return 'Vrnitev end. 'Konec programa