; ------------------- program pro branak a dvojicky ---------------------- ; -------- urceno pro procesory AT89C1051, AT89C2051, AT89C4051----------- ; ---- pripojeni LCD osmivodicovou datovou sbernici + ridici signaly ----- ; -------------------------- E, RS. R/W se nevyuziva --------------------- ; ------------------------- Ondrej Karas 2005 ---------------------------- ; ------------- deklaracni cast ---------------- RS BIT p3.0 ;LCD register select E BIT p3.1 ;register data enable PIP BIT p3.7 ;spinani svetelne signalizace BLIK BIT p3.5 ;spinani akusticke signalizace TL_ST BIT p3.4 ;tlacitko STOP/draha1 - branak/dvojicky TL_ST2 BIT p3.3 ;tlacitko STOP/draha2 - dvojicky ZAVOD BIT p3.2 ;pepinac zavodu branak/dvojicky RX0 EQU 50H ; zpozdovaci registry RX1 EQU 51H ; zpozdovaci registry regset EQU 52H ; registr setin regsec EQU 53H ; registr sekund regmin EQU 54H ; registr minut reghod EQU 55H ; registr hodin ; ------ nastaveni registru a preruseni -------- org 0 jmp zacni ; preskoceni preruseni org 0BH jmp timeup ; obsluha preruseni org 30H zacni: mov SP,#60H mov IE,#00000000B ; zakaze vsechna preruseni mov TH0,#0D ; nastaveni registru casovace mov TL0,#0D ; pro rezim s HW prednastavenim mov r1,#30D ; 30 x preruseni do setin mov r2,#00D ; setiny mov r3,#00D ; sekundy mov r4,#00D ; minuty mov r6,#00D ; hodiny clr f0 clr PIP clr BLIK ; ------ inicializace displeje 8 dratu---------- clr RS mov r7,#59D call zapis mov r7,#12D call zapis mov R7,#1D call zapis setb RS call smaz mov R7,#5D call ddram mov r7,#'U' call zapis mov R7,#'v' call zapis mov R7,#'o' call zapis mov R7,#'l' call zapis mov R7,#'n' call zapis mov R7,#'e' call zapis mov R7,#'t' call zapis mov R7,#'e' call zapis mov R7,#45H call ddram mov R7,#'t' call zapis mov R7,#'l' call zapis mov R7,#'a' call zapis mov R7,#'c' call zapis mov R7,#'i' call zapis mov R7,#'t' call zapis mov R7,#'k' call zapis mov R7,#'a' call zapis kontrola_tlacitek: jnb TL_ST, kontrola_tlacitek jnb TL_ST2, kontrola_tlacitek mov RX0,#255 ktc: mov RX1,#255 kcc: djnz RX1,kcc djnz RX0,ktc ; --------------- vypise "START"----------------- call smaz mov r7,#6D call ddram mov r7,#'S' call zapis mov r7,#'T' call zapis mov r7,#'A' call zapis mov r7,#'R' call zapis mov r7,#'T' call zapis ; ------- ceka na stisk "START"----------------- start: jb TL_ST,start ; ceka na stick startu mov RX0,#255 ; zpozdi kvuli zakmitum ptc: mov RX1,#255 pcc: djnz RX1,pcc djnz RX0,ptc mov IE,#10000010B ; nastavi preruseni mov TMOD,#00000010B ; nastavi casovac mov TCON,#00010000B ; spusti casovac setb PIP hlavni_program: jnb TL_ST,dal_houkej clr PIP dal_houkej: kopirovani_casu: clr f0 ; smaze se priznak zmeny casu mov regset,r2 ; kopirujou se setiny mov regsec,r3 ; kopirujou se sekundy mov regmin,r4 ; kopirujou se minuty mov reghod,r6 ; kopitujou se hodiny jb f0,kopirovani_casu ; kdyz je zmena casu, pak se kopiruje znovu jnb ZAVOD, nesignalizuj ; kdyz neni zvolen branak nesignaliyuje starty... call signalizace nesignalizuj: jnb TL_ST, pr_zp1 ; kdyz neni stisknute tlacitko 1, pak se zapise cas drahy 1 call wr_dr1 pr_zp1: ; a kdyz je, tak vesele pokracuje dal jnb TL_ST2, pr_zp2 ; kdyz neni stisknute tlacitko 2, pak se zapise cas drahy 2 call wr_dr2 pr_zp2: ; a kdyz je, tak vesele pokracuje dal jmp hlavni_program ;---------- zapise cas drahy-------------------- wr_dr: mov a,reghod mov r7,a ; zapis hodin call wr_tm mov r7,#58D call zapis mov a,regmin mov r7,a ; zapis minut call wr_tm mov r7,#58D call zapis mov a,regsec mov r7,a ; zapis sekund call wr_tm mov r7,#58D call zapis mov a,regset mov r7,a ; zapis setin call wr_tm ret ;---------- zapise drahu 1 ----------------------- wr_dr1: call zpozdi mov r7,#3D call ddram ; nastavi pozici na dispoeji call wr_dr ; zapise cas na drahu ret ;---------- zapise drahu 2 ----------------------- wr_dr2: call zpozdi mov r7,#43H call ddram ; nastavi pozici na displeji call wr_dr ; zapise cas na drahu ret ; ---------- operace zapisu --------------- wr_tm: call rozloz add a,#48D ; tato funkce ma za ukol mov r7,a ; zapsat cely registr call zapis ; nejprve prevede cislo mov a,b ; na rady a pak prevede add a,#48D ; na ASCII a zapise mov r7,a call zapis ret ; ---------- rozklad na rady ----------------- rozloz: mov a,r7 mov b,#10D div ab ; v A budou desitky ret ; v B budou jednotky ;------------ funkce upravujici cas ----------- timeup: push PSW djnz r1, kotup ; preskoci 30 preruseni pro dosazeni setin mov r1, #30D inc r2 ; inkrementace setin setb f0 ; nahodi se priznak zmeny casu cjne r2,#100D,kotup ; jsou-li setiny mensi nez 100 , pak nedela nic a vyskoci mov r2,#00D ; jsou-li rovny 100, pak pokracuje inc r3 ; inkrementace sekund cjne r3,#60D,kotup ; jsou-li sekundy mensi nez 60 , pak nedela nic a vyskoci mov r3,#00D ; jsou-li rovny 60, pak pokracuje inc r4 ; inkrementace minut cjne r4,#60D,kotup ; jsou-li minutz mensi nez 60, nedela nic a vyskoci mov R4,#00D ; jdou-li rovny 60, pak pokracuje inc R6 ; zvysi hodiny o 1 kotup: POP PSW reti ; ----------- zpozdovaci funkce ---------------- zpozdi: mov r0,#255D cyk: djnz r0,cyk ret ; --------- zapise data nebo instrukce --------- zapis: call zpozdi mov p1,r7 setb E call zpozdi clr E call zpozdi ret ; ---------------- smaze LCD ------------------ smaz: clr RS mov r7,#1D call zapis setb RS ret ; - urci adresu DDRAM, kam se bude zapisovat - ddram: clr RS call zpozdi mov a,r7 orl a,#10000000B mov r7,a mov p1,r7 call zapis call zpozdi setb RS call zpozdi ret ; - zjistuje cas a podle toho nastavuje ------- signalizace: mov R7,regsec mov a,reghod jnz s_muze mov a,regmin jz s_out1 ; v nulte minute nesmi signalizovat.... s_muze: mov a,regmin inc a mov b,#05D div ab mov a,b ; zjistilo jestli minuta + 1 je delitelna 5 jnz pi_ot ; a kdyz ne, tak nesignalizuje cjne R7,#50D,bl_ot ; kdy neni sekunda = 50... setb BLIK ; pak se nerozsviti svetylko bl_ot: cjne R7,#59D,pi_ot ; kdyz neni sekunda = 59... setb PIP ; pak se nerozezvuci bzucatk pi_ot: cjne R7,#00D,s_out1 ; kdyz neni sekunda = 0 clr BLIK ; pak se nevypne blikani clr PIP ; ani houkani s_out1: nop nop ret ; ----------- KONEC PROGRAMU ---------------