;Minutka se ctyrmi LED displeji ;po zapnuti resetovacim tlacitkem si zkontroluje platnost dat v ram ;je-li vsechno v poradku, spusti odpocitavan casu podle predlohy ;neni-li v poradku, prepise ram predlohou z rom ;cas se odcita dolu plnym zobrazenim ;po sebehnuti casu do nuly pocne minutka pipat po urcity cas ;cas je zobrazen jako blikajici a jdouci vzhuru ;po ubehnuti casu pipani se zarizeni uspi ;vzdy lze vypnout pomoci resetovaciho tlacitka ; ;nastaveni probiha po sahnuti na kterekoliv nastavovaci tlacitko ;pri preruseni pri odcitani casu se nastavuje odcitaci cas ;displej neblika ;data se ulozi po vypnuti resetovacim tlacitkem ;pri preruseni pri citani casu pipani se nastavuje cas pipani ;cas pipani lze take nastavovat po soucasnem stisku obou tlacitek ;pri tomto nastavovani displej blika ;i zde dochazi k ulozeni dat po stisku resetovaciho tlacitka ;vzdy po ulozeni dat se spousti opetovne minutka ;takze neni-li nutne okamzite casovat, ;stisknete resetovaci tlacitko dvakrat ;pokud cas zastavite jednim kratkym stiskem ;jakehokoliv nastavovaciho tlacitka, ;nezmeni se stav na displeji nahoru ani dolu ;po stisku resetovaciho tlacitka, se cas rozebehne ;od tohoto casu, cimz to lze pouzit jako preruseni odpocitavani casu ;samozrejme si takto zrusite predvolbu ;jdouci sekundy zobrazuji beh casu ;blikani celeho displeje indikuje stav citani pipani ;nebo nastavovani casu pipani ;displej se nastavuje napred pomalu, ale delsim drzenim tlacitka ;se prestavovani cislic rapidne zrychli, takze jakykoliv stav ;v rozsahu 1s az 99minut lze nastavit bez obtizi a velmi rychle ;prerusovanym stiskem nastavovacich tlacitek lze tez velmi rychle ;dostavet pozadovanou hodnotu, nebot prvni stisk je vzdy casove ;zvyhodnovan.. Bseg pipak bit p3.7 dole bit p3.2 hore bit p3.3 beh bit 8 ;ze se odcita cas kuk bit 9 ;pozadavek na obcerstveni displeje pip bit 10 ;cas dobehl, pozadavek na zvuk signal stav bit 11 ;nastavoval se cas, pozadavek pro ulozeni dat blik bit 12 ;blikavy bit klip bit 13 ;klip klop bit pro vyp./zap. tecka bit 14 ;vysledek tecky blesk bit 15 ;zatemnovani celeho displeje, blikani,citani pipani bzuk bit 16 ;nastavovani pipani,pozadavek aktiv bit 17 ;pomocny bit pro zamezeni zmeny po prvnim stisku pau bit 18 ;bit pro mod pausa bez prestaveni predvolby none bit 19 ;zamezeni zobrazeni casu jdouciho vzhuru tmadm bit 20 ;zatemni desitky minut tmajm bit 21 ;zatemni jednotky minut tmads bit 22 ;zatemneni desitek sekund ends Dseg taktlcd data 20h ;ridic led displeje bitiky1 data 21h ;bity merkru bitiky2 data 22h ;bity merkru ukazatel data 25h ;ukazatel na zobrazeni sichr1 data 26h ;kontrola pameti1 sichr2 data 41h ;kontrola pameti2 destis data 30h ;citace casu setiny data 31h jedsek data 32h ;citace casu pro zobrazeni dessek data 33h jedmin data 34h desmin data 35h jesepr data 36h ;pamet predvolby desepr data 37h jemipr data 38h demipr data 39h speed data 3ah ;citac rychlosti pro staveni casu z klaves rychlost data 3bh ;promenna rychlosti pro akceleraci casek data 3ch ;citac osetreni klaves jedsuz data 3dh ;jednotky sekund pro delku pipani do spani dessuz data 3eh ;desitky sekund pro delku pipani do spani jedbuz data 3fh ;jednotky minut pro delku pipani do spani desbuz data 40h ;desitky minut pro delku pipani do spani tikec data 42h ;podrzeni n x kuk tiknuti ends Cseg osetri = 7 ;osetreni klaves o x 10ms }30} prvotni = 16 ;cas pocatecniho repeatu tlacitka pri }20} ;trvalem stisku p x o x 10ms minim = 1 ;minimalni cas repeatu }3} ;s krokem 1 m x o x 10ms heslo1 = 34 ;hesla pro kontrolu dat v pameti heslo2 = 56 ends ;%S org 0 ajmp nastav org 0bh ajmp systca org 30h nastav: mov tmod,#00000010b ;0.citac s predvolbou setb et0 setb ea mov th0,#6 ;250/12MHz / 250us mov tl0,#0 mov sp,#6fh ;zasobnik od 70h / 16bytu setb pt0 ;vyssi prioritu pro cas0 setb tr0 ;start casovace 0 mov P1,#255 ;vystupy na klidovy stav mov P3,#11111111b mov destis,#0 ;nastaveni nulovych zlomku casu mov setiny,#0 clr kuk ;displej zatim ceka clr aktiv ;smaz pomocny bit mov a,sichr1 ;kontrola neporusenosti dat v ram xrl a,#heslo1 jnz nast2 mov a,sichr2 xrl a,#heslo2 jnz nast2 ;skok na nacteni z rom jnb stav,nast1 ;po predchozim nastaveni uloz data do pameti casu mov a,jedsek ;ale napred si prover data zda-li nejde o nesmysly orl a,dessek orl a,jedmin orl a,desmin anl a,#11110000b ;ve vyssich bitech nesmi nikde nic byt jnz nast2 ;skok na nacteni z rom jb bzuk,nast0 ;po predchozim nastaveni uloz data do pameti pipani jb pau,nast4 ;pokracuje se bez prestavovani v ram mov jesepr,jedsek ;uloz predvolbu delky casu mov desepr,dessek mov jemipr,jedmin mov demipr,desmin ajmp nast4 nast0: mov jedsuz,jedsek ;uloz predvolbu delky pipani mov dessuz,dessek mov jedbuz,jedmin mov desbuz,desmin nast1: mov jedsek,jesepr ; nahraj na displej /do citacu/ predvolbu casu mov dessek,desepr mov jedmin,jemipr mov desmin,demipr nast4: setb beh ;citej cas clr pip ;nepipej clr stav ;zrus pozadavek zaznamu nastaveni casu do pameti clr bzuk ;zrus upresneni pro zapis delky pipani acall minend ;identifikace ukazatele displeje cpl klip ;prepnuti klip klopu jb klip,nast3 ;skok na beh, pruchod na spani clr ea ;zakaz preruseni mov P1,#255 ;vystupy na klidovy stav mov P3,#11111111b orl pcon,#2 ;spi nast2: mov jesepr,#0 ;nastav z rom predvolbu delky casu, data v ram NOK mov desepr,#0 mov jemipr,#3 mov demipr,#0 mov jedsuz,#0 ;nastav z rom predvolbu delky pipani mov dessuz,#0 mov jedbuz,#1 mov desbuz,#0 setb none ;v rom je pipani nastaveno bez cisel na LCD mov sichr1,#heslo1 ;nastaveni kontrolnich bytu v ram mov sichr2,#heslo2 ajmp nast1 nast3: clr stav clr bzuk clr pau ;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY cykl: jnb kuk,cykl ;usporny rezim CPU s casovanim kuk acall elcede ;volani obcerstvovani displeje cyk1: acall klavesy ;nastavovani casu, klavesy jb pip,cyk3 djnz tikec,cyk3 ;delka tiknuti citani setb pipak ;ukonceni tiknuti v modulo rezimu cyk3: jnb pip,cyk2 acall pipa ;pipani a prechod na citani vzhuru cyk2: ajmp cykl ;scann ;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP pipa: jb beh,pip0 ;je-li beh obskoc jnb pip,pip0 ;skok do nepipani mov a,jedsek ;hlidani doby pro ukonceni pipani xrl a,jedsuz ;jednotky sekund dosazeny, tak usni jnz pip1 mov a,dessek xrl a,dessuz ;desitky sekund dosazeny, tak usni jnz pip1 mov a,jedmin xrl a,jedbuz ;jednotky minut dosazeny, tak usni jnz pip1 mov a,desmin xrl a,desbuz ;desitky minut dosazeny, tak usni jnz pip1 mov a,jedsuz ;nastaveno modulo citani casu do kruhu orl a,dessuz orl a,jedbuz orl a,desbuz jnz pipxx clr pipak ;tiknuti sjmp pipgo ;dokola pipxx: clr ea ;zacatek ukolebavky clr klip ;klip klop bit do nuly priprava na zapnuti mov p1,#255 mov p3,#255 orl pcon,#2 ;uspavani pip1: mov a,jedmin anl a,#00000001b ;je-li licha minuta , neskakej jnz pip0 mov a,jedsek anl a,#00000001b ;a je-li zaroven licha s,neskakej jnz pip0 mov a,#3 clr c subb a,jedsek ;a neni-li v jedsek vic nez tri,pipni jc pip0 clr pipak ;zapni pipak ret pip0: setb pipak ;vypni pipak ret pipgo: mov tikec,#15 ;delka tiknuti v modulu modu mov jedsek,jesepr ; nahraj na displej /do citacu/ predvolbu casu mov dessek,desepr mov jedmin,jemipr mov desmin,demipr setb beh ;citej cas clr pip ;nepipej clr stav ;zrus pozadavek zaznamu nastaveni casu do pameti clr bzuk ;zrus upresneni pro zapis delky pipani ret ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK klavesy: mov c,dole anl c,hore jnc klav1 ;test stisku klavesy mov casek,#osetri ;nastaveni pri uvolneni klaves osetreni stisku mov speed,#1 ;pro rychlou prvni odezvu mov rychlost,#prvotni ;a pro nasledujici odezvy trvaleho stisku klav0: ret klav1: setb stav ;nastav bit pro prepis predvolby setb pipak ;vypni pipani, mohlo zustat nastavene clr beh ;zastav beh hodin i pipani clr pip clr klip ;po resetu nabehne mereni s upravou djnz casek,klav0 ;osetreni stisku mov casek,#osetri ;obcerstveni citace osetreni stisku djnz speed,klav0 ;citani casu opakovane reakce pri trval.stisku mov speed,rychlost ;obcerstveni citace rychlosti opakovani dec rychlost ;akcelerace rychlosti opakovane reakce mov a,rychlost cjne a,#minim,klav2 ;minimalni cas opakovani bude vetsi nez minim inc rychlost ;oprava periody klav2: mov c,dole ;test na stisk obou klaves cpl c anl c,/hore jc oboje jb aktiv,klav3 ;prvni staveni dat nic nemeni setb aktiv setb pau ;pau=1 jen pauza ret klav3: clr pau ;ted uz je to zmena, ne pauza pau=0 mov c,dole ;test na stisk klavesy dolu jnc dolu ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH nahoru: mov a,desmin ;test na 99 minut, pak se zakaze pricitani xrl a,#9 jnz nah0 mov a,jedmin xrl a,#9 jnz nah0 nah3: ret nah0: mov a,ukazatel ;nastavovani sekund nahoru cjne a,#jedsek,nah1 ajmp plus nah1: mov jedsek,#0 ;nastavovani desitek sekund nahoru cjne a,#dessek,nah2 ajmp plus1 nah2: mov dessek,#0 ;nastavovani jednotek minut nahoru cjne a,#jedmin,nah3 ajmp plus2 ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD dolu: mov a,jedsek jb bzuk,dol9 xrl a,#1 jnz dol0 dol9: orl a,dessek orl a,jedmin orl a,desmin jnz dol0 dol3: ret dol0: mov a,ukazatel cjne a,#jedsek,dol1 ajmp minus dol1: mov jedsek,#0 ;nastavovani desitek sekund dolu cjne a,#dessek,dol2 ajmp min1 dol2: mov dessek,#0 ;nastavovani jednotek minut nahoru cjne a,#jedmin,dol3 ajmp min2 ;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC oboje: clr pau setb aktiv jb bzuk,obo1 setb bzuk ;nastavuj cas pipani clr none ;cas pipani se bude zobrazovat cisly ret obo1: jb none,obo2 setb bzuk ;nastavuj cas pipani setb none ;cas pipani nebude zobrazen cislem ret obo2: clr bzuk ;nastavujes cas odcitani clr none ret ;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO elcede: inc taktlcd ;beh hodin pro lcd /predelano na LED clr kuk ;smaz pozadavek displeje acall teckit ;urceni , zda bude zobrazena tecka MOV A,#3 ;mask BUD 0 NEBO 1 = JEDNOTKY NEBO DES. ANL A,taktlcd mov taktlcd,a ;maskovane uloz ADD A,#jedsek ;adresa nejnizsiho radu mov r0,a mov a,@r0 jnb none,nonono ;pri none=1 a bzuk=1 zobraz na LED ---- jnb bzuk,nonono mov a,#15 sjmp elced0 nonono: jnb tecka,elced0 add a,#16 ;s teckou elced0: MOV DPTR,#TABULA ;VYTAZENI OBRAZKU PRO DISPLEJ Z TABULKY MOVC A,@A+DPTR jnb blesk,elcd01 ;pro blikani celeho displeje mov a,#255 elcd01: orl p3,#00110011b ;zhasnuti displeje anody mov p1,a ;katody prestav el0001: mov a,taktlcd jnz el0010 clr p3.4 ;anoda jednotek sekund ret el0010: dec a jnz el0100 jb tmads,elend clr p3.5 ;anoda desitek sekund ret el0100: dec a jnz el1000 jb tmajm,elend clr p3.1 ;anoda jednotek minut ret el1000: jb tmadm,elend clr p3.0 ;anoda desitek minut elend: ret ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT tabula: db 20,183,140,133,39,69,68,151,4,5,255,255,255,255,255,239 db 16,179,136,129,35,65,64,147,0,1,251,251,251,251,251,255 ;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC systca: PUSH ACC ;ULOZ AKUMULATOR PUSH PSW ;ULOZ PRIZNAKY INC DESTIS ;DVOUDESETITISICINY + 1 MOV A,#20 ;250us X 20 x n = 5ms CJNE A,DESTIS,sysend ;PAK NESKAKEJ,JINAK SKOK VEN XRL DESTIS,A ;SNULUJ DESTIS setb kuk ;displej obcerstvi INC SETINY ;SETINY + 1 MOV A,#100 ;100 X 5ms = 0,5s CJNE A,SETINY,sysend ;PAK NESKAKEJ,JINAK SKOK VEN XRL SETINY,A ;SNULUJ SETINY PRAVE PROSLA sekunda cpl blik jb stav,sysend ;nastavovani aktivovano jnb blik,sysend ;blikani f=1s jnb pip,syst1 ;je-li jiz pipani, pak pricitej cas acall plus ajmp sysend syst1: jnb beh,sysend ;neni-li aktivovan beh, nemen cas mov a,jedsek ;test dosleho casu k jedne sekunde dec a orl a,jedmin orl a,dessek orl a,desmin jnz sysbeh ;neni-li u jedne sekundy skoc a odcitej acall minus ;je-li cas 1 ,naposledy odecti clr beh ;zastav dalsi odcitani casu a setb pip ;zapni pipani a pricitani casu setb bzuk ;set flagu pro moznost staveni casu pipani ajmp sysend sysbeh: acall minus sysend: POP PSW ;OBNOV PRIZNAKY POP ACC ;OBNOV AKUMULATOR RETI ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM minus: dec jedsek ;odcitani navoleneho casu mov a,jedsek cpl a jnz minend mov jedsek,#9 min1: dec dessek mov a,dessek cpl a jnz minend mov dessek,#5 min2: dec jedmin mov a,jedmin cpl a jnz minend mov jedmin,#9 min3: dec desmin mov a,desmin cpl a jnz minend minend: mov ukazatel,#jedmin mov a,desmin jnz min31 mov ukazatel,#dessek mov a,jedmin jnz min31 mov ukazatel,#jedsek min31: ret ;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP plus: inc jedsek mov a,#10 cjne a,jedsek,plusend mov jedsek,#0 plus1: inc dessek ;jnb stopci,plus11 ;mov a,#10 ;ajmp plus12 plus11: mov a,#6 plus12: cjne a,dessek,plusend mov dessek,#0 plus2: inc jedmin mov a,#10 cjne a,jedmin,plusend mov jedmin,#0 plus3: inc desmin mov a,#10 cjne a,desmin,plusend mov desmin,#9 ;osetreni protoceni stopek mov jedmin,#9 plusend: mov ukazatel,#jedmin mov a,desmin jnz plus31 mov ukazatel,#dessek mov a,jedmin jnz plus31 mov ukazatel,#jedsek plus31: ret ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT teckit: clr tmads clr tmajm clr tmadm mov a,desmin jnz tecke setb tmadm ;bez desitek minut mov a,jedmin jnz tecke setb tmajm ;bez jednotek sekund mov a,dessek jnz tecke setb tmads ;bez jednotek sekund tecke: mov a,taktlcd ;kam ukazuje multiplex clr tecka ;zakazat tecku cjne a,#2,teck4 ;identifikace taktu multiplexu pevné tečky setb tecka ;povolit tecku jnb beh,teck4 ;blikani tecky, pokud je pozadovana mov c,blik ;pri behu blikat svit tecky anl c,tecka ;pokud je pozadovana tecka mov tecka,c teck4: jnb pip,teck5 ;blikani celeho displeje teck6: mov c,blik ;pri aktivaci pipani mov blesk,c ;citani pipani nebo staveni ret teck5: jnb hore,teck7 ;pri stisku klavesy neblikej jnb dole,teck7 jb bzuk,teck6 ;je-li staveni pipani, blikej tez teck7: clr blesk ret ;################################################ ;%E ends end