You are on page 1of 73

ng h c hn gi chy vi ic vi iu khin AT89C51

Dn nhp Mt e-mail gi v ti vit nh sau:


H v tn: Khnh Huy a ch: Sinh vin i Hc Lt in thoi: 0979825351 Email: trankhanhhuytomato@gmail.com Em cho phuclanshop.com v cc Thy !!! Em v tnh tm ti liu mi bit Thy Em xin t gii thiu, em tn Huy l sinh vin Trng i hc lt, khoa in T - Vin Thng Nhm chng em ang lm n 1 v vi iu khin dng IC 89c51, nhm em c thy chia nhm lm ti v ng h s dng IC 89c51, nhng c bn em mi hc hp ng cha y na thng nn cng gp nhiu kh khn, nhim v chng em l phi lm c ng h chnh c gi, chnh pht, hn gi, c mt iu kh khn na l thy cho ti em 10 led n,tng ng vi 10 trng thi (yu cu khi thy chnh ng gi hn th 1 n sng,c ln 2 th 2 n sng) ti em tm ti liu nhng hu nh khng c vn lin quan ,thy gi y gim ti em, c ti liu lin quan mong thy share bn em, em l nhm trng xin i din c nhm 6 ngi cm n thy -Sinh vin i Hc Lt

Tr li:
Cho Huy v c nhm 6 em. Ti xem th Huy v lc tm li trong kho d liu c thy c mt bi vit c th p ng c yu cu ca nhm em. Trong bi ny c 4 nt, dng chnh trng thi ca ng h c hn gi. * Nt K1 dng chn cc mode chnh: Mode chnh gi, mode chnh gi m, mode chnh gi tt.

* Nt K2 dng chnh phn gi. * Nt K3 dng chnh phn pht. * Nt K4 cho ng h tr li hot ng bnh thng. Trong mch dng 6 Led s m 7 on, c chn anode chung. Chng ta dng 2 s cho hin th gi, 2 s cho hin th pht v 2 s cho hin th giy. Trong mch cng dng cc Led n ch trng thi hot ng ca ng h. Mt Led (trn chn p3.7) dng ch trng thi bo gi. Dng 2 Led (trn chn p0.0, p0.1) ch trng thi mode chnh v 2 Led na (trn chn p3.0, p3.1) dng ch trang thi ang iu chnh. Trong cu hi em ni dng 10 Led ch th trng thi chnh, qu tht ti khng hiu em ni g? Trng thi chnh g? mch ny, em c th chnh hn gi bo m (Timer ON) v chnh hn gi bo tt (Timer OFF) trng thi bo vi Led gn trn chn p3.7. Nhng thi - theo ti ngh - d sao i na khi cc em hiu tht r chng trnh ng h ny ri th vic cho n bin ha ra cc dng thc khc, s khng cn l cng vic qu phc tp na, phi khng? Mong cc em c k bi vit son li ny, ti ngh trn phng din dng n hc hi lm quen vi cng vic lp trnh vi ic vi iu khin cng rt ng cng. Chc cc em hc hnh tn b, cng hc cng gii, mun l lm c. Cho! (VKH)

Khi qut v ic vi iu khin AT89C51.


Mun lp trnh cho ic vi iu khin no (hay c cc ic vi x l na), trc tin Bn phi hiu r cc c tnh ca ic . Vi ic vi iu khin AT89C51 cng khng ngoi l. Trong phn ny chng ta s vn tt v cu trc ni ti ca loi ic ny. Vi ic AT89C51, chng ta cn bit 4 iu v n, l:

(1) Cng dng cc chn ca ic. Cc chn c bn v nht l cc chn cng xut nhp d liu. (2) Cu trc cc khi chc nng bn trong hiu s vn hnh ca n. (3) Cch t chc cc b nh, v nht l phi hiu tht r cc thanh nh c dng. (4) Tp lnh m ic hiu v chp hnh.

(1) Cng dng cc chn ca ic Cc chn c bn v nht l


.

cc chn cng xut nhp d liu

Hnh v cho thy, ic AT89C51 c 40 chn. Cc chn chia ra lm 2 nhm: Nhm chn c bn gm c chn 20 ni masse v chn 40 ni vo ng ngun 5V. Chn 18, 19 gn thch anh nh tn

cho mch dao ng, do mt lnh cn 12 phn on, nn tn s xung nhp s l 1MHz hay chu k lnh s 1us . Chn s 9 dng lm chn reset, n to ra tc dng reset vi mc volt cao. Chn 31 dng chn nh lm vic vi b nh trong hay c vi b nh ngoi. Cc chn 29, 30 s dng khi chi ic AT89C51 lm vic vi cc b nh ngoi. Nhm cc chn dng lm cng xut nhp d liu. IC AT89C51 c 4 cng, mi cng 8 bit, vy c 32 chn dng xut nhp bit. Ngi ta dng tp tin nh ngha t tn cho cng v t tn cho cc chn ny. l: * Cc chn 39, 38, 37, 36, 35, 33, 32 c t tn l p0.0, p0.1, p0.2, p0.3, p0.4, p0.5, p0.6, p0.7 v c 8 chn gm li gi l p0 (hay gi l cng port 0). * Cc chn 1, 2, 3, 4, 5, 6, 7, 8 c t tn l p1.0, p1.1, p1.2, p1.3, p1.4, p1.5, p1.6, p1.7 v c 8 chn gm li gi l p1 (hay gi l cng port 1). * Cc chn 21, 22, 23, 24, 25, 26, 27, 28 c t tn l p2.0, p2.1, p2.2, p2.3, p2.4, p2.5, p2.6, p2.7 v c 8 chn gm li gi l p2 (hay gi l cng port 2). * Cc chn 10, 11, 12, 13, 14, 15 , 16, 17, 18 c t tn l p3.0, p3.1, p3.2, p3.3, p3.4, p3.5, p3.6, p3.7 v c 8 chn gm li gi l p3 (hay gi l cng port 3). Vi cc tn t nh vy, nn khi vit cc cu lnh, Bn c th dng trc tip cc tn gi ny, nh vy cng rt tin. Bn cnh hnh trn l mt s mch in c bn, khi Bn dng ic AT89C51 Bn c th rp theo s mch in ny. Cc chng trnh iu khin ca Bn s phi thng qu 4 cng ny iu khin cc thit b, do vic hiu r tc dng ca cc cng ny l rt quan trng.

(2) Cu trc cc khi chc nng bn trong hiu s vn


hnh ca n.

T s khi chc nng trn, Bn s thy cch vn hnh bn trong ca ic vi iu khin AT89C51. Trong ic c khi x l php ton ALU, ALU kt hp vi thanh ghi acc (cn gi l thanh a) v thanh b, y l khi ton thut quan trong ca ic. B ly cu lnh ca chng trnh trong khi nh Flash chp hnh, cch chy chng trnh theo thanh m PC v a ch th theo thanh ghi con tr dptr. B nh RAM trong c cc thanh ghi c dng dng iu khin cc c phn ca ic. Ngoi ra l s iu hnh 4 cng p0, p1, p2, p3 dng xut nhp d liu dng bit. Cui cng l khi dao ng to xung nhp theo thch anh gn thm t bn ngoi.

(3) Cch t chc cc b nh, v nht l phi hiu tht r cc


thanh nh c dng (SFR).

Hnh v cho thy cc b nh trong ca ic AT89C51. Vi b nh RAM ,ngoi 128 thanh dng lm cc thanh nh c dng (SFR) cn li 128 thanh vng thp c th cho ghi c ty . Vi b nh EEPROM, c 4K thanh nh, tc 1024x4 s thanh nh ni. Khi Bn ch mun chy chng trnh c trong b nh ni th cho chn /EA mc p cao (ni vo ngun 5V), trng hp Bn cn

mun chy cc chng trnh c trong b nh ngoi th cho chn /EA xung mc p thp, tc ni xung masse. Khi Bn cho ghi cc chng trnh t file .hex vo b nh ny, th chn /EA phi nhn mc p Vpp=12V (chuyn ny hp np s lm). Do ic AT89C51 ch c th x l b a ch 16 bit (8 bit x2), nn n ch c th truy cp cc b nh ngoi RAM hay ROM c dung lng l 65536 thanh nh (quen gi l b nh 64K).

Hnh v cho thy cch sp xp ca b nh RAM ca ic AT89C51. Trong ic vi iu khin no cng vy, vic hiu r cu trc ca b nh RAM l rt quan trng, y n c 256 thanh nh, c chia ra lm 2 phn. Phn 128 thanh nh vng trn c nhiu thanh dng lm thanh nh c dng (SFR), vng ny cng cn li nhiu thanh khng dng, n c cng dng d

phng tng tnh kh tin cho ic v Phn 128 thanh nh vng di dng lm cc thanh nh ghi c ty . y chnh l cc thanh nh "sn khu" dng iu hnh cc hot ng ca ic, cc thanh nh ghi c c ny cng nhiu th hot ng ca ic cng linh ng v nhanh. Ci c sc ca ic AT89C51 l trong mt s thanh nh (Bn xem hnh), ngi ta cn to ra a ch cho tng bit nh. Vy chng ta c th truy cp cc thanh nh bng a ch thanh v cn c th truy cp tng bit nh bng a ch bit.

Hnh trn y, ti v li vng cc thanh nh c cho b tr cc bit nh. C Bn hi lm sao phn bit c vic truy cp a

ch ca bit v a ch ca thanh. Vn ny c qui nh rt r rng, n ty theo tc v ca cu lnh. Mt th d: mov 00h, #10 ; Lnh ny cho np tr thp phn 10 vo thanh ghi 00h (tc thanh r0) clr 00h ; Lnh ny cho xa bit 00h (hay t 0 vo a ch 00h), nhn bng chng ta thy bit u ca thanh nh 20h c a ch bit l 00h (Bn xem hnh) . Trong 2 cu lnh trn, cng u c a ch l 00h. Nhng khi dng cho cc cu lnh c tc v trn thanh th n l a ch thanh, nh lnh mov (move) trn. V khi dng vi cu lnh c tc v trn bit th l a ch bit, nh lnh clr (clear bit) tin dng, ngi ta t tn cho 8 thanh nh trong bank0 l: r0, r1, r2, r3, r4, r5, r6, r7, khi bank 0 n c a ch tng ng l 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h. Bn c th cho di 8 thanh ny vo bank1, bank2 hay bank3 bng cc set bit trong thanh ghi trng thi PSW vi 2 bit RS1, RS0. Nu Bn chn: RS1 = 0 v RS0 = 0 , c ngha r6, r7 nm bank0 (mc nh). RS1 = 0 v RS0 = 1 , c ngha r6, r7 cho nm bank1. RS1 = 1 v RS0 = 0 , c ngha r6, r7 cho nm bank2. RS1 = 1 v RS0 = 1 , c ngha r6, r7 cho nm bank3. l 8 thanh r0, r1, r2, r3, r4, r5, l 8 thanh r0, r1, r2, r3, r4, r5, l 8 thanh r0, r1, r2, r3, r4, r5, l 8 thanh r0, r1, r2, r3, r4, r5,

Trong 8 thanh r0, r1, r2, r3, r4, r5, r6, r7 ch c 2 thanh r0, r1 cho Bn truy cp a ch gin tip rt hay vi k hiu l @r0, @r1. Bn xem cc cu lnh sau: mov r0, #20h ; Cu ny l np tr 20h vo thanh ghi r0 (r0 c a ch mc nh l 00h trong RAM). mov @r0, #20h ; Trong cu lnh ny l Bn cho np tr 20h vo thanh nh c a ch l 20h ( v trong r0 c tr 20h, @r0 khng phi l a ch 00h).

Cc thanh khc nh r2, r3, r4, r5, r6, r7 khng c tc v ny.

(4)

Tp lnh m ic hiu v chp hnh (Bng lit k cc cu lnh dng cho AT89C51).

S mch in: ng h c chnh gi dng ic vi iu khin AT89C51

(S ny ti dng OrCAD v li theo cc cu lnh trong chng trnh ngun bn di) Cn y l bi thc hnh ng h tm c trn mng ting Hoa (Tng ng vi chng trnh di. Hnh ny v s mch in cho nhiu chi tit c th hn. Bn hy tham kho hnh theo cc cu lnh)

(Hnh chp bo thc hnh: ng h c hn gi chy vi ic AT89C51)

S gc ca bi thc hnh ny, t liu ly t trang Web ting Hoa (Hnh kh m): Gii thch mch in (Ti tch s trn ra lm 5 phn nh sau): Hnh 1: Cho thy mch in c bn ca ic AT89C51 .

Chn 20 ni masse, chn 40 ni ngun 5V. Chn 18, 19 gn thch anh nh tn (Mch dng thch anh c tn s 6MHz). Chn 9 ni vo mch reset, khi cp in t c1 (10uF) np dng qua R4 (10K), tm thi a chn 9 ln mc p cao to tc dng reset, lc ny chng trnh s quay li t thanh 00h ca b nh ROM (trong AT89C51). Chn 31 cho ni vo ngun 5V l mun ch dng b nh ROM trong. Hnh 2: Gn cc nt chnh v cc Led ch th trn port 3.

Led ch th trn chn P3.1, P3.0 dng ch trng thi mode ang chnh. Led trn chn p3.7 dng bo mch n ng gi m hay ng gi tt, Bn c th dng bit ny iu khin mt TRIAC, ng m cc thit b ngoi. Theo chng trnh ngun th Kha Kha Kha Kha in in in in K1 K2 K3 K4 l l l l chn mode. chnh s ch gi chnh s chnh giy tr li chc nng ng h.

Hnh 3: Cng dng ca port2.

Dng 6 chn trn port 2 ng m cc transistor 8050, nhm cp 5V cho chn anode chung ca cc n s. Dng chn p2.6 lm tt m Led ch th v dng tn hiu trn chn p2.7 qua tng khuch i vi transistor 8550 kch thch loa, bo bng m thanh. Hnh 4: Mch kim sot cc thit b ngoi vi bit trn chn p3.7.

Khi chn p3.7 ln mc p cao (ng gi m, ON), n qua b ghp quang in cp p cho cc G ca TRIAC, TRIAC dn in v n s c cp in nn pht sng. ... v n khi chn p3.7 xung mc p thp (ng gi tt OFF), n qua b ghp quang in s lm tt TRIAC v n s tt. ng gi hn (ON) th n sng v sau ... ng gi hn (OFF) th n s tt v qui trnh s lp li. Hnh 5: Dng port2 v port 1 iu khin bng n s vi cc Led theo m 7 on.

S cho thy: M hin s 7 on cho xut ra trn cc chn ca port 1. N cp dng cho cc chn cathode ca n s v port 2 dng tt m cc transistor 8050 (pnp) mi ln ch cp 5V cho mt chn anode chung ca mt n s. Vi cch lm vic nhanh ny, Bn s lun thy gi - pht - giy hin ra trn 6 n s 7 on trn (nhng tht ra mi ln ch m c mt n s). hiu r hn v cch hin s trn n s Led 7 on, Bn xem hnh ng sau:

Trong m nh phn xut ra lm cc chn cathode ca cc Led trong n thng masse c cho xut ra trn cng port 1. Bn thy vi m hin s xut ra, nu chng ta sp cc Led theo hng ngang th chng thy g l c, ch thy cc Led nhp nhy, nhng khi sp cc Led ny theo dng hnh ch Nht (

) th vn li khc, n chnh l cc con s t 0...9.

Chng trnh ngun.


;; Dong ho co nut chinh mo chinh tat ;;-----------------------------------------k1 bit p3.2 k2 bit p3.4 k3 bit p3.3 k4 bit p3.5 c_hour equ 23h c_minute equ 24h c_second equ 25h on_hour equ 26h on_minute equ 27h off_hour equ 28h off_minute equ 29h org 0000h jmp main

org 0003h jmp wint0 org 000bh jmp wt0 org 0030h main: mov sp, #50h clr 00h mov 21h, #0 mov 22h, #0 mov c_hour, #0 mov c_minute, #0 mov c_second, #0 mov on_hour, #0 mov on_minute, #0 mov off_hour, #0 mov off_minute, #0 ;; mov th0, #05 mov tl0, #05 mov tmod, #00000010b ;02h ;; setb ea setb ex0 clr et0 clr tr0 clr it0 m: mov a, c_hour cjne a, on_hour, off_time mov a, c_minute cjne a, on_minute, off_time setb p3.7 jmp next off_time: mov a, c_hour cjne a, off_hour, next mov a, c_minute cjne a, off_minute, next clr p3.7 next: jnb 00h, m call disp1 jmp m ;; tab: db 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h

db 90h ;; disp1: mov r0, c_hour mov dptr, #tab mov a, r0 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.0 call dl setb p2.0 mov a, r0 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.1 call dl setb p2.1 ;; mov r1, c_minute mov a, r1 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.2 call dl setb p2.2 mov a, r1 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.3 call dl setb p2.3 ;; mov r2, c_second mov a, r2 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.4 call dl

setb p2.4 mov a, r2 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.5 call dl setb p2.5 ret ;; wt0: push acc push psw inc 21h mov a, 21h cjne a, 0c8h, t0reti ; 200d=0c8h 0.5ms*200=100ms mov 21h, #0 inc 22h mov a, 22h cjne a, #10, t0reti ; 100ms*10=1s mov 22h, #0 cpl p0.0 cpl p0.1 ;; mov a, #01h add a, c_second da a mov c_second, a cjne a, #60h, t0reti mov c_second, #0 ;; mov a, #01h add a, c_minute da a mov c_minute, a cjne a, #60h, t0reti mov c_minute, #0 ;; mov a, #01h add a, c_hour da a mov c_hour, a cjne a, #24h, t0reti mov c_hour, #0 ;;

t0reti: pop psw pop acc reti ;; disp2: mov r0, on_hour mov dptr, #tab mov a, r0 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.0 call dl setb p2.0 mov a, r0 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.1 call dl setb p2.1 ;; mov r1, on_minute mov a, r1 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.2 call dl setb p2.2 mov a, r1 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.3 call dl setb p2.3 ret ;; disp3: mov r0, off_hour mov dptr, #tab

mov a, r0 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.0 call dl setb p2.0 mov a, r0 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.1 call dl setb p2.1 ;; mov r1, off_minute mov a, r1 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.2 call dl setb p2.2 mov a, r1 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.3 call dl setb p2.3 ret ;; dl: mov 30h, #02h dl1: mov 31h, #0ffh djnz 31h, $ djnz 30h, dl1 ret ;; del: mov 32h, #100 del1: mov 33h, #250 djnz 33h, $ djnz 32h, del1

ret ;; wint0: push acc push psw clr ex0 clr tr0 clr et0 k1_11: call disp1 jb k1, k1_11 k11_1: call disp1 jnb k1, k11_1 ;; ph4: setb p3.1 setb p3.0 ph0: call disp1 jb k2, ph01 ;; k2_1: call disp1 jnb k2, k2_1 mov r0, c_hour mov a, #01h add a, r0 da a mov c_hour, a cjne a, #24h, ph0 mov c_hour, #0 ph01: jb k3, ph1 k3_1: call disp1 jnb k3, k3_1 mov r0, c_minute mov a, #01h add a, r0 da a mov c_minute, a cjne a, #60h, ph0 mov c_minute, #0 ph1: jb k4, ph10 k4_1:

call disp1 jnb k4, k4_1 jmp tend ph10: jb k1, ph0 k1_1: call disp1 jnb k1, k1_1 clr p3.0 setb p3.1 ;;-------------------------------ph2: call disp2 jb k2, ph201 k22_1: call disp2 jnb k2, k22_1 mov r0, on_hour mov a, #01h add a, r0 da a mov on_hour, a cjne a, #24h, ph2 mov on_hour, #0 ph201: jb k3, ph210 k22_2: call disp2 jnb k3, k22_2 mov r0, on_minute mov a, #01h add a, r0 da a mov on_minute, a cjne a, #60h, ph2 mov on_minute, #0 ph210: jb k1, ph2 k22_3: call disp2 jnb k1, k22_3 setb p3.0 clr p3.1 ;;---------------------------------------ph3: call disp3 jb k2, ph301

k33_1: call disp3 jnb k2, k33_1 mov r0, off_hour mov a, #01h add a, r0 da a mov off_hour, a cjne a, #24h, ph3 mov off_hour, #0 ph301: jb k3, ph310 k33_2: call disp3 jnb k3, k33_2 mov r0, off_minute mov a, #01h add a, r0 da a mov off_minute, a cjne a, #60h, ph3 mov off_minute, #0 ph310: jb k1, ph3 k33_3: call disp3 jnb k1, k33_3 jmp ph4 ;;---------------------------------------tend: setb ex0 setb tr0 setb 00h setb et0 setb p3.7 pop psw pop acc reti end

(Bn c th cho ct file ngun ny dn vo trnh MIDE cho bin dch ra file .hex v cho np file ny vo ic AT89C51, np xong gn ic ny vo bo mch in trn, khi mch c cp in cc Led s s hin ra Gi-PhtGiy)

Sau khi bin dch xong, trnh MIDE bo khng li (no errors), lc ny Bn s c file m ly h .hex, trong file ny, Bn thy cc hng s vit theo h m 16, khi np vo ic n s c cho i ra dng nh phn v np vo b nh EEP-ROM ca ic vi iu khin AT89C51.
:060000000200300201C9FC :03000B000200EB05

:10003000758150C20075210075220075230075245A :1000400000752500752600752700752800752900A4 :10005000758C05758A05758902D2AFD2A8C2A9C26E :100060008CC288E523B5260AE524B52705D2B70258 :10007000007EE523B52807E524B52902C2B7300084 :10008000E212009080DDC0F9A4B0999282F88090CD :10009000A823900086E8C4540F93F590C2A01201E3 :1000A000AFD2A0E8540F93F590C2A11201AFD2A134 :1000B000A924E9C4540F93F590C2A21201AFD2A2B1 :1000C000E9540F93F590C2A31201AFD2A3AA25EA77 :1000D000C4540F93F590C2A41201AFD2A4EA540FF6 :1000E00093F590C2A51201AFD2A522C0E0C0D00501 :1000F00021E521B5C8387521000522E522B40A2E74 :10010000752200B280B28174012525D4F525B46032 :100110001D75250074012524D4F524B460107524C0 :100120000074012523D4F523B42403752300D0D013 :10013000D0E032A826900086E8C4540F93F590C210 :10014000A01201AFD2A0E8540F93F590C2A1120102 :10015000AFD2A1A927E9C4540F93F590C2A212010E :10016000AFD2A2E9540F93F590C2A31201AFD2A36C :1001700022A828900086E8C4540F93F590C2A012DC :1001800001AFD2A0E8540F93F590C2A11201AFD2F3 :10019000A1A929E9C4540F93F590C2A21201AFD2CC :1001A000A2E9540F93F590C2A31201AFD2A3227516 :1001B00030027531FFD531FDD530F72275326475C7 :1001C00033FAD533FDD532F722C0E0C0D0C2A8C281 :1001D0008CC2A9119020B2FB119030B2FBD2B1D2E7 :1001E000B0119020B413119030B4FBA823740128EF :1001F000D4F523B424EB75230020B313119030B34E :10020000FBA824740128D4F524B460D575240020FB :10021000B508119030B5FB02029820B2C41190309D :10022000B2FBC2B0D2B1313320B413313330B4FB9E :10023000A826740128D4F526B424EB75260020B333 :1002400013313330B3FBA827740128D4F527B460E9 :10025000D575270020B2CF313330B2FBD2B0C2B156 :10026000317120B413317130B4FBA828740128D443 :10027000F528B424EB75280020B313317130B3FB9B :10028000A829740128D4F529B460D575290020B2B5 :10029000CF317130B2FB21DDD2A8D28CD200D2A9ED :0702A000D2B7D0D0D0E0324C :00000001FF

Phn tch chng trnh ngun.


;; ---------------------------------------------------------------------------------------

;; Bn cho nh ngha cc bit, cc thanh nh bng ch cho d nh d dng trong cu lnh. ;;---------------------------------------------------;; Dong ho co nut chinh mo chinh tat ;;---------------------------------------------------k1 bit p3.2 ; nh ngha ch K1 l chn p3.2

k2 k3 k4

bit p3.4 bit p3.3 bit p3.5

; nh ngha ch K2 l chn p3.4 ; nh ngha ch K3 l chn p3.3 ; nh ngha ch K4 l chn p3.5

;; Dng tn t cho cc thanh a ch sau ny dng trong cc cu lnh s d nh hn. c_hour equ 23h ; Ly thanh nh 23h nh s m gi c_minute equ 24h ; Ly thanh nh 24h nh s m pht c_second equ 25h ; Ly thanh nh 25h nh s m giy on_hour equ 26h ; Ly thanh nh 26h nh s m gi hn m on_minute equ 27h ; Ly thanh nh 27h nh s m pht hn m off_hour equ 28h ; Ly thanh nh 28h nh s m gi hn tt off_minute equ 29h ; Ly thanh nh 29h nh s m pht hn tt ;; Khi u chng trnh ng h t a ch thanh 0000h tc thanh reset.
org 0000h ; Khi t a ch ca thanh reset.

jmp main chc nng ngt org 0003h chn p3.2. jmp wint0 trn p3.2 org 000bh timer T0. jmp wt0 timer T0 org 0030h

; Cho nhy qua cc thanh nh dng cho ; Ni chy trnh ngt ngoi theo bit 0 trn ; Chng trnh ngt theo phm nhn gn ; Ni chy trnh ngt theo bit trn tf0 ca ; Chng trnh ngt theo bit trn tf0 ca

; ------------Khi u chng trnh chnh---------------main: ; Tn nhn chng trnh chnh mov sp, #50h ; Xc nh a ch chn vng lm ngn xp ;; Cc tr khi u, tt c cho v tr 0.
clr 00h ; Cho xa bit kim tra ly a ch 00h

mov 21h, #0 mov 22h, #0 mov c_hour, #0

; Cho xa sch thanh nh c a ch l 21h ; Cho xa sch thanh nh c a ch l 22h ; Cho xa sch thanh nh dng m gi

mov c_minute, #0 mov c_second, #0 mov on_hour, #0 m mov on_minute, #0 m mov off_hour, #0 tt mov off_minute, #0 tt

; Cho xa sch thanh nh dng m pht ; Cho xa sch thanh nh dng m giy ; Cho xa sch thanh nh dng hn gi ; Cho xa sch thanh nh dng hn pht ; Cho xa sch thanh nh dng hn gi ; Cho xa sch thanh nh dng hn pht

;;----------------t mode ng h T0 v t tr khi u vo thanh th0, tl0 ca timer T0-------------;;Dng ng h timer 0, mode 2, mode t np li cho m thi gian mov th0, #05 ; t tr khi u cho thanh th0. mov tl0, #05 ; ; t tr khi u cho thanh tl0. mov tmod, #00000010b ;02h (Chn ng h T0, chy theo mode 2, mode 8 bit, t np li). ;;---------------t h----------------;; setb ea setb ex0 chn p3.2) clr et0 clr tr0 clr it0 cc ngt v iu kin lm vic ca ng

; Cho m tt c 6 ngt ca AT89C51 ; t ngt cho /INT0 (Cho m ngt ngoi /INT0, trn ; Tt ngt theo bit trn ca T0 ; Cho ngng chy ng h T0 ; Cho xa tnh u tin ca ngt /INT0

;---------------- Khi u cho m gi----------------;-----------Kim tra ng gi bo m (ON). m: mov a, c_hour ; Chuyn tr trong thanh m gi vo a cjne a, on_hour, off_time ; So snh tr trong a vi tr trong on_hour, qua so vi off_time mov a, c_minute ; Chuyn tr trong thanh m pht vo a cjne a, on_minute, off_time ; So snh tr trong a vi tr trong on_minute, qua so vi off_time setb p3.7 ; t p3.7 ln mc cao bo gi m jmp next ; Nhy v tn nhn next tip tc phn ng h

;-----------Kim tra ng gi bo tt (OFF). off_time: mov a, c_hour ; chuyn tr trong c_hour vo thanh a. cjne a, off_hour, next ; So snh tr ca a vi tr trong off_hour. mov a, c_minute ; chuyn tr trong c_minute vo thanh a. cjne a, off_minute, next ; So snh tr ca a vi tr trong off_minute clr p3.7 ; t p3.7 xung mc p thp bo gi tt next: jnb 00h, m ; Kim tra bit 00h, nu n bit 0 th nhy n tn nhn m call disp1 ; Gi chng trnh cho hin th ng h jmp m ; nhy tr li tn nhn m tip tc kim tra gi m gi tt ;;-------------Bng cha cc m hin s trn Led 7 on-------tab: db 0c0h (0), 0f9h (1), 0a4h (2), 0b0h (3), 99h (4), 92h (5), 82h (6), 0f8h (7), 80h (8), 90h (9) ;; Ghi ch: Bng m ny s lm sng cc Led trn n s, ty theo s sp xp ca Bn. ;; Bn c th chn nh li cho ng. Nu a v dng h c 2 s d thy hn. ;; 0c0h (0), 1100-0000 ;; 0f9h (1), 1111-1001 ;; 0a4h (2), 1010-0100 ;; 0b0h (3), 1011-0000 ;; 99h (4), 1001-1001 ;; 92h (5), 1001-0010 ;; 82h (6), 1000-0010 ;; 0f8h (7), 1111-1000 ;; 80h (8), 1000-0000 ;; 90h (9) 1001-0000 ,, Nhn cc dy s nh phn, Bn thy khi cho xut bit 0 l Led sng v cho xut bit 1 l Led tt ;; Vy theo bng s ny, b tr trn port 1 cho 7 chn cathode ca n s s l: ;; a (p1.0), b(p1.1), c(p1.2), d(p1.3), e(p1.4), f(p1.5), g(p1.6), (p1.7 khng v l du chm). ;;-----------Chng trnh thng---------------------cho hin s lc m gi bnh

disp1: ; Cho hin s 2 s ch gi (hour) mov r0, c_hour ; chuyn tr trong c_hour vo thanh r0 mov dptr, #tab ; t a ch bng vo thanh ghi con tr mov a, r0 ; Chuyn tr trong r0 vo thanh a swap a ; hon i v tr 4 bit cao 4 bit thp trong thanh a anl a, #0fh ; Ly logic AND che 4 bit cao, gi nguyn 4 bit thp movc a, @a+dptr ; Vo bng ly m theo tr ca a, m ny ct vo a mov p1, a ; Cho xut m hin s ly trong bng ra trn cng port1 clr p2.0 ; Cho m s gi (hng n v ) bng cch cp +5V cho n s 7 on call dl ; Cho lm tr n s sng setb p2.0 ; tt n hin gi (v) trnh lem s mov a, r0 ; Chuyn tr c trong thanh r0 vo li a anl a, #0fh ; Ly logic AND che 4 bit cao, gi nguyn 4 bit thp movc a, @a+dptr ; Vo bng ly m theo tr ca a, m ny ct vo a mov p1, a ; Cho xut m hin s ly trong bng ra trn cng port1 clr p2.1 ; Cho m s gi (hng chc) bng cch cp +5V cho n s 7 on call dl ; Cho lm tr n s sng setb p2.1 ; tt n hin gi (h chc) trnh lem s ;; Cho hin s 2 s ch pht (minute) mov r1, c_minute ; Chuyn tr trong c_minute vo thanh r1 mov a, r1 ; Chuyn tr trong r1 vo thanh a swap a ; hon i v tr 4 bit cao 4 bit thp trong thanh a anl a, #0fh ; Ly logic AND che 4 bit cao, gi nguyn 4 bit thp movc a, @a+dptr ; Vo bng ly m theo tr ca a, m ny ct vo a mov p1, a ; Cho xut m hin s ly trong bng ra trn cng port1 clr p2.2 ; Cho m s pht (hng n v ) bng cch cp +5V cho n s 7 on call dl ; Cho lm tr n s sng setb p2.2 ; tt n hin pht (h n v) trnh lem s mov a, r1 ; Li chuyn tr trong r1 vo thanh a

anl a, #0fh thp

; Ly logic AND che 4 bit cao, gi nguyn 4 bit

movc a, @a+dptr ; Vo bng ly m theo tr ca a, m ny ct vo mov p1, a ; Cho xut m hin s ly trong bng ra trn cng port1 clr p2.3 ; Cho m s pht (hng chc ) bng cch cp +5V cho n s 7 on call dl ; Cho lm tr n s sng setb p2.3 ; tt n hin pht (h chc) trnh lem s ;; Cho hin s 2 s ch giy (second) mov r2, c_second ; Chuyn tr trong c_second vo thanh r2 mov a, r2 ; Chuyn tr trong r2 vo thanh a swap a ; hon i v tr 4 bit cao 4 bit thp trong thanh a anl a, #0fh ; Ly logic AND che 4 bit cao, gi nguyn 4 bit thp movc a, @a+dptr ; Vo bng ly m theo tr ca a, m ny ct vo a mov p1, a ; Cho xut m hin s ly trong bng ra trn cng port1 clr p2.4 ; Cho m s giy (hng n v ) bng cch cp +5V cho n s 7 on call dl ; Cho lm tr n s sng setb p2.4 ; tt n hin giy (h n v) trnh lem s mov a, r2 ; Li chuyn tr trong r2 vo thanh a anl a, #0fh ; Ly logic AND che 4 bit cao, gi nguyn 4 bit thp movc a, @a+dptr ; Vo bng ly m theo tr ca a, m ny ct vo mov p1, a ; Cho xut m hin s ly trong bng ra trn cng port1 clr p2.5 ; Cho m s giy (hng chc ) bng cch cp +5V cho n s 7 on call dl ; Cho lm tr n s sng setb p2.5 ; tt n hin giy (h n v) trnh lem s ret ; Quay li sau cu lnh CALL DISP1 ;; -------------Chng trnh m thi gian---------------wt0: push acc ; Tm ct tr ca thanh a vo ngn xp. push psw ; Tm ct thanh trng thi vo ngn xp inc 21h ; cho tng tr trong thanh 21h theo bc +1. mov a, 21h ; Chuyn tr trong thanh 21h vo thanh a cjne a, 0c8h, t0reti ; 200d=0c8h 0.5ms*200=100ms. Cho so snh a vi tr 0c8h nhy mov 21h, #0 ; Tr tr trong thanh 21h v tr 0

inc 22h ; cho tng tr trong thanh 22h theo bc +1 mov a, 22h ; Chuyn tr trong thanh 22h vo thanh a cjne a, #10, t0reti ; 100ms*10=1s. Cho so snh a vi tr 10 nhy mov 22h, #0 ; Tr tr trong thanh 22h v tr 0 cpl p0.0 ; Ly b bit p0.0 cpl p0.1 ; Ly b bit p0.0 ;;------------Cho m Gi - Pht Giy theo bc tng +1 ------------;; m giy mov a, #01h ; Cho chuyn tr 01h vo thanh a add a, c_second ; Cho cng tr trong thanh c_second vi a, kt qu ct vo a da a ; i v dng s thp phn 4 bit cao v 4 bit thp mov c_second, a ; Chuyn tr trong a tr li thanh c-second cjne a, #60h, t0reti ; So snh tr trong a l 60 cha nhy mov c_second, #0 ; l 60 ri th tr thanh c_second tr li tr 0 ;; m pht mov a, #01h ; Cho chuyn tr 01h vo thanh a add a, c_minute ; Cho cng tr trong thanh c_minute vi a, kt qu ct vo a da a ; i v dng s thp phn 4 bit cao v 4 bit thp mov c_minute, a ; Chuyn tr trong a tr li thanh c-minute cjne a, #60h, t0reti ; So snh tr trong a l 60 cha nhy mov c_minute, #0 ; l 60 ri th tr thanh c_minute tr li tr 0 ;; m gi mov a, #01h ; Cho chuyn tr 01h vo thanh a add a, c_hour ; Cho cng tr trong thanh c_hour vi a, kt qu ct vo a da a ; i v dng s thp phn 4 bit cao v 4 bit thp mov c_hour, a ; Chuyn tr trong a tr li thanh c-hour cjne a, #24h, t0reti ; So snh tr trong a l 24 cha nhy mov c_hour, #0 l 24 ri th tr thanh c_hour tr li tr 0 ;; Chng trnh dng ngt timer 0 t0reti: pop psw

pop acc reti ;;---------------Cho hin gi - pht lc chnh ON----------------;; Vit ging nh on disp1 disp2: mov r0, on_hour mov dptr, #tab mov a, r0 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.0 call dl setb p2.0 mov a, r0 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.1 call dl setb p2.1 ;; mov r1, on_minute mov a, r1 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.2 call dl setb p2.2 mov a, r1 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.3 call dl setb p2.3 ret

;;------------------Cho hin gi - pht lc chnh OFF---------------------;; Vit ging nh on disp1 disp3: mov r0, off_hour mov dptr, #tab mov a, r0 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.0 call dl setb p2.0 mov a, r0 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.1 call dl setb p2.1 ;; mov r1, off_minute mov a, r1 swap a anl a, #0fh movc a, @a+dptr mov p1, a clr p2.2 call dl setb p2.2 mov a, r1 anl a, #0fh movc a, @a+dptr mov p1, a clr p2.3 call dl setb p2.3 ret

;;--------------------Chng trnh lm tr gi cho Led sng -----------------dl: mov 30h, #02h dl1: mov 31h, #0ffh djnz 31h, $ djnz 30h, dl1 ret ;;----------------------Chng trnh lm tr-----------------------del: mov 32h, #100 del1: mov 33h, #250 djnz 33h, $ djnz 32h, del1 ret ;;----------------wint0: push acc push psw clr ex0 clr tr0 clr et0 ;----------------------Chng trnh kim tra phm nhn ------------------k1_11: call disp1 ; Vn cho hin th ng h vi gi - pht - giy jb k1, k1_11 ; Kim tra phm nhn K1, ch nhn phm c bit 0 ;---------------Kim tra phm nhn K1, ch b phm k11_1: call disp1 ; Vn cho hin th ng h vi gi - pht - giy jnb k1, k11_1 ; Kim tra phm nhn K1, ch b nhn phm c bit 1 ;; ph4: setb p3.1 setb p3.0 ; t chn p3.1 ln mc p cao ; t chn p3.0 ln mc p cao

ph0:

call disp1 ; Vn cho hin th ng h vi gi - pht - giy jb k2, ph01 ; Kim tra phm nhn K2, ch nhn phm c bit 0

;; k2_1: call disp1 ; Vn cho hin th ng h vi gi - pht - giy jnb k2, k2_1 ; Kim tra phm nhn K2, ch b nhn phm c bit 1 mov r0, c_hour ; Cho chuyn tr trong c_hour vo thanh r0 mov a, #01h ; t tr 01h vo thanh ghi a add a, r0 ; Cho cng tr trong a vi 1 v ct vo a da a ; Thp phn ha 4 bit cao v 4 bit thp mov c_hour, a ; Cho chuyn tr trong a ra thanh c-hour cjne a, #24h, ph0 ; Cho so snh a vi s 24 nhy mov c_hour, #0 ; Tr tr trong c-hour v 0 ph01: jb k3, ph1 ; Kim tra phm nhn K3, ch nhn phm c bit 0 k3_1: call disp1 ; Vn cho hin th ng h vi gi - pht - giy jnb k3, k3_1 ; Kim tra phm nhn K3, ch b nhn phm c bit 1 mov r0, c_minute ; Cho chuyn tr trong c_minute vo thanh r0 mov a, #01h ; t tr 01h vo thanh ghi a add a, r0 ; Cho cng tr trong a vi r0 v ct vo a da a ; Thp phn ha 4 bit cao v 4 bit thp mov c_minute, a ; Cho chuyn tr trong a ra thanh c-minute cjne a, #60h, ph0 ; Cho so snh a vi s 60 nhy mov c_minute, #0 ; Tr tr trong c-minute v 0 ph1: jb k4, ph10 ; Kim tra phm nhn K4, ch nhn phm c bit 0 k4_1: call disp1 ; Vn cho hin th ng h vi gi - pht - giy jnb k4, k4_1 ; Kim tra phm nhn K4, ch b nhn phm c bit 1 jmp tend ; Nhy khng iu kin n tn nhn tend (kt thc Timer End)

;---------------Vo mode chnh gi - pht cho mode ON--------ph10: jb k1, ph0 ; Kim tra phm nhn K1, ch nhn phm c bit 0 k1_1: call disp1 ; Vn cho hin th ng h vi gi - pht - giy jnb k1, k1_1 ; Kim tra phm nhn K1, ch b nhn phm c bit 1 clr p3.0 ; t p3.0 mc p thp. setb p3.1 ; t p3.1 mc p cao ;;-------------------------------ph2: call disp2 ; Cho hin th gi - pht mode ON jb k2, ph201 ; Kim tra phm nhn K2, ch nhn phm c bit 0 k22_1: call disp2 ; Vn cho hin th gi - pht mode ON jnb k2, k22_1 ; Kim tra phm nhn K2, ch b nhn phm c bit 1 mov r0, on_hour ; Chuyn tr trong on_hour vo thanh r0 mov a, #01h ; t tr 01h vo thanh ghi a add a, r0 ; Cho cng tr trong a vi r0 v ct vo a da a ; Thp phn ha 4 bit cao v 4 bit thp mov on_hour, a ; Cho chuyn tr trong a ra thanh on_hour cjne a, #24h, ph2 ; Cho so snh a vi s 24 nhy mov on_hour, #0 ; Tr tr trong on-hour v 0 ph201: jb k3, ph210 ; Kim tra phm nhn K3, ch nhn phm c bit 0 k22_2: call disp2 ; Vn cho hin th gi - pht mode ON jnb k3, k22_2 ; Kim tra phm nhn K3, ch b nhn phm c bit 1 mov r0, on_minute ; Chuyn tr trong on_minute vo thanh r0 mov a, #01h ; t tr 01h vo thanh ghi a add a, r0 ; Cho cng tr trong a vi r0 v ct vo a da a ; Thp phn ha 4 bit cao v 4 bit thp mov on_minute, a ; Cho chuyn tr trong a ra thanh on_minute

cjne a, #60h, ph2 ; Cho so snh a vi s 60 nhy mov on_minute, #0 ; Tr tr trong on-minute v 0 ph210: jb k1, ph2 0 ; Kim tra phm nhn K1, ch nhn phm c bit

k22_3: call disp2 ; Vn cho hin th gi - pht mode ON jnb k1, k22_3 ; Kim tra phm nhn K1, ch b nhn phm c bit 1 setb p3.0 ; t bit p3.0 ln mc p cao clr p3.1 ; t bit p3.1 xung mc p thp ;;---------------------------------------ph3: call disp3 ; Cho hin th gi - pht mode OFF jb k2, ph301 ; Kim tra phm nhn K2, ch nhn phm c bit 0 k33_1: call disp3 ; Vn cho hin th gi - pht mode OFF jnb k2, k33_1 ; Kim tra phm nhn K2, ch b nhn phm c bit 1 mov r0, off_hour ; Chuyn tr trong off_hour vo thanh r0 mov a, #01h ; t tr 01h vo thanh ghi a add a, r0 ; Cho cng tr trong a vi r0 v ct vo a da a ; Thp phn ha 4 bit cao v 4 bit thp mov off_hour, a ; Cho chuyn tr trong a ra thanh off_hour cjne a, #24h, ph3 ; Cho so snh a vi s 24 nhy mov off_hour, #0 ; Tr tr trong off-hour v 0 ph301: jb k3, ph310 ; Kim tra phm nhn K3, ch nhn phm c bit 0 k33_2: call disp3 ; Vn cho hin th gi - pht mode OFF jnb k3, k33_2 ; Kim tra phm nhn K2, ch b nhn phm c bit 1 mov r0, off_minute ; Chuyn tr trong off_minute vo thanh r0 mov a, #01h ; t tr 01h vo thanh ghi a add a, r0 ; Cho cng tr trong a vi r0 v ct vo a da a ; Thp phn ha 4 bit cao v 4 bit thp

mov off_minute, a ; Cho chuyn tr trong a ra thanh off_minute cjne a, #60h, ph3 ; Cho so snh a vi s 60 nhy mov off_minute, #0 ; Tr tr trong off-minute v 0 ph310: jb k1, ph3 ; Kim tra phm nhn K1, ch nhn phm c bit 0
k33_3:

call disp3 ; Vn cho hin th gi - pht mode OFF jnb k1, k33_3 ; Kim tra phm nhn K1, ch b nhn phm c bit 1 jmp ph4 ; Nhy khng iu kin v tn nhn ph4 ;;---------------------------------------tend: setb ex0 ; Set li bit ex0, cho m ngt ngoi trn chn p3.2 setb tr0 ; Set li bit tr0, cho chy ng h T0 setb 00h ; Set li bit kim tra v tr 00h setb et0 ; Set li bit et0, cho m ngt theo bit trn ca timer T0 setb p3.7 ; t chn p3.7 ln mc p cao pop psw ; T ngn xp hon tr li tr cho thanh trng thi psw pop acc ; T ngn xp hon tr li tr cho thanh a reti ; Dng chng trnh ngt end Khi vit on chng trnh trn, Bn cn hiu r mt s vn sau: * Cch dng ngt theo bit bo trn tf0 m thi gian. C mi khi xut hin bit trn tf0=1 l nhy v chy chng trnh ngt a ch 000bh, y c lnh nhy vo chng trnh ngt vitn nhn l wt0 m thi gian v khi m xong th nhy n tn nhn l toreti v khi gp cu lnh reti th dng ngt. * Ch cch dng cu lnh da <thanh nh (cha tr nh phn)> * Lnh nhy jb <bit>, jnb <bit>. Lnh nhy sau khi kim tra cc bit ca cc phm nhn.

* Lnh cjne a, <tr>, tn nhn. Lnh nhy sau php so snh nh tr gii hn ca mi s m, s m c th l 24 (cho gi), hay l 60 (cho giy, cho pht). * ly tr lin k trong bng np vo thanh a th Bn dng cu lnh: mov dptr, #tab dptr. ; t a ch ca bng vo thanh ghi con tr

y Bn xc nh tr cho s a, ri dng cu lnh sau ly tr trong bng. movc a, @a+dptr m cho ct vo a ; Vo bng ly m theo tr ca a, ly xong

Nhn Bn
Bn click vo cc dng di xem cc ti c lin quan n ic vi iu kin:

Tr li th: Lm bng n quang bo ma trn Led 8x8 chy ch ch dng 1 ic AT89C51 Vit cho cc Bn mi lm quen vi ic vi iu khin, h AT89C51, ic lm vic theo cu lnh. K chuyn: Ti dng bo khin AT89C2051, 12 ng ra rp n ho quang cho tng Pht B trn t M Gii thiu sn phm: Dng bo vi iu khin h AT89... 16 ng ra lm bng n qung co.

Hng dn Bn vit 10 chng trnh ng dng c bn cho ic vi iu khin AT89C51

Gii thiu cch dng hp np ic vi iu khin TOP853

Tm kt
Dng ic vi iu khin AT89C51 hay AT89C2051 vit v mch in ng h trn mang c rt nhiu, nht l mang ting Hoa. Sau y ti ghi li t liu tm c trn mng, mt chng trnh dng ic vi iu khin AT89C2051 dng lm ng h c tnh chuyn nghip hn, Bn tham kho. S mch in:

S cho thy, mch dng ic vi iu kin AT89C2051 lm mch iu khin cho hin th s ch trn bng n LCD loi 14 chn c nt chnh mc sng v ic ng h DS1307 chy thch anh 32768Hz (tc 2 ly tha 15). Mch in ny chuyn nghip hn, mt thi lm ra kinh t khi dng n lm bng n ng h s Chng trnh ngun:
;* ;* ;* DISPLAY: MICRO: ATMEL FILENAME: 16X2 LCD AT89C2051 4-BIT FLASH BASED AT1307.ASM OPERATION MICRO

;* ;* ;* ; ; ; $MOD51 SCL SDA DS1307W DS1307R FLAGS LASTREAD ACK BUS_FLT _2W_BUSY BITCNT BYTECNT SECS MINS HRS DAY DATE MONTH YEAR CONTROL ALM_HOUR ALM_MIN ALM_CNTRL ALM_STORE ; LCD_DATA LCD_DB4 LCD_DB5 LCD_DB6 LCD_DB7 LCD_RS LCD_RW LCD_E ; UP_BTTN DOWN_BTTN ENTER ALARM_SET ; CONFIG ENTRYMODE ; OFFCUR BLINKCUR ; CLRDSP

PROJECT: TIMEKEEPER: DATE: DS1307 SERIAL

ALARM TIMEKEEPER

CLOCK 06/10/98 I.C.

P1.0 P1.1 EQU 0D0H ; SLAVE 1101 000 + 0 TO WRITE EQU 0D1H ; SLAVE 1101 000 + 1 TO READ 20H FLAGS.0 FLAGS.5 FLAGS.6 FLAGS.7 21H 22H DATA 24H ; SECONDS STORAGE RAM DATA 25H ; ' MINUTES ' ' DATA 26H ; ' HOURS ' ' DATA 27H ; ' DAY ' ' DATA 28H ; ' DATE ' ' DATA 29H ; ' MONTH ' ' DATA 2AH ; ' YEAR ' ' DATA 2BH ; FOR STORAGE OF CONTROL REGISTER WHEN READ. DATA 2CH ; INTERNAL (ALARM HOURS) STORAGE. DATA 2DH ; INTERNAL (ALARM MINUTES) STORAGE. DATA 2EH ; INTERNAL STORAGE FOR ALARM (ON) TIME. EQU 08H ; DS1307 RAM, ALARM STORAGE, BEGINNING. ***LCD EQU NIBBLE OF NIBBLE OF NIBBLE OF NIBBLE OF P3.3 LCD P3.4 LCD ; P3.5 CONTROL*** 090H DATA DATA DATA DATA LINE LINE LINE KEYS*** P3.0 P3.1 P3.2 TIME SET UP DOWN ENTER SELECT

BIT BIT ADDRESS ADDRESS DATA BIT BIT BIT BIT DATA DATA '

EQU EQU EQU EQU EQU EQU EQU

094H 095H 096H 097H

; P1.4 ; P1.5 ; P1.6 ; P1.7 0B3H 0B4H 0B5H ***USER

HIGH HIGH HIGH HIGH ; ;

PORT PORT PORT PORT

1 IS 1 IS 1 IS 1 IS REGISTER READ / LCD

USED FOR USED FOR USED FOR USED FOR SELECT WRITE ENABLE

INPUT 0B0H 0B1H 0B2H ; ***SYSTEM ; ; P1.2 ; ALARM

BIT BIT BIT BIT 092H

INSTRUCTIONS*** DATA,2 CURSOR CONTROL EQU EQU LINES,5X7 DON'T MATRIX SHIFT LCD DISPLAY

EQU EQU

28H 6 ***CURSOR

; ;

4-BIT INCREMENT

INSTRUCTIONS*** 0CH 0DH

***DISPLAY EQU

CONTROL

INSTRUCTIONS*** 01H

ONDSP ; SCL_HIGH SETB JNB SCL,$ SCL ;

EQU

0EH ***MACRO'S*** MACRO HIGH SCL ENDM

; LOOP UNTIL

SET STRONG

SCL 1

ON

CSEG

AT

0 JNB AJMP

RESET

VECTOR ENTER,INIT_YEAR START

INIT_YEAR: MOV YEAR,#97H; ACALL JNB INITIALIZE SET_CLOCK; YEAR IF ELSE NEW 1307 GO ENTER,INIT_YEAR TO 1997 ON.

; ; ; START:

RESET

GOES

HERE

********************************************************** TO START PROGRAM **********************************************************

MOV YEAR,#97H ; ACALL OFF MOV SP,#2FH ; MOV IE,#0 SETB SDA SCL_HIGH CLR ACK

SET ;

YEAR TO 1997 ON ALARM OFF ON POSITION STACK ABOVE ; DISABLE ; ENSURE SDA ENSURE SCL ; CLEAR STATUS

CLR CLR ; ; ; OSC_CONTROL: ACALL MOV ACALL MOV ACALL SETB ACALL ACALL MOV

BOOT BOOT BUFFER INTERUPTS HIGH HIGH FLAGS BUS_FLT _2W_BUSY

SUB

SETS

********************************************************** THE DS1307 OSCILLATOR **********************************************************

OSC_SET:

SEND_START ; GENERATE START CONDITION A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT SEND_BYTE ; SEND BYTE TO 1307 A,#00H ; ADDRESS BYTE TO REGISTER 00H SEND_BYTE ; SECONDS REGISTER, ALWAYS LEAVE LASTREAD ; REG 00H-BIT #7 = 0 (LOW) SEND_STOP ; IF REG 00H-BIT #7 = 1 CLOCK SEND_START ; OSCILLATOR IS OFF. A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT ACALL SEND_BYTE ; ACALL READ_BYTE ; READ A BYTE FROM THE 1307 CLR ACC.7 ; CLEAR REG 00H-BIT #7 TO ENABLE ; OSCILLATOR. PUSH ACC ; SAVE ON STACK ACALL SEND_STOP ; ACALL SEND_START ; MOV A,#DS1307W ; SETUP TO WRITE ACALL SEND_BYTE ; MOV A,#00H ; REGISTER 00H ADDRESS ACALL SEND_BYTE ; POP ACC ; GET DATA TO START OSCILLATOR ACALL SEND_BYTE ; SEND IT ACALL SEND_STOP ACALL BEGIN

; ; ;

TIME

AND

DATE

ROUTINE,

********************************************************** GET & DISPLAY MONTH/DATE/YEAR **********************************************************

GET_TIME: ACALL JNB JNB READ_CLOCK ; GET TIME,DATE,ALARM DATA ENTER,SET_TIME ; GOTO SET TIME IF PUSHED ALARM_SET,SET_ALARMS ; GOTO SET ALARMS ELSE SHOW TIME MOV A,#1 ; LINE #1 MOV B,#1 ; COLUMN #1 ACALL PLACECUR4 ; PLACE CURSOR FOR DAY MOV A,DAY ; GET DAY ACALL GET_DAY ; SHOW DAY OF WEEK MOV A,#1 MOV B,#7 ACALL PLACECUR4 ; PLACE CURSOR FOR MONTH MOV A,MONTH ; LOAD MONTH DATA ACALL WRITE_BCD MOV A,#1 MOV B,#10 ; PLACE CURSOR FOR DATE ACALL PLACECUR4 MOV A,DATE ACALL WRITE_BCD MOV A,#1 MOV B,#13 ACALL PLACECUR4 MOV A,YEAR ACALL WRITE_BCD ********************************************************** & DISPLAY TIME ********************************************************** A,#2 B,#4 PLACECUR4 A,HRS WRITE_BCD A,#2 B,#7 PLACECUR4 A,MINS WRITE_BCD A,#2 B,#10 PLACECUR4 A,SECS WRITE_BCD CHECK_ALARM_TIME GET_TIME

; ; ;

NOW

GET

MOV MOV ACALL MOV ACALL MOV MOV ACALL MOV ACALL MOV MOV ACALL MOV ACALL ACALL SJMP SET_ALARMS: JNB ACALL AJMP SET_TIME: JNB ENTER,SET_TIME; HOLDS ACALL HERE UNTIL BUTTON

ALARM_SET,SET_ALARMS MDELAY ALARMS

IS

RELEASED MDELAY

SET_DAY:

DB WAIT_DAY: ;

'*',0

MOV MOV ACALL ACALL ; WAIT JNB JNB JNB ACALL SJMP HERE

PRINT FOR

'*'

BY BUTTON

A,#1 B,#0 PLACECUR4 PRTLCD4 DAY

PRESS UP_BTTN,UP_DAY DOWN_BTTN,DOWN_DAY ENTER,ENTER_DAY UPDATE WAIT_DAY TO SUN A,#1 DAY,A WAIT_DAY SAT A,#7H DAY,A WAIT_DAY REGISTER DAY,A WAIT_DAY BY 1 UP_BTTN,UP_DAY MDELAY R1,#DAY A,@R1 A A,#8H,OK_DAY REDO_DAY

REDO_DAY:

RESETS MOV MOV AJMP ; RESETS MOV MOV AJMP NEW MOV AJMP DAY DAY

DAY

REDO_DAY_DOWN:

DAY

TO

OK_DAY:

PLACES

DATA

INTO

UP_DAY:

CHANGES JNB ACALL MOV MOV INC CJNE AJMP ; CHANGES JNB ACALL MOV MOV DEC CJNE AJMP

DATA

UP

DOWN_DAY:

MONTH

DATA

DOWN BY 1 DOWN_BTTN,DOWN_DAY MDELAY R1,#DAY A,@R1 A A,#0,OK_DAY REDO_DAY_DOWN ON TO MONTH ENTER,ENTER_DAY MDELAY

ENTER_DAY:

DONE JNB

WITH ACALL

DAY

GO

SET_MONTH: MOV MOV ACALL ACALL DB ' ',0 MOV MOV ACALL ACALL DB WAIT_MONTH: ; WAIT HERE FOR BUTTON ; PRINT '*' FOR A,#1 B,#0 PLACECUR4 PRTLCD4 MONTH A,#1 B,#6 PLACECUR4 PRTLCD4 '*',0 PRESS

JNB JNB JNB ACALL SJMP REDO_MONTH: ; RESETS MOV MOV AJMP ; MOV MOV AJMP OK_MONTH: ; PLACES NEW MOV AJMP MONTH DATA RESETS MONTH

UP_BTTN,UP_MONTH DOWN_BTTN,DOWN_MONTH ENTER,ENTER_MONTH UPDATE WAIT_MONTH TO 1 A,#1 MONTH,A WAIT_MONTH 12 A,#12H MONTH,A WAIT_MONTH REGISTER MONTH,A WAIT_MONTH

REDO_MONTH_DOWN:

MONTH

TO

INTO

UP_MONTH:

CHANGES JNB ACALL MOV MOV MOV ACALL CJNE AJMP ; CHANGES JNB ACALL MOV MOV MOV ACALL DEC CJNE AJMP DONE JNB WITH ACALL

MONTH

DATA

UP

BY 1 UP_BTTN,UP_MONTH MDELAY R1,#MONTH A,@R1 R4,A CHECK_BCD A,#13H,OK_MONTH REDO_MONTH

DOWN_MONTH:

MONTH

DATA

DOWN BY 1 DOWN_BTTN,DOWN_MONTH MDELAY R1,#MONTH A,@R1 R4,A CHECK_BCD_DOWN A A,#0,OK_MONTH REDO_MONTH_DOWN ON TO DATE ENTER,ENTER_MONTH MDELAY

ENTER_MONTH:

MONTH

GO

SET_DATE: MOV MOV ACALL ACALL DB ' ',0 MOV MOV ACALL ACALL ; WAIT JNB JNB JNB ACALL HERE ; ERASE '*' BY A,#1 B,#6 PLACECUR4 PRTLCD4 MONTH A,#1 B,#9 PLACECUR4 PRTLCD4 DATE

DB WAIT_DATE: ;

'*',0

PRINT UNTIL

'*'

BY

BUTTON PRESS UP_BTTN,UP_DATE DOWN_BTTN,DOWN_DATE ENTER,ENTER_DATE UPDATE

SJMP REDO_DATE: ; RESETS MOV MOV AJMP ; MOV MOV AJMP OK_DATE: ; PLACES NEW MOV AJMP DATE DATE DATA INTO RESETS DATE TO

WAIT_DATE 1 A,#1 DATE,A WAIT_DATE 31 A,#31H DATE,A WAIT_DATE REGISTER DATE,A WAIT_DATE

REDO_DATE_DOWN:

DATE

TO

UP_DATE:

CHANGES JNB ACALL MOV MOV MOV ACALL CJNE AJMP ; CHANGES JNB ACALL MOV MOV MOV ACALL DEC CJNE AJMP DONE JNB ACALL WITH

DATA

UP

BY 1 UP_BTTN,UP_DATE MDELAY R1,#DATE A,@R1 R4,A CHECK_BCD A,#32H,OK_DATE REDO_DATE

DOWN_DATE:

DATE

DATA

DOWN BY 1 DOWN_BTTN,DOWN_DATE MDELAY R1,#DATE A,@R1 R4,A CHECK_BCD_DOWN A A,#0,OK_DATE REDO_DATE_DOWN ON TO YEAR ENTER,ENTER_DATE MDELAY

ENTER_DATE:

DATE

GO

SET_YEAR: MOV MOV ACALL ACALL ; MOV MOV ACALL ACALL ; WAIT JNB JNB JNB ACALL SJMP REDO_YEAR: ; RESETS MOV YEAR A,#1 B,#9 PLACECUR4 PRTLCD4 DATE A,#1 B,#12 PLACECUR4 PRTLCD4 YEAR

DB

'-',0

PRINT

'-'

BESIDE

DB WAIT_YEAR:

'*',0 ;

PRINT HERE

'*' FOR

BESIDE

BUTTON PRESS UP_BTTN,UP_YEAR DOWN_BTTN,DOWN_YEAR ENTER,ENTER_YEAR UPDATE WAIT_YEAR TO 1 A,#97H

MOV SJMP REDO_YEAR_DOWN: ; RESETS MOV MOV AJMP NEW MOV AJMP YEAR YEAR YEAR TO

YEAR,A WAIT_YEAR 99 A,#99H YEAR,A WAIT_YEAR REGISTER YEAR,A WAIT_YEAR BY 1 UP_BTTN,UP_YEAR MDELAY R1,#YEAR A,@R1 A A,#9AH,OK_YEAR REDO_YEAR

OK_YEAR:

PLACES

DATA

INTO

UP_YEAR:

CHANGES JNB ACALL MOV MOV INC CJNE AJMP

DATA

UP

DOWN_YEAR:

CHANGES JNB ACALL MOV MOV DEC CJNE AJMP

YEAR

DATA

DOWN BY 1 DOWN_BTTN,DOWN_YEAR MDELAY R1,#YEAR A,@R1 A A,#96H,OK_YEAR REDO_YEAR_DOWN ON TO HOUR ENTER,ENTER_YEAR MDELAY

ENTER_YEAR:

DONE JNB

WITH ACALL

YEAR

GO

SET_HOUR: MOV MOV ACALL ACALL ; MOV MOV ACALL ACALL ; AJMP WAIT JNB JNB JNB ACALL SJMP REDO_HOUR: ; RESET MOV MOV AJMP ; MOV MOV RESET HOUR A,#1 B,#12 PLACECUR4 PRTLCD4 YEAR A,#2 B,#3 PLACECUR4 PRTLCD4 HOUR WAIT_HOUR

DB

'-',0

PRINT

'-'

BESIDE

DB

'*',0

PRINT

'*'

BESIDE

WAIT_HOUR:

HERE

UNTIL

BUTTON PRESS UP_BTTN,UP_HOUR DOWN_BTTN,DOWN_HOUR ENTER,ENTER_HOUR UPDATE WAIT_HOUR TO 00 A,#0 HRS,A WAIT_HOUR 23 A,#23H HRS,A

REDO_HOUR_DOWN:

HOUR

TO

AJMP OK_HOUR: ; PLACE NEW MOV AJMP HOUR DATA INTO

WAIT_HOUR REGISTER HRS,A WAIT_HOUR

UP_HOUR:

CHANGES JNB ACALL MOV MOV MOV ACALL CJNE AJMP ;

HOUR

DATA

UP

BY 1 UP_BTTN,UP_HOUR MDELAY R1,#HRS A,@R1 R4,A CHECK_BCD A,#24H,OK_HOUR REDO_HOUR

DOWN_HOUR:

CHANGES HOUR JNB ACALL MOV MOV MOV ACALL DEC CJNE AJMP DONE JNB ACALL WITH HOUR

DATA

DOWN BY ONE DOWN_BTTN,DOWN_HOUR MDELAY R1,#HRS A,@R1 R4,A CHECK_BCD_DOWN A A,#0F9H,OK_HOUR REDO_HOUR_DOWN ON TO MINUTES ENTER,ENTER_HOUR MDELAY

ENTER_HOUR:

GO

SET_MIN: MOV MOV ACALL ACALL ; MOV MOV ACALL ACALL ; WAIT JNB JNB JNB ACALL SJMP REDO_MIN: ; RESET MOV MOV AJMP ; RESETS MOV MOV AJMP NEW MOV MINUTE MINUTES A,#2 B,#3 PLACECUR4 PRTLCD4 HOUR A,#2 B,#6 PLACECUR4 PRTLCD4 MINUTES

DB

'

',0

ERASE

'*'

BESIDE

DB WAIT_MIN:

'*',0 ;

PRINT HERE

'*' UNTIL

BESIDE BUTTON

PRESS UP_BTTN,UP_MIN DOWN_BTTN,DOWN_MIN ENTER,ENTER_MIN UPDATE WAIT_MIN TO 00 A,#0 MINS,A WAIT_MIN 59 A,#59H MINS,A WAIT_MIN REGISTER MINS,A

REDO_MIN_DOWN:

MINUTES

TO

OK_MIN:

PLACE

DATA

INTO

AJMP UP_MIN: ; CHANGES JNB ACALL MOV MOV MOV ACALL CJNE AJMP DOWN_MIN: ; CHANGES JNB ACALL MOV MOV MOV ACALL DEC CJNE AJMP ENTER_MIN: ; DONE WITH JNB ACALL MINUTES GO MINUTES DATA MINUTES DATA UP

WAIT_MIN BY 1 UP_BTTN,UP_MIN MDELAY R1,#MINS A,@R1 R4,A CHECK_BCD A,#60H,OK_MIN REDO_MIN

DOWN BY 1 DOWN_BTTN,DOWN_MIN MDELAY R1,#MINS A,@R1 R4,A CHECK_BCD_DOWN A A,#0F9H,OK_MIN REDO_MIN_DOWN ON TO SECONDS ENTER,ENTER_MIN MDELAY

SET_SECONDS: MOV MOV ACALL ACALL ; ACALL ; MOV ACALL ; A,#2 B,#6 PLACECUR4 PRTLCD4 MINUTES MDELAY TO 00 SECS,A SET_CLOCK LOOP

DB MOV

':',0 A,#00000000B

PRINT SECONDS

':' ARE

BESIDE SET

AJMP ALARMS:

GET_TIME

RETURN

TO

MAIN

DB ACALL ACALL AJMP UPDATE: MOV MOV ACALL MOV ACALL PLACECUR4 A,DAY GET_DAY ; BEGIN3 ALM_A ; UPDATE3 ; GO ;

ACALL ACALL MOV MOV ACALL ACALL '-SET PRINT

RESETLCD4 INITLCD4 A,#1 B,#0 PLACECUR4 PRTLCD4 ALARM TIME-',0 HOUR & MINUTE SEPERATORS ; DISPLAY ALARM TIME TO SET HOURS & MINUTES ROUTINE FOR ALARM TIME. ; ; LINE COLUMN CURSOR FOR GET DAY TO ASCII FOR #1 #1 DAY DATA LCD A,#1 B,#7 MONTH MONTH WRITE_BCD

A,#1 B,#1 ; ; PLACE

ACALL MOV

PLACECUR4 A,MONTH

CONVERT BCD MOV MOV ; PLACE CURSOR ; LOAD ACALL

FOR DATE

MOV MOV

B,#10 A,DATE

MOV ; ACALL ; ACALL MOV MOV ACALL MOV ACALL

PLACE

CURSOR LOAD

FOR DATE

A,#1 DATE PLACECUR4 DATA WRITE_BCD A,#1 B,#13 PLACECUR4 A,YEAR WRITE_BCD

; ; ; UPDATE2:

NOW

GET

********************************************************** & DISPLAY TIME **********************************************************

ACALL

MOV MOV ACALL MOV ACALL MOV MOV ACALL MOV ACALL MOV MOV ACALL MOV ACALL MOV WRLCDCOM4 ACALL

TURN

OFF

A,#2 B,#4 PLACECUR4 A,HRS WRITE_BCD A,#2 B,#7 PLACECUR4 A,MINS WRITE_BCD A,#2 B,#10 PLACECUR4 A,SECS WRITE_BCD R4,#OFFCUR CURSOR BIG_DELAY RET A,#2 B,#6 PLACECUR4 A,ALM_HOUR WRITE_BCD A,#2 B,#9 PLACECUR4 A,ALM_MIN WRITE_BCD R4,#OFFCUR WRLCDCOM4 BIG_DELAY RET

UPDATE3: MOV MOV ACALL MOV ACALL MOV MOV ACALL MOV ACALL MOV ACALL ACALL

CHECK_ALARM_TIME: MOV CJNE MOV CJNE LOAD VALUE ACALL A,MINS A,ALM_MIN,OFF A,HRS A,ALM_HOUR,OFF OUT & ALARM ALARM_CONTROL RET ALM_CNTRL,#00H & SQW OUT.

MOV

ALM_CNTRL,#10H

TO

TURN

ON

SQW

OFF: ACALL ALARM_CONTROL ;

MOV LOAD

VALUE

TO

TURN

OFF

ALARM

RET ALM_A: MOV MOV ACALL ACALL ; WAIT JNB JNB JNB ACALL SJMP REDO_HOUR1: ; RESET MOV MOV AJMP ; MOV MOV AJMP OK_HOUR1: ; PLACE MOV AJMP UP_HOUR1: ; CHANGES JNB ACALL MOV MOV MOV ACALL CJNE AJMP ; HOUR DATA UP NEW HOUR DATA INTO RESET HOUR A,#2 B,#5 PLACECUR4 PRTLCD4 HOUR

DB WAIT_HOUR1:

'*',0 ;

PRINT HERE

'*' UNTIL

BESIDE

BUTTON PRESS UP_BTTN,UP_HOUR1 DOWN_BTTN,DOWN_HOUR1 ENTER,ENTER_HOUR1 UPDATE3 WAIT_HOUR1 TO 00 A,#0 ALM_HOUR,A WAIT_HOUR1 23 A,#23H ALM_HOUR,A WAIT_HOUR1 REGISTER ALM_HOUR,A WAIT_HOUR1

REDO_HOUR_DOWN1:

HOUR

TO

BY 1 UP_BTTN,UP_HOUR1 MDELAY R1,#ALM_HOUR A,@R1 R4,A CHECK_BCD A,#24H,OK_HOUR1 REDO_HOUR1

DOWN_HOUR1:

CHANGES HOUR JNB ACALL MOV MOV MOV ACALL DEC CJNE AJMP DONE JNB WITH ACALL HOUR

DATA

DOWN BY ONE DOWN_BTTN,DOWN_HOUR1 MDELAY R1,#ALM_HOUR A,@R1 R4,A CHECK_BCD_DOWN A A,#0F9H,OK_HOUR1 REDO_HOUR_DOWN1 ON TO MINUTES ENTER,ENTER_HOUR1 MDELAY

ENTER_HOUR1:

GO

SET_MIN1: MOV MOV ACALL ACALL ; MOV MOV A,#2 B,#5 PLACECUR4 PRTLCD4 HOUR A,#2 B,#8

DB

'

',0

ERASE

'*'

BESIDE

DB WAIT_MIN1:

'*',0 ;

ACALL ACALL ; WAIT JNB JNB JNB ACALL SJMP

PRINT HERE

'*' UNTIL

BESIDE

PLACECUR4 PRTLCD4 MINUTES

BUTTON PRESS UP_BTTN,UP_MIN1 DOWN_BTTN,DOWN_MIN1 ENTER,ENTER_MIN1 UPDATE3 WAIT_MIN1 TO 00 A,#0 ALM_MIN,A WAIT_MIN1 59 A,#59H ALM_MIN,A WAIT_MIN1 REGISTER ALM_MIN,A WAIT_MIN1 BY 1 UP_BTTN,UP_MIN1 MDELAY R1,#ALM_MIN A,@R1 R4,A CHECK_BCD A,#60H,OK_MIN1 REDO_MIN1

REDO_MIN1:

RESET MOV MOV AJMP ; RESETS MOV MOV AJMP NEW MOV AJMP MINUTE

MINUTES

REDO_MIN_DOWN1:

MINUTES

TO

OK_MIN1:

PLACE

DATA

INTO

UP_MIN1:

CHANGES JNB ACALL MOV MOV MOV ACALL CJNE AJMP

MINUTES

DATA

UP

DOWN_MIN1:

CHANGES JNB ACALL MOV MOV MOV ACALL DEC CJNE AJMP

MINUTES

DATA

DOWN BY 1 DOWN_BTTN,DOWN_MIN1 MDELAY R1,#ALM_MIN A,@R1 R4,A CHECK_BCD_DOWN A A,#0F9H,OK_MIN1 REDO_MIN_DOWN1 ON TO SECONDS ENTER,ENTER_MIN1 MDELAY

ENTER_MIN1:

DONE JNB

WITH ACALL

MINUTES

GO

SET_SECONDS1: MOV MOV ACALL ACALL ; ACALL A,#2 B,#8 PLACECUR4 PRTLCD4 MINUTES MDELAY

DB

':',0

PRINT

':'

BESIDE

STORE_ALARMS: ACALL MOV

SEND_START A,#DS1307W

; ; ACALL

SEND SEND

2-WIRE 1307

START WRITE

CONDITION COMMAND SEND_BYTE

MOV

MOV SEND_LOOP2: MOV

A,#ALM_STORE; 08H ACALL R1,#ALM_HOUR; ; ; A,@R1

POINT ON START IN WITH

TO THE HOURS INTERNAL

REGISTER DS1307 SEND_BYTE REGISTER RAM

; LOAD HOURS DATA FOR ALARM SEND_BYTE ; SET HOURS MOV R1,#ALM_MIN MOV A,@R1 ; LOAD MINUTES DATA FOR ALARM ACALL SEND_BYTE ; SET MINUTES ACALL SEND_STOP ; SEND 2-WIRE STOP CONDITION ACALL BEGIN ; SETUP DISPLAY AGAIN BEFORE RETURNING. AJMP GET_TIME ; GO BACK TO SHOWING TIME AFTER ; SETTING ALARM ACALL ********************************************************** CONVERSION ROUTINE RAM WHEN ROUTINE IS CALLED. **********************************************************

; ; ; ;

ACC

CONTAINS

BCD TIME

DATA

FROM

WRITE_BCD: PUSH ACC ; SWAP ANL LOOK ; ANL ACALL DECODE HIGH DIGIT A A,#0FH IT. DIGIT A,#0FH FIND RET

ACALL POP

FIND ACC

IT

UP & DECODE

THEN LOW

PRINT

; ; ; ;

THE

SUB DS1307

SQW

CONTROLS OUTPUT

********************************************************** THE ALARM OUTPUT DRIVES THE ALARM BUZZER @ 1Hz **********************************************************

ALARM_CONTROL: ACALL MOV ACALL MOV ACALL MOV ; 10H = 00H = ALARM ACALL SEND_START A,#DS1307W SEND_BYTE A,#07H SEND_BYTE R1,#ALM_CNTRL AT 1HZ OUT = GND SEND_STOP RET

MOV ACALL

A,@R1 SEND_BYTE

OFF

ALARM &

ON SQW

; ; ; BEGIN:

SET

UP

DISPLAY

ON

BOOT,

********************************************************** AND REDO DISPLAY AFTER CHANGE **********************************************************

DB

ACALL ACALL MOV MOV ACALL ACALL ' MOV MOV

RESETLCD4 INITLCD4 A,#1 B,#7 PLACECUR4 PRTLCD4 ',0 A,#2 B,#0

DB MOV

ACALL ACALL '* R4,#OFFCUR ACALL

: ; TURN

: OFF

PLACECUR4 PRTLCD4 *',0 CURSOR WRLCDCOM4 RET

BEGIN3: MOV MOV ACALL ACALL DB MOV R4,#OFFCUR ACALL '* ; TURN : OFF A,#2 B,#0 PLACECUR4 PRTLCD4 *',0 CURSOR WRLCDCOM4 RET

; ; ; FIND:

LOOKUP

TABLE

********************************************************** USED BY WRITE_BCD. **********************************************************

SJMP ST:

LOOK_UP RET

LOOK_UP: CJNE LCALL DB LJMP m1: CJNE LCALL DB LJMP m2: CJNE LCALL DB LJMP m3: CJNE LCALL DB LJMP m4: CJNE LCALL DB LJMP m5: CJNE LCALL DB LJMP m6: CJNE LCALL DB LJMP m7: CJNE A,#00000111B,m8 A,#00000110B,m7 PRTLCD4 '6',0 ST A,#00000101B,m6 PRTLCD4 '5',0 ST A,#00000100B,m5 PRTLCD4 '4',0 ST A,#00000011B,m4 PRTLCD4 '3',0 ST A,#00000010B,m3 PRTLCD4 '2',0 ST A,#00000001B,m2 PRTLCD4 '1',0 ST A,#0000000B,m1 PRTLCD4 '0',0 ST

LCALL DB LJMP m8: CJNE LCALL DB LJMP m9: CJNE LCALL DB LJMP m10: LJMP ; ; ; GET_DAY: CJNE LCALL DB MON: CJNE LCALL DB TUE: CJNE LCALL DB WED: CJNE LCALL DB THU: CJNE LCALL DB FRI: CJNE LCALL DB SAT: CJNE LCALL DB WHAT:

PRTLCD4 '7',0 ST A,#00001000B,m9 PRTLCD4 '8',0 ST A,#00001001B,m10 PRTLCD4 '9',0 ST ST ********************************************************** FOR DAY **********************************************************

LOOKUP

TABLE

A,#00000001B,MON PRTLCD4 'SUN',0 RET A,#00000010B,TUE PRTLCD4 'MON',0 RET A,#00000011B,WED PRTLCD4 'TUE',0 RET A,#00000100B,THU PRTLCD4 'WED',0 RET A,#00000101B,FRI PRTLCD4 'THU',0 RET A,#00000110B,SAT PRTLCD4 'FRI',0 RET A,#00000111B,WHAT PRTLCD4 'SAT',0 RET RET

; ; ;

SUB

SETS

********************************************************** THE CLOCK **********************************************************

SET_CLOCK: ACALL MOV MOV SEND_START A,#DS1307W A,#00H ; R1,#24H ; A,@R1 ; SEND_BYTE R1 SEND_STOP ; SEND 2-WIRE START ; SEND 1307 WRITE ACALL SET DATA POINTER TO 00H ON THE ACALL ; START WITH SECONDS IN INTERNAL MOVE ; ; CJNE ; FIRST SEND LOOP SEND BYTE DATA UNTIL OF ON CLOCK DATA ; CONDITION COMMAND SEND_BYTE REGISTER DS1307 SEND_BYTE REGISTER RAM

MOV SEND_LOOP: MOV ACALL INC ACALL

2-WIRE

TO ACC 2-WIRE BUT DATA SENT R1,#2BH,SEND_LOOP STOP CONDITION RET

; ; ; INITLCD4:

INITIALIZE

THE

********************************************************** LCD 4-BIT MODE **********************************************************

CLR CLR CLR MOV

LCD_RS LCD_RW R4,

; ;

LCD READ ; FUNCTION

REGISTER / SET LINES, ;

MOV MOV ACALL MOV

LCD_E #CONFIG; ; ACALL R4, #ONDSP ACALL R4, #ENTRYMODE WRLCDCOM4 ; INCREMENT R4, #CLRDSP; CLEAR ACALL

SET CURSOR DISPLAY,

LINE LINE LINE BITS, FONTS WRLCDCOM4 DISPLAY ON WRLCDCOM4 ENTRY MODE RIGHT, NO SHIFT HOME CURSOR WRLCDCOM4 RET

SELECT WRITE ENABLE DATA

; ; ;

SOFTWARE

VERSION

OF

********************************************************** THE POWER ON RESET **********************************************************

RESETLCD4: CLR CLR CLR CLR CLR LCD_DB7 LCD_DB6 SETB SETB SETB CLR MOV SETB CLR MOV SETB CLR MOV CLR LCD_E LCD_E A, LCD_E LCD_E A, LCD_E LCD_E A, LCD_DB4 #1 ACALL ; SPECIFY #1 ACALL ; ; ; START END DELAY #4 ACALL ; ; ; START END DELAY ; ; ; START END DELAY LCD_RS LCD_RW LCD_E ; ; ; LCD READ ; SET ; REGISTER / BIT ... SELECT LINE WRITE LINE ENABLE LINE PATTERN FOR... POWER-ON-RESET LCD_DB5 LCD_DB4 ENABLE PULSE ENABLE PULSE 4 MILLISECONDS MDELAY ENABLE PULSE ENABLE PULSE 1 MILLISECOND MDELAY ENABLE PULSE ENABLE PULSE 1 MILLISECOND MDELAY 4-BIT OPERATION

SETB CLR MOV MOV MOV MOV MOV R4,

LCD_E LCD_E A, #1 ACALL R4, ACALL R4, #1 R4,

; ; ;

START END DELAY

ENABLE ENABLE 1 FUNCTION

#CONFIG; ; DISPLAY, SET

#08H ACALL ; CLEAR ACALL #ENTRYMODE ; ACALL AJMP

DISPLAY HOME ENTRY

PULSE PULSE MILLISECOND MDELAY SET WRLCDCOM4 OFF WRLCDCOM4 CURSOR WRLCDCOM4 MODE WRLCDCOM4 INITLCD4

; ; ; ;

SUB COMMAND

WRITES MUST

A BE

********************************************************** COMMAND WORD TO THE LCD PLACED IN R4 BY CALLING PROGRAM **********************************************************

WRLCDCOM4: CLR CLR PUSH MOV MOV MOV MOV CLR LCD_E LCD_RS ; SELECT SEND COMMAND LCD_RW ; SELECT WRITE OPERATION ACC ; SAVE ACCUMULATOR A, R4 ; PUT DATA BYTE IN ACC C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS LCD_DB4, C ; ONE BIT AT A TIME USING... C, ACC.5 ; BIT MOVE OPERATOINS MOV LCD_DB5, C MOV C, ACC.6 MOV LCD_DB6, C MOV C, ACC.7 MOV LCD_DB7, C LCD_E ; PULSE THE ENABLE LINE CLR LCD_E C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE MOV LCD_DB4, C MOV C, ACC.1 MOV LCD_DB5, C MOV C, ACC.2 MOV LCD_DB6, C MOV C, ACC.3 MOV LCD_DB7, C PULSEEWAIT4; PULSE THE ENABLE LINE... ; AND WAIT FOR BUSY FLAG TO CLEAR POP ACC RET ********************************************************** DATA WORD TO THE LCD IN R4 BY CALLING PROGRAM **********************************************************

SETB MOV

ACALL

; ; ; ;

SUB DATA

TO MUST

WRITE BE

A PLACED

WRLCDDATA: CLR SETB CLR PUSH MOV MOV MOV MOV LCD_RS LCD_RW ACC A, R4 C, ACC.4 ; LCD_DB4, C ; C, ACC.5 ; ; ; SELECT SELECT SEND WRITE LCD_E DATA OPERATION ACCUMULATOR IN ACC DATA BUS TIME USING... OPERATOINS

; SAVE PUT DATA BYTE LOAD HIGH NIBBLE ON ONE BIT AT A ; BIT MOVE

SETB MOV C,

MOV MOV MOV MOV MOV LCD_E ACC.0 MOV MOV MOV MOV MOV MOV MOV PULSEEWAIT4; AND WAIT

; CLR ;

PULSE SIMILARLY,

LCD_DB5, C, LCD_DB6, C, LCD_DB7, THE

ENABLE

ACALL ;

PULSE FOR POP

LOAD LOW LCD_DB4, C, LCD_DB5, C, LCD_DB6, C, LCD_DB7, THE ENABLE BUSY FLAG TO

C ACC.6 C ACC.7 C LINE LCD_E NIBBLE C ACC.1 C ACC.2 C ACC.3 C LINE... CLEAR ACC RET

; ; ; ;

GENERATES A WAITS FOR

POSITIVE THE BUSY

PULSE FLAG

********************************************************** ON THE LCD ENABLE LINE. TO CLEAR BEFORE RETURNING. **********************************************************

PULSEEWAIT4: SETB MOV SETB PUSH PEW: SETB MOV CLR SETB JB POP LCD_E A, LCD_E LCD_E ; ACC.7, PEW ACC ; START THE ENABLE PULSE LCD_DATA; READ STATUS NIBBLE ; END ENABLE PULSE PRETEND READING STATUS LOW NIBBLE CLR LCD_E ; LOOP WHILE BUSY FLAG IS SET ; RESTORE ACCUMULATOR RET ********************************************************** IMMEDIATELY FOLLOWING THE CALL AND STRING MUST BE TERMINATED WITH A NULL (0). ********************************************************** LCD_E LCD_DATA, LCD_RW ACC CLR ; PULSE THE ENABLE CLR #0FFH ; PREPARE PORT FOR ; PREPARE R/W FOR READ ; SAVE ACCUMULATOR LCD_E LINE LCD_E INPUT OPERATION CONTENTS

; ; ; ; ;

SUB TAKES DISPLAYS ON

THE THE

STRING LCD.

PRTLCD4: POP PRTNEXT: CLR MOVC CJNE CHROK: MOV ACALL INC AJMP RETPRTLCD: DPTR PRTNEXT WRLCDDATA ; ; ; POINT LOOP AT TILL R4, SEND NEXT END A CHARACTER CHARACTER STRING A, A, A ; @A+DPTR ; #0, CHROK; SJMP SET GET IF CHR CHR OFFSET FROM = 0 = CODE THEN 0 MEMORY RETURN RETPRTLCD DPH ; POP POP RETURN ADDRESS INTO DPTR DPL

OF

MOV JMP ; ; ; PLACECUR4: DEC JNZ ADD LINE2: ADD SETCUR: MOV ACALL A, A,

A, #1H @A+DPTR

; ;

POINT RETURN

TO WITH

INSTRUCTION AFTER STRING A JUMP INSTRUCTION

SUB

SETS

********************************************************** THE CURSOR POSITION. **********************************************************

ACC LINE2 MOV #080H ; ; IF

ACC=0 ACC=0 A, CONTROL

FOR THEN WORD FIRST FOR

CONSTRUCT SJMP

LINE=1 LINE B LINE 1 SETCUR B 2

MOV #0C0H R4,

A, ; CONSTRUCT ; ; CONTROL PLACE WORD FOR LINE

A WRLCDCOM4

CONTROL ISSUE

WORD COMMAND RET

SETCGRAM: PUSH MOV MUL POP ADD ADD MOV ACALL AB B A,B A,#40h R4,A WRLCDCOM4 ; ; ; ; ; ; a multiply b B, character holds holds convert number row CGRAM to place issue B #8 by 8 number address instruction instruction command RET

; ; ; MDELAY:

MILLISECOND

********************************************************** DELAY ROUTINE **********************************************************

PUSH MOV MD_OLP: INC

ACC A,#0A6H A NOP NOP NOP NOP NOP NOP NOP NOP MD_OLP NOP ACC RET

JNZ POP

BIG_DELAY: MOV X0B: X1B: X2B: R3,#1 MOV MOV DJNZ DJNZ DJNZ ; DELAY ROUTINE. R2,#0FFH R5,#0FFH R5,X2B R2,X1B R3,X0B RET

; ; ;

THIS

SUB

READS

ONE

BYTE

********************************************************** OF DATA FROM THE DS1307 **********************************************************

READ_BYTE: MOV SETB READ_BITS: SCL_HIGH MOV RLC CLR C,SDA A SCL ; JB ; ; CLR ACKN: SCL_HIGH CLR ; SCL PULSE ; SCL OR TO NOT TRANSMIT ACKNOWLEDGE ACKNOWLEDGE BIT RET SDA ; IF CHECK TO THE NOT SEE LAST IF LAST READ ; ; ; ; DJNZ LOOP FOR TRANSITION SCL MOVE DATA BIT ROTATE CARRY-BIT TRANSITION SCL LOW-TO-HIGH CARRY ACC.0 HIGH-TO-LOW BITCNT,READ_BITS 8-BITS LASTREAD,ACKN THIS IS READ SEND ACK-BIT INTO INTO BITCNT,#08H; SDA ; SET MOV SET COUNTER SDA ; HIGH FOR TO 8-BITS ENSURE DATA A,#00H LINE FREE

; ; ; SEND_START: SETB CLR CLR

SUB

SENDS

********************************************************** START CONDITION **********************************************************

_2W_BUSY ACK BUS_FLT JNB JNB ;

INDICATE OPERATION IS ; CLEAR

THAT IN STATUS

SETB

SDA

; CLR ACALL CLR

BEGIN

START

2-WIRE PROGRESS FLAGS SCL,FAULT SDA,FAULT CODITION SCL_HIGH SDA DELAY SCL RET BUS_FLT RET

FAULT: SETB

; ; ; SEND_STOP:

SUB

SENDS

********************************************************** STOP CONDITION **********************************************************

CLR SETB CLR

SDA SCL_HIGH SDA _2W_BUSY RET ********************************************************** THE BUS **********************************************************

; ; ;

SUB

DELAYS

DELAY: NOP ; DELAY FOR BUS TIMING RET

; ; ; ; ;

THIS CALL ACC

SUB THIS MUST

SENDS 1 FOR CONTAIN

BYTE EACH DATA

********************************************************** OF DATA TO THE DS1307 REGISTER SECONDS TO YEAR TO BE SENT TO CLOCK **********************************************************

SEND_BYTE: MOV SB_LOOP: JNB SETB NOTONE: CLR ONE: SCL_HIGH RL A CLR SCL DJNZ SETB SDA SCL_HIGH JNB SETB SB_EX: ACALL CLR ACALL DELAY SCL DELAY ; ; ; DELAY FOR TRANSITION DELAY FOR AN SCL AN OPERATION HIGH-TO-LOW OPERATION RET SDA,SB_EX ACK TRANSITION SCL LOW-TO-HIGH ROTATE ACC LEFT 1-BIT ; TRANSITION SCL LOW-TO-HIGH BITCNT,SB_LOOP; LOOP FOR 8-BITS ; SET SDA HIGH TO LOOK FOR ; ACKNOWLEDGE PULSE CLR ACK ; CHECK FOR ACK OR NOT ACK ; SET ACKNOWLEDGE FLAG FOR ; NOT ACK ; ; SDA ; CLR SDA LOW ACC.7,NOTONE; SDA ; ACC CHECK IS JMP TO A 1, SEE AND IF SET BIT-7 SDA OF HIGH ONE BITCNT,#08H; SET COUNTER FOR 8-BITS

; ; ; ; ; ;

SUB READS ON RETURN DATE & ALARM

THE CLOCK AND FROM HERE DATE TIME REGISTERS SETTINGS IN

********************************************************** WRITES IT TO THE SCRATCHPAD MEMORY & TIME DATA WILL BE STORED IN THE FROM 24H (SECS) TO 2AH (YEAR) REGISTERS 2CH(HRS) AND 2DH(MINUTES). **********************************************************

READ_CLOCK: MOV R1,#24H ; MOV CLR ACALL MOV ACALL MOV ACALL ACALL ACALL MOV ACALL SECONDS STORAGE LOCATION BYTECNT,#00H LASTREAD SEND_START A,#DS1307W SEND_BYTE A,#00H SEND_BYTE SEND_STOP SEND_START A,#DS1307R SEND_BYTE

READ_LOOP: MOV CJNE SETB A,BYTECNT A,#09H,NOT_LAST LASTREAD

NOT_LAST: ACALL MOV MOV CJNE MOV ; MOV INC INC MOV CJNE ACALL READ_BYTE @R1,A A,BYTECNT A,#00H,NOT_FIRST A,@R1 BIT=0 (ENABLED) @R1,A R1 BYTECNT A,BYTECNT A,#0AH,READ_LOOP SEND_STOP RET ********************************************************** DONE IN THE ADJUST ROUTINE TO SEE IF THE NUMBER IS ENDS IN NINE. **********************************************************

CLR NOT_FIRST:

ACC.7

ENSURE

OSC

; ; ; ; ;

MOST THIS

OF THE ROUTINE ZERO

REAL SIMPLY

WORK CHECKS OR

IS

CHECK_BCD: MOV CLR ADD JC MOV ANL CLR ADD JC MOV INC RET ; ; ; ADJUST: MOV SWAP ANL INC SWAP RET ZERO: SAVES THE NUMBER TO ; CLEARS CARRY A,#67H ; CHECKS TO SEE IF EQUAL ZERO ; IF EQUAL THEN BECOMES A,R4 ; GETS ORIGINAL A,#0FH ; GETS RID OF UPPER 4 C ; CLEARS CARRY A,#0F7H ; CHECKS TO SEE IF NUMBER ENDS ADJUST ; IF LARGER ADJUST A,R4 ; GET ORIGINAL A ; ITS UNDER 9 AND NOT 0 SO ; BY 1 AND GO C A,R4 ; R4 BIT 99 0 NUMBER BITS BIT IN 9 IT NUMBER INCREASE BACK.

BCD

********************************************************** CONVERSION ROUTINE. ********************************************************** A,R4 ; GET ; CHANGE UPPER BITS ; GET RID OF WHAT A ; INCREASE ; SWITCH THE UPPER AND ; GO BACK WITH IF NUMBER MOV IS ZERO SEND ORIGINAL TO WAS NUMBER BITS BITS ONE BACK NUMBER

A A,#0FH A

LOWER LOWER BY LOWER BITS NEW BACK

A ZERO A,#00000000B RET

; ; ; ; ;

THIS ROUTINE EQUAL TO CAN

CHECKS TO SEE ZERO. IF THEY BE DONE.

********************************************************** IF THE LOWER 4 BITS ARE ARE THEN A STRAIGHT DECREASE IF NOT THEN CONVERT. **********************************************************

CHECK_BCD_DOWN: MOV ANL CJNE MOV

A,R4 ; A,#0FH ; GET A,#00000000B,GO_ON_BACK A,R4 ;

SAVE RID ;DO

ORIGINAL OF UPPER LOWER BITS GET ORIGINAL

FOUR =0

NUMBER BITS ? NUMBER

SUBB

A,#06H

CONVERT

IT

TO

BINARY

NUMBER RET

; ; ; ;

IF GO

THE

NUMBER BACK

ENDS AND,

IN

********************************************************** NUMBER LESS THAN 9 THEN DO A NORMAL DECREMENT. **********************************************************

GO_ON_BACK: MOV RET ; ; ; END A,R4 ; ; GET ORIGINAL GO NUMBER BACK

END

********************************************************** OF PROGRAM **********************************************************

You might also like