PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : فایل دستورهای ساعت دیجیتالی(همراه الارم با استفاده از ds1307 با استفاده از ال سی دی ۱۶*۲



BEN HOR
14th December 2010, 11:46 AM
اینم دستورهای ساعت دیجیتالی
بعد بگین امید بد...............
;************************************************* **********
;
; Digital Clock with alarm using DS1307
;
; For Keil/ A51 Macro Assembler
;
; Designed By: Ajay Bhargav
;
; E-mail: ajay_bhargav@hotmail.com
;
; WWW: www.rickeyworld.info
;
; PS: Use only A51 Macro assembler for linking this file
; else you can directly use the hex file provided.
;
; And if in anycase you want to edit the code then
; you have to use an alternative to write the macros
; defined in the file. In my opinion you dont need to
; edit it.
;
;************************************************* **********

hold macro ;delay macro for I2C
nop
nop
nop
endm

disp_str macro string ;Macro for sending string to LCD
irpc char, <string>
if nul 'char'
exitm
endif
mov a,#'char'
lcall data_in
endm
endm

build_char macro P1,P2,P3,P4,P5,P6,P7,P8 ;Macro for building a custom character
irp arg, <P1,P2,P3,P4,P5,P6,P7,P8>
mov a,#arg
acall data_in
endm
endm

sec equ 30h ;second register
min equ 31h ;minutes register
hour equ 32h ;hour register
days equ 33h ;days register
date equ 34h ;date register
month equ 35h ;month register
year equ 36h ;year register
alarm equ 37h ;alarm register
sig equ 38h ;signature for data checking in RTC RAM
ahour equ 39h ;alarm hour register
amin equ 3Ah ;alarm minute register
sda equ P1.1 ;Serial data pin
scl equ P1.0 ;Serial clock pin
rw equ p3.6 ;read write pin of LCD
en equ p3.5 ;enable pin of LCD
rs equ p3.7 ;register select pin of LCD
alarm_key equ p3.3 ;Alarm set key
time_key equ p3.2 ;Time ser key
increment equ p1.3 ;Increment value
decrement equ p1.2 ;Decrement Value
alarm_port equ p1.4 ;Alarm Buzzer port
alarm_flag equ 20h ;flag for alarm
time_flag equ 21h ;flag for time
ampm_flag equ 22h ;am/pm flag
alarm_on equ 23h ;Alarm on flag
alarm_off equ 24h ;alarm off flag
alarm_ring equ 25h ;alarm ring flag
alarm_hrs equ 58h ;Alarm hour register
alarm_min equ 59h ;Alarm Minutes register
alarm_chk_hour equ 5Ah ;Alarm hour check register
alarm_chk_min equ 5Bh ;Alarm min check register
ampm equ 61h ;AM/PM register
BELL equ 0h ;Bell icon
SPEAKER_OFF equ 1h ;speaker off icon
SPEAKER_ON equ 2h ;speaker on icon
CLOCK equ 3h ;clock icon
OK equ 4h ;ok icon
HEART equ 5h ;heart icon
MUSIC equ 6h ;music icon

org 0000h ;Starting of main program
ljmp start

org 03h ;interrupt for set time
setb time_flag
reti

org 13h ;Interrupt for set alarm
setb alarm_flag ;and switch off the alarm if on
jnb alarm_off,hmmm
setb alarm_port
mov a,#1h
lcall command
mov a,#81h
lcall command
mov a,#OK
acall data_in
mov r7,#35
disp_str < Alarm Off!>
setb tr0
loooop: jnb tf0,$
clr tf0
djnz r7,loooop
clr tr0
mov a,#1h
acall command
acall disp_const
setb alarm_off
setb alarm_on
clr alarm_flag
clr alarm_flag
clr alarm_on
setb alarm_port
clr alarm_off
clr alarm_flag
clr alarm_ring
hmmm: reti

start: mov tmod,#1h ;start routine
mov sp,#10h
acall initial
acall build
mov a,#80h
acall command
mov a,#CLOCK
acall data_in
disp_str < Digital Clock > ;Name display
mov r7,#70
setb tr0
wloop: jnb tf0,$
clr tf0
djnz r7,wloop
clr time_flag
clr alarm_flag
clr alarm_on
clr ampm_flag
setb alarm_port
mov ie,#85h
acall startc ;Reading signature byte if same then no need
mov a,#0d0h ;of initialization else initialize the RTC
acall send
mov a,#08h
acall send
acall startc
mov a,#0d1h
acall send
acall recv
acall stop
cjne a,#'~',done
sjmp run
done: acall initial
acall disp_const
mov sec,#00h ;For more information about the RTC DS1307
mov min,#0h ;Please refer to the datasheet
mov hour,#52h ;21h for 24 hour format
mov days,#01h
mov date,#1h
mov month,#1h
mov year,#05h
mov alarm,#0
mov sig,#'~'
mov ahour,#0
mov amin,#0
mov r6,#0bh
mov r0,#30h
mov r1,#00h
acall rtc_ini ;initializing RTC if required
run: acall initial
acall disp_const
run1: acall startc ;Actual Starting
mov a,#0d0h
acall send
mov a,#00h
acall send
mov r6,#3fh
acall startc ;Reading the RCT content
mov a,#0d1h
acall send
mov r0,#40h
here: acall recv
djnz r6,here
acall stop
acall display ;Display RTC
jnb time_flag,noset ;check for time flag if set the set the clock
clr time_flag
clr ea
acall time_set
clr time_flag
mov r6,#09h
mov r0,#30h
mov r1,#00h
acall rtc_ini
clr time_flag
mov a,#1h
acall command
mov a,#81h
acall command
mov a,#OK
acall data_in
disp_str < Time Set!>
mov r7,#35
setb tr0
looooop:jnb tf0,$
clr tf0
djnz r7,looooop
clr tr0
mov a,#1h
acall command
acall disp_const
setb ea
noset:
jnb alarm_flag,noset1 ;check for alarm flag if set then set alarm
clr alarm_flag
clr ea
lcall alarm_set
setb ea
setb alarm_on
clr alarm_flag
setb alarm_on
noset1:
jnb alarm_ring,noset2 ;check if alarm ring flag is set
lcall alarm_alarm ;if set then ring the alarm
noset2: ljmp run1 ;Do everything again

startc: ;I2C atart condition subroutine
clr scl
setb sda
hold
setb scl
clr sda
hold
ret
send: ;Sending data to I2C bus
mov r7,#08
back:
clr scl
hold
rlc a
mov sda,c
setb scl
hold
clr scl
hold
djnz r7,back
setb sda
setb scl
hold
clr scl
hold
ret

stop: hold ;I2C stop Condition
clr sda
setb scl
nop
setb sda
hold
clr scl
ret

recv: ;Recieving data from I2C bus
mov r7,#08
back2:
setb sda
setb scl
hold
mov c,sda
rlc a
clr scl
hold
djnz r7,back2
setb sda
clr scl
hold
clr sda
setb scl
hold
clr scl
hold
mov @r0,a
inc r0
ret

rtc_ini:acall startc ;RTC initialization subroutine
mov a,#0d0h
acall send
mov a,r1
acall send
mov a,@r0
acall send
inc r0
inc r1
acall stop
djnz r6,rtc_ini
acall stop
ret

initial:mov a,#38h ;LCD initialization subroutine
acall command
mov a,#0ch
acall command
mov a,#01h
acall command
mov a,#06h
acall command
ret

build: mov a,#40h ;Building custom character routine
acall command
build_char 4h,0eh,0eh,0eh,1fh,0h,4h,0h ;BELL
build_char 1h,3h,0fh,0fh,0fh,3h,1h,0h ;SPEAKER OFF
build_char 8h,10h,0h,18h,0h,10h,8h,0h ;SPEAKER ON
build_char 0h,0eh,15h,17h,11h,0eh,0h,0h ;CLOCK
build_char 0h,1h,3h,16h,1ch,8h,0h,0h ;OK
build_char 0ah,1fh,1fh,1fh,0eh,4h,0h,0h ;HEART
build_char 2h,3h,2h,0eh,1eh,0ch,0h,0h ;MUSIC
ret

display:mov r1,#40h ;Displaying RTC content
mov a,#0Cah
acall command
mov a,@r1
mov 50h,@r1
acall disp_val
PASS: inc r1
mov a,#0C7h
acall command
mov a,@r1
mov 51h,@r1
mov alarm_chk_min,@r1
acall disp_val
PASS1: inc r1
mov a,#0c4h
acall command
mov a,@r1
mov 52h,@r1
mov alarm_chk_hour,@r1
mov r4,a
anl a,#1fh
acall disp_val
mov a,r4
anl a,#20h
cjne a,#00h,pm
mov a,#0cdh
acall command
disp_str <am>
sjmp pass2
pm: mov a,#0cdh
acall command
disp_str <pm>
PASS2: inc r1
mov a,#80h
acall command
mov a,@r1
mov 53h,@r1
acall day
PASS3: inc r1
mov a,#88h
acall command
mov a,@r1
mov 54h,@r1
acall disp_val
PASS4: inc r1
mov a,#8bh
acall command
mov a,@r1
mov 55h,@r1
acall disp_val
PASS5: inc r1
mov a,#8eh
acall command
mov a,@r1
mov 56h,@r1
acall disp_val
jnb alarm_on,PASS6
inc r1
inc r1
inc r1
mov a,@r1
cjne a,52h,PASS6
inc r1
mov a,@r1
cjne a,51h,PASS6
setb alarm_ring
setb alarm_ring
PASS6: ret

disp_val: ;Display 8-bit Decimal Value
push acc
mov r5,a
anl a,#0f0h
swap a
mov dptr,#ascii
movc a,@a+dptr
acall data_in
mov a,r5
anl a,#0fh
movc a,@a+dptr
acall data_in
pop acc
ret

disp_const: ;Display constant characters
mov a,#8ah
acall command
mov a,#'/'
acall data_in
mov a,#8dh
acall command
mov a,#'/'
acall data_in
mov a,#0c6h
acall command
mov a,#':'
acall data_in
mov a,#0c9h
acall command
mov a,#':'
acall data_in
mov a,#0c0h
acall command
mov a,#BELL
acall data_in
mov a,#SPEAKER_OFF
acall data_in
ret

command:acall busy ;Sending command to LCD
MOV P2,A
CLR rs
CLR rw
SETB en
CLR en
RET

data_in:acall busy ;Sending data to LCD
SETB rs
MOV P2,A
CLR rw
SETB en
CLR en
RET

busy: SETB P2.7 ;Checking Busy flag
CLR rs
SETB rw
wait: CLR en
SETB en
JB P2.7,wait
RET

day: push acc ;Displaying day subroutine for RTC
cjne a,#01,skip
disp_str < *Sun*>
ljmp exit
skip: cjne a,#02,skip2
disp_str < *Mon*>
ljmp exit
skip2: cjne a,#03,skip3
disp_str < *Tue*>
ljmp exit
skip3: cjne a,#04,skip4
disp_str < *Wed*>
sjmp exit
skip4: cjne a,#05,skip5
disp_str< *Thu*>
sjmp exit
skip5: cjne a,#06,skip6
disp_str < *Fri*>
sjmp exit
skip6: disp_str < *Sat*>
exit: pop acc
ret

time_set: ;Setting time subroutine
jnb time_key,$
mov a,#1
acall command
mov a,#80h
acall command
mov a,#CLOCK
acall data_in
disp_str < set minutes:>
mov a,#0c5h
acall command
mov a,51h
acall disp_val
lcall hexdec
key: push acc
mov a,#0c5h
acall command
pop acc
jb increment,chk1
inc a
cjne a,#60,ok1
mov a,#0
ok1: jnb increment,$
lcall dechex
acall disp_val
lcall hexdec
sjmp key
chk1: jb decrement,chk2
dec a
cjne a,#0ffh,ok2
mov a,#59
ok2: jnb decrement,$
lcall dechex
acall disp_val
lcall hexdec
sjmp key
chk2: jb time_key,key

lcall dechex
mov min,a
jnb time_key,$

mov a,#1
acall command
mov a,#80h
acall command
mov a,#CLOCK
acall data_in
disp_str < set hours:>
mov a,#0c5h
acall command
mov a,52h
anl a,#1fh
acall disp_val
lcall hexdec
key1: push acc
mov a,#0c5h
acall command
pop acc
jb increment,chk3
inc a
cjne a,#13,ok3
mov a,#1
ok3: jnb increment,$
lcall dechex
acall disp_val
lcall hexdec
sjmp key1
chk3: jb decrement,chk4
dec a
cjne a,#0,ok4
mov a,#12
ok4: jnb decrement,$
lcall dechex
acall disp_val
lcall hexdec
sjmp key1
chk4: jb time_key,key1

lcall dechex
mov hour,a
jnb time_key,$

mov a,#1
acall command
mov a,#80h
acall command
mov a,#CLOCK
acall data_in
disp_str < set am/pm:>
mov a,52h
anl a,#20h
cjne a,#00h,pm1
mov a,#0c5h
acall command
disp_str <am>
setb ampm_flag
sjmp key2
pm1: mov a,#0c5h
acall command
disp_str <pm>
clr ampm_flag

key2: mov a,#0c5h
acall command
jb increment,chk5
jb ampm_flag,ok5
setb ampm_flag
disp_str <am>
hold
jnb increment,$
sjmp key2
ok5: clr ampm_flag
disp_str <pm>
hold
jnb increment,$
sjmp key2
chk5: jb decrement,chk6
jb ampm_flag,ok6
setb ampm_flag
disp_str <am>
hold
jnb decrement,$
sjmp key2
ok6: clr ampm_flag
disp_str <pm>
hold
jnb decrement,$
sjmp key2
chk6: jb time_key,key2

jnb ampm_flag,noam
mov a,hour
add a,#40h
sjmp nopm
noam: mov a,hour
add a,#60h
nopm: mov hour,a
jnb time_key,$

mov a,#1
acall command
mov a,#80h
acall command
mov a,#CLOCK
acall data_in
disp_str < set days:>
mov a,#0c5h
lcall command
mov a,53h
push acc
lcall day
pop acc
key3: push acc
mov a,#0c5h
lcall command
pop acc
jb increment,chk7
inc a
cjne a,#8,ok7
mov a,#1
ok7: jnb increment,$
push acc
lcall day
pop acc
sjmp key3
chk7: jb decrement,chk8
dec a
cjne a,#0,ok8
mov a,#7
ok8: jnb decrement,$
push acc
lcall day
pop acc
sjmp key3
chk8: jb time_key,key3

mov days,a
jnb time_key,$

mov a,#1
lcall command
mov a,#80h
lcall command
mov a,#CLOCK
lcall data_in
disp_str < set date:>
mov a,#0c5h
lcall command
mov a,54h
lcall disp_val
lcall hexdec
key4: push acc
mov a,#0c5h
lcall command
pop acc
jb increment,chk9
inc a
cjne a,#32,ok9
mov a,#1
ok9: jnb increment,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp key4
chk9: jb decrement,chk10
dec a
cjne a,#0,ok10
mov a,#31
ok10: jnb decrement,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp key4
chk10: jb time_key,key4

lcall dechex
mov date,a
jnb time_key,$

mov a,#1
lcall command
mov a,#80h
lcall command
mov a,#CLOCK
lcall data_in
disp_str < set month:>
mov a,#0c5h
lcall command
mov a,55h
lcall disp_val
lcall hexdec
key5: push acc
mov a,#0c5h
lcall command
pop acc
jb increment,chk11
inc a
cjne a,#13,ok11
mov a,#1
ok11: jnb increment,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp key5
chk11: jb decrement,chk12
dec a
cjne a,#0,ok12
mov a,#12
ok12: jnb decrement,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp key5
chk12: jb time_key,key5

lcall dechex
mov month,a
jnb time_key,$

mov a,#1
lcall command
mov a,#80h
lcall command
mov a,#CLOCK
lcall data_in
disp_str < set year:>
mov a,#0c5h
lcall command
mov a,56h
lcall disp_val
lcall hexdec
key6: push acc
mov a,#0c5h
lcall command
pop acc
jb increment,chk13
inc a
cjne a,#100,ok13
mov a,#0
ok13: jnb increment,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp key6
chk13: jb decrement,chk14
dec a
cjne a,#0ffh,ok14
mov a,#99
ok14: jnb decrement,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp key6
chk14: jb time_key,key6

jnb time_key,$
lcall dechex
mov year,a
mov alarm,#00
mov sig,#'~'
clr time_flag
clr time_flag
ret

alarm_set: ;Setting Alarm Subroutine
jnb alarm_key,$
mov a,#1
lcall command
mov a,#80h
lcall command
mov a,#BELL
lcall data_in
disp_str < set minutes:>
mov a,#0c5h
lcall command
mov a,#30h
lcall disp_val
lcall hexdec
akey: push acc
mov a,#0c5h
lcall command
pop acc
jb increment,achk1
inc a
cjne a,#60,aok1
mov a,#0
aok1: jnb increment,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp akey
achk1: jb decrement,achk2
dec a
cjne a,#0ffh,aok2
mov a,#59
aok2: jnb decrement,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp akey
achk2: jb alarm_key,akey

lcall dechex
mov alarm_min,a
jnb alarm_key,$

mov a,#1
lcall command
mov a,#80h
lcall command
mov a,#BELL
lcall data_in
disp_str < set hours:>
mov a,#0c5h
lcall command
mov a,#44h
anl a,#1fh
lcall disp_val
lcall hexdec
akey1: push acc
mov a,#0c5h
lcall command
pop acc
jb increment,achk3
inc a
cjne a,#13,aok3
mov a,#1
aok3: jnb increment,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp akey1
achk3: jb decrement,achk4
dec a
cjne a,#0,aok4
mov a,#12
aok4: jnb decrement,$
lcall dechex
lcall disp_val
lcall hexdec
sjmp akey1
achk4: jb alarm_key,akey1

lcall dechex
mov alarm_hrs,a
jnb alarm_key,$

mov a,#1
lcall command
mov a,#80h
lcall command
mov a,#BELL
lcall data_in
disp_str < set am/pm:>
mov a,#0c5h
lcall command
mov a,alarm_hrs
anl a,#20h
cjne a,#20h,its_pm
disp_str <am>
setb ampm_flag
sjmp akey2
its_pm: disp_str <pm>
clr ampm_flag
akey2: mov a,#0c5h
lcall command
jb increment,achk5
jb ampm_flag,aok5
setb ampm_flag
disp_str <am>
hold
jnb increment,$
sjmp akey2
aok5: clr ampm_flag
disp_str <pm>
hold
jnb increment,$
sjmp akey2
achk5: jb decrement,achk6
jb ampm_flag,aok6
setb ampm_flag
disp_str <am>
hold
jnb decrement,$
sjmp akey2
aok6: clr ampm_flag
disp_str <pm>
hold
jnb decrement,$
sjmp akey2
achk6: jb alarm_key,akey2
jnb alarm_key,$
mov a,alarm_hrs
jb ampm_flag,anoam
add a,#60h
sjmp anopm
anoam: mov a,alarm_hrs
add a,#40h
anopm: mov alarm_hrs,a
mov ahour,alarm_hrs
mov amin,alarm_min
mov r6,#02h
mov r0,#39h
mov r1,#09h
lcall rtc_ini
mov a,#1h
lcall command
mov a,#81h
lcall command
mov a,#OK
lcall data_in
disp_str < Alarm On!>
mov a,#0c4h
lcall command
mov a,alarm_hrs
anl a,#1fh
lcall disp_val
mov a,#':'
lcall data_in
mov a,alarm_min
lcall disp_val
mov a,alarm_hrs
anl a,#20h
cjne a,#00h,ppm
disp_str < am>
sjmp ppass2
ppm: disp_str < pm>
ppass2: mov r7,#35
setb tr0
looop: jnb tf0,$
clr tf0
djnz r7,looop
clr tr0
mov a,#1h
lcall command
lcall disp_const
mov a,#SPEAKER_ON
lcall data_in
setb alarm_off
setb alarm_on
clr alarm_flag
clr alarm_flag
ret

alarm_alarm: ;Alarm Ring subroutine
clr alarm_port
mov r3,#0ffh
a_loop: mov r4,#0ffh
djnz r4,$
djnz r3,a_loop
setb alarm_port
mov r3,#0ffh
a_loop1:mov r4,#0ffh
djnz r4,$
djnz r3,a_loop1
clr alarm_port
mov r3,#0ffh
a_loop2:mov r4,#0ffh
djnz r4,$
djnz r3,a_loop2
setb alarm_port
mov r3,#0ffh
a_loop3:mov r4,#0ffh
djnz r4,$
djnz r3,a_loop3
clr alarm_port
mov r3,#0ffh
a_loop4:mov r4,#0ffh
djnz r4,$
djnz r3,a_loop4
setb alarm_port
mov r3,#0ffh
a_loop5:mov r4,#0ffh
djnz r4,$
djnz r3,a_loop5
clr alarm_port
mov r3,#0ffh
a_loop6:mov r4,#0ffh
djnz r4,$
djnz r3,a_loop6
setb alarm_port
ret

dechex: mov b,#0ah ;Decimal to Hexadecimal conversion
div ab
mov 60h,b
mov b,#10h
mul ab
add a,60h
ret

hexdec: mov b,#10h ;Hexadecimal to deciaml conversion
div ab
mov 60h,b
mov b,#0ah
mul ab
add a,60h
ret

ascii: ;ASCII lookup table
db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h

end

hengameh
15th December 2010, 01:57 PM
یه توضیح مختصر برا چند خط اول که نوشتنشون الزامی نیست آدرس ایمیلو طراحشو منظورمه

BEN HOR
19th December 2010, 06:52 PM
یه توضیح مختصر برا چند خط اول که نوشتنشون الزامی نیست آدرس ایمیلو طراحشو منظورمه
چرا نمیشه...............
بله الزامی نیست................
ولی نباید از این مورد...............
چشم پوشی کنیم............
بالاخره طراح این کدا زحمت کشیده...............
و این کوچکترین................
تشکر ما از زحمات طراح این کد هاست..............

یا علی................
موفق باشی.....................

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد