Professional Documents
Culture Documents
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)
(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.
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.
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.
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).
(4)
Tp lnh m ic hiu v chp hnh (Bng lit k cc cu lnh dng cho 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)
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.
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 (
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
;; 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
;; 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
; 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
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.
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
ALARM TIMEKEEPER
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 '
USED FOR USED FOR USED FOR USED FOR SELECT WRITE ENABLE
INSTRUCTIONS*** DATA,2 CURSOR CONTROL EQU EQU LINES,5X7 DON'T MATRIX SHIFT LCD DISPLAY
EQU EQU
28H 6 ***CURSOR
; ;
4-BIT INCREMENT
***DISPLAY EQU
CONTROL
INSTRUCTIONS*** 01H
EQU
; LOOP UNTIL
SET STRONG
SCL 1
ON
CSEG
AT
0 JNB AJMP
RESET
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
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
SUB
SETS
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_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
IS
RELEASED MDELAY
SET_DAY:
DB WAIT_DAY: ;
'*',0
MOV MOV ACALL ACALL ; WAIT JNB JNB JNB ACALL SJMP HERE
PRINT FOR
'*'
BY BUTTON
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
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
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
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
'-'
BESIDE
DB WAIT_YEAR:
'*',0 ;
PRINT HERE
'*' FOR
BESIDE
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:
DATA
UP
DOWN_YEAR:
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
'-'
BESIDE
DB
'*',0
'*'
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
UP_HOUR:
HOUR
DATA
UP
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
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 ;
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
ACALL MOV
PLACECUR4 A,MONTH
FOR DATE
MOV MOV
B,#10 A,DATE
PLACE
CURSOR LOAD
FOR DATE
A,#1 DATE PLACECUR4 DATA WRITE_BCD A,#1 B,#13 PLACECUR4 A,YEAR WRITE_BCD
; ; ; UPDATE2:
NOW
GET
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
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
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 ;
PRINT HERE
'*' UNTIL
BESIDE
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:
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
':'
BESIDE
SEND_START A,#DS1307W
; ; ACALL
SEND SEND
2-WIRE 1307
START WRITE
MOV
; 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
; ; ; ;
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,
DB
DB MOV
: ; TURN
: OFF
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
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
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
2-WIRE
; ; ; INITLCD4:
INITIALIZE
THE
; ;
LCD_E #CONFIG; ; ACALL R4, #ONDSP ACALL R4, #ENTRYMODE WRLCDCOM4 ; INCREMENT R4, #CLRDSP; CLEAR ACALL
LINE LINE LINE BITS, FONTS WRLCDCOM4 DISPLAY ON WRLCDCOM4 ENTRY MODE RIGHT, NO SHIFT HOME CURSOR WRLCDCOM4 RET
; ; ;
SOFTWARE
VERSION
OF
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
; ; ;
PULSE PULSE MILLISECOND MDELAY SET WRLCDCOM4 OFF WRLCDCOM4 CURSOR WRLCDCOM4 MODE WRLCDCOM4 INITLCD4
; ; ; ;
SUB COMMAND
WRITES MUST
A BE
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,
ENABLE
ACALL ;
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
; ; ; ;
PULSE FLAG
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
; ; ; ; ;
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
SUB
SETS
CONSTRUCT SJMP
A WRLCDCOM4
CONTROL ISSUE
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
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
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
SUB
SENDS
THAT IN STATUS
SETB
SDA
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
; ; ;
SUB
DELAYS
; ; ; ; ;
********************************************************** 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
; ; ; ; ; ;
********************************************************** 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
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
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
; ; ; ; ;
********************************************************** IF THE LOWER 4 BITS ARE ARE THEN A STRAIGHT DECREASE IF NOT THEN CONVERT. **********************************************************
FOUR =0
SUBB
A,#06H
CONVERT
IT
TO
BINARY
NUMBER RET
; ; ; ;
IF GO
THE
NUMBER BACK
ENDS AND,
IN
END