Daripada bengong gak ada kerjaan (lagi libur) pas baca-baca blog kawan ternyata ada yang membahas jam digital dengan tampilan LCD. So saya jadi terinspirasi untuk menambahkan script programnya sehingga bisa ditampilkan dengan seven segmen. Disini saya menggunakan bahasa BASIC dengan menggunakan software BASCOM AVR.
.
$regfile = "m8535.dat"
$crystal = 12000000
'------------------------ lcd -------------------------------------------------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Pina.0 , E = Pina.1 , Db4 = Pina.4 , Db5 = Pina.5 , Db6 = Pina.6 , Db7 = Pina.7
Cls
'--------------------------- ds 1307 -----------------------------------------
$lib "ds1307clock.lib"
'configure the scl and sda pins
Config Sda = Portc.7
Config Scl = Portc.6
'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
'------------------------------ key --------------------------------------------
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Portb = Output
Config Portd = Output
Declare Sub Test(byval A1 As Byte)
'------------------------------------------------------------------------------
Config Debounce = 30
Dim A1 As Byte , B1 As Byte , B2 As Byte
Dim Seco As Byte , Mine As Byte , Hour As Byte
'-------------------------------------------------------------------------------
Cursor Off
'-------------------------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "Jam Digital"
Waitms 100
Cls
'-------------------------------------------------------------------------------
Main:
Do
Gosub Ds1307
Gosub 24_12
Gosub Chekkey
Loop
'-------------------------------------------------------------------------------
Ds1307:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte Seco , Ack 'sec
I2crbyte Mine , Ack ' MINUTES
I2crbyte Hour , nack ' Hours
I2cstop
Seco = Makedec(seco) : Mine = Makedec(mine) : Hour = Makedec(hour)
Return
'-------------------------------------------------------------------------------
24_12:
If Pinc.4 = 1 Then Gosub Disply_24
If Pinc.4 = 0 Then Gosub Disply_12
Return
'-------------------------------------------------------------------------------
Disply_24:
Locate 1 , 1
Lcd "Jam = " ; Hour ; ":" ;
A1 = Hour
Call Test(a1)
Portd = &B00001000
Portb = B2
Waitms 30
Portd = &B00000100
Portb = B1
Waitms 30 'call sub with parameters
Lcd Mine ; ":" ;
A1 = Mine
Call Test(a1)
Portd = &B00000010
Portb = B2
Waitms 30
Portd = &B00000001
Portb = B1
Waitms 30
Lcd Seco
Locate 2 , 6
Lcd "(24 Jam)"
Wait 1
Return
'-------------------------------------------------------------------------------
Disply_12:
If Hour = 0 Then Hour = 12
If Hour > 12 Then Hour = Hour - 12
Locate 1 , 1
Lcd "Jam = " ; Hour ; ":" ;
A1 = Hour
Call Test(a1)
Portd = &B00001000
Portb = B2
Waitms 30
Portd = &B00000100
Portb = B1
Waitms 30
Lcd Mine ; ":" ;
A1 = Mine
Call Test(a1)
Portd = &B00000010
Portb = B2
Waitms 30
Portd = &B00000001
Portb = B1
Waitms 30
Lcd Seco
Locate 2 , 6
Lcd "(12 Jam)"
Return
'-------------------------------------------------------------------------------
Chekkey:
Debounce Pinc.1 , 0 , Seco , Sub
Debounce Pinc.2 , 0 , Mine , Sub
Debounce Pinc.3 , 0 , Hour , Sub
Return
'--------------------------------------------------------------------------------
Seco:
Incr Seco
If Seco > 59 Then Seco = 0
Seco = Makebcd(seco)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte Seco
I2cstop
Return
'-------------------------------------------------------------------------------
Mine:
Incr Mine
If Mine > 59 Then Mine = 0
Mine = Makebcd(mine)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 1 ' starting address in 1307
I2cwbyte Mine
I2cstop
Return
'-------------------------------------------------------------------------------
Hour:
Incr Hour
If Hour > 12 And Pinc.4 = 0 Then Hour = 0
Hour = Makebcd(hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 1 ' starting address in 1307
I2cwbyte Hour
I2cstop
Return
Sub Test(byval A1 As Byte ) 'start sub
B1 = A1 mod 10
B1 = Lookup(B1 , Dta)
B2 = A1 / 10
B2 = Lookup(B2 , Dta)
End Sub
Dta:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10
'-------------------------------------------------------------------------------
Rencana nya sih saya ingin membuat jam digital yang ada tanggal dan mungkin juga menambahkan jadwal sholat. Pas saya tambahkan beberapa seven segmen untuk tampilan tanggalnya mengakibatkan CPU dari proteus overload (100%) yang membuat simulasi hampir tak bergerak. saya coba googling mencari pemecahan masalah tersebut tetapi belum ketemu solusinya. Dan mungkin itu juga keterbatasan dari Proteus kali ya. Apa ada mungkin temen-temen yang tau solusinya?
.
$regfile = "m8535.dat"
$crystal = 12000000
'------------------------ lcd -------------------------------------------------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Pina.0 , E = Pina.1 , Db4 = Pina.4 , Db5 = Pina.5 , Db6 = Pina.6 , Db7 = Pina.7
Cls
'--------------------------- ds 1307 -----------------------------------------
$lib "ds1307clock.lib"
'configure the scl and sda pins
Config Sda = Portc.7
Config Scl = Portc.6
'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
'------------------------------ key --------------------------------------------
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Portb = Output
Config Portd = Output
Declare Sub Test(byval A1 As Byte)
'------------------------------------------------------------------------------
Config Debounce = 30
Dim A1 As Byte , B1 As Byte , B2 As Byte
Dim Seco As Byte , Mine As Byte , Hour As Byte
'-------------------------------------------------------------------------------
Cursor Off
'-------------------------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "Jam Digital"
Waitms 100
Cls
'-------------------------------------------------------------------------------
Main:
Do
Gosub Ds1307
Gosub 24_12
Gosub Chekkey
Loop
'-------------------------------------------------------------------------------
Ds1307:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte Seco , Ack 'sec
I2crbyte Mine , Ack ' MINUTES
I2crbyte Hour , nack ' Hours
I2cstop
Seco = Makedec(seco) : Mine = Makedec(mine) : Hour = Makedec(hour)
Return
'-------------------------------------------------------------------------------
24_12:
If Pinc.4 = 1 Then Gosub Disply_24
If Pinc.4 = 0 Then Gosub Disply_12
Return
'-------------------------------------------------------------------------------
Disply_24:
Locate 1 , 1
Lcd "Jam = " ; Hour ; ":" ;
A1 = Hour
Call Test(a1)
Portd = &B00001000
Portb = B2
Waitms 30
Portd = &B00000100
Portb = B1
Waitms 30 'call sub with parameters
Lcd Mine ; ":" ;
A1 = Mine
Call Test(a1)
Portd = &B00000010
Portb = B2
Waitms 30
Portd = &B00000001
Portb = B1
Waitms 30
Lcd Seco
Locate 2 , 6
Lcd "(24 Jam)"
Wait 1
Return
'-------------------------------------------------------------------------------
Disply_12:
If Hour = 0 Then Hour = 12
If Hour > 12 Then Hour = Hour - 12
Locate 1 , 1
Lcd "Jam = " ; Hour ; ":" ;
A1 = Hour
Call Test(a1)
Portd = &B00001000
Portb = B2
Waitms 30
Portd = &B00000100
Portb = B1
Waitms 30
Lcd Mine ; ":" ;
A1 = Mine
Call Test(a1)
Portd = &B00000010
Portb = B2
Waitms 30
Portd = &B00000001
Portb = B1
Waitms 30
Lcd Seco
Locate 2 , 6
Lcd "(12 Jam)"
Return
'-------------------------------------------------------------------------------
Chekkey:
Debounce Pinc.1 , 0 , Seco , Sub
Debounce Pinc.2 , 0 , Mine , Sub
Debounce Pinc.3 , 0 , Hour , Sub
Return
'--------------------------------------------------------------------------------
Seco:
Incr Seco
If Seco > 59 Then Seco = 0
Seco = Makebcd(seco)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte Seco
I2cstop
Return
'-------------------------------------------------------------------------------
Mine:
Incr Mine
If Mine > 59 Then Mine = 0
Mine = Makebcd(mine)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 1 ' starting address in 1307
I2cwbyte Mine
I2cstop
Return
'-------------------------------------------------------------------------------
Hour:
Incr Hour
If Hour > 12 And Pinc.4 = 0 Then Hour = 0
Hour = Makebcd(hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 1 ' starting address in 1307
I2cwbyte Hour
I2cstop
Return
Sub Test(byval A1 As Byte ) 'start sub
B1 = A1 mod 10
B1 = Lookup(B1 , Dta)
B2 = A1 / 10
B2 = Lookup(B2 , Dta)
End Sub
Dta:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10
'-------------------------------------------------------------------------------
Rencana nya sih saya ingin membuat jam digital yang ada tanggal dan mungkin juga menambahkan jadwal sholat. Pas saya tambahkan beberapa seven segmen untuk tampilan tanggalnya mengakibatkan CPU dari proteus overload (100%) yang membuat simulasi hampir tak bergerak. saya coba googling mencari pemecahan masalah tersebut tetapi belum ketemu solusinya. Dan mungkin itu juga keterbatasan dari Proteus kali ya. Apa ada mungkin temen-temen yang tau solusinya?
Saya juga ingin bikin jadwal sholat, tapi saya ingin yang jadwalnya bukan menggunakan tabel tapi menggunakan perhitungan berdasarkan posisi. Pernah nemu software untuk menghitung jadwal waktu sholat, tapi hasil yang didapat beda banget dengan jadwal yang dikeluarkan oleh Depag, jadi ragu. Apa Mas Indra bisa mengajari saya bagaimana rumus menghitung jadwal sholat?
ReplyDeleteSaya sih belum mencoba membuat algoritma nya mas. Tapi kalo melihat artikel dari era muslim http://www.eramuslim.com/syariah/ilmu-hisab/cara-menghitung-waktu-shalat.htm. dapat diketahui bahwa parameternya bukan hanya dari lokasi tetapi Ketinggian lokasi dari permukaan laut (H), dan juga madzhab apa yang digunakan di dalam perhitungannya.
DeleteSepertinya Sub Test(byval A1 As Byte ) dibuat dengan cara yang terlalu panjang. Membuat if sebanyak 60 padahal pola dari setiap if tersebut terlihat sangat jelas.
ReplyDeleteSaya tidak pernah menggunakan Bascom, jadi tidak begitu mengetahui aturan-aturan dalam bascom, tetapi sepertinya bisa disingkat menjadi:
Sub Test(byval A1 As Byte )
B1 = Lookup(A1 % 10 , Dta)
B2 = Lookup(A1 / 10 , Dta)
End Sub
Apakah bisa begitu?
Terima kasih masukannya mas sigondrong.
Deletemasukan dari mas memang tidak bisa diterapakan di BASCOM tapi itu memberi saya ide mas.
jadi hasilnya begini mas
Sub Test(byval A1 As Byte ) 'start sub
B1 = A1 / 10
Z = Lookup(B1 , Dta1)
Z = Z * 10
B1 = A1 - Z
B1 = Lookup(B1 , Dta)
A1 = A1 / 10
B2 = Lookup(A1 , Dta)
End Sub
Dta:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10
Dta1:
Data 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
makasi mas gondrong atas masukannya
Benarkah Bascom tidak punya operator Mod (sisa bagi)?
DeleteLangkah tersebut menurutku masih terlalu panjang. Jika memang Bascom tidak punya Mod, tetapi B1=A1/10 dimana B1 adalah byte, akan menghasilkan nilai yg pasti jg berupa bilangan bulat. Kenapa harus menggunakan B1 untuk mengambil data di Dta1? dan kenapa pula setelah itu harus mengalikan Z dengan 10?
Pertama, menggunakan lookup untuk hal seperti ini jelas tidak perlu. Kedua, jika memang harus menggunakan lookup, kenapa tidak datanya langsung 0,10,20,... sehingga tidak perlu lagi Z=Z*10?
Makasih atas masukannya mas Sulhan Setiawan.
Deletekoreksinya mantap mas.
Sub Test(byval A1 As Byte ) 'start sub
B1 = A1 mod 10
B1 = Lookup(B1 , Dta)
B2 = A1 / 10
B2 = Lookup(B2 , Dta)
End Sub
Dta:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10
Masih adakah yang perlu dikoreksi mas??
mas nanya kalo semisal jam digital ini ditambah funsi alarm tuh gimana mas? trus penambahannya juga seperti apa? tolong dijelaskan terima kasih
ReplyDeleteBisa dilihat disini
Deletehttp://bagindra.blogspot.com/2012/03/jam-digital-dengan-fungsi-alarm.html
makasih ya mas, bisa jadi inspirasi ini, kalau masih bingung, saya mau share nanya disini mas
DeleteAlhamdulillah kalo bisa membantu. silakan tanya mas. kalo tau saya jawab. kalo gak tau kita bisa cari solusinya bersama
Deletemas kalo source code yang pake c language punya g mas?
ReplyDeletetolong balas ke bank_wiera@ymail.com
maaf gak punya mas
Deletehmmmmm..., boleh tahan,,,,,
ReplyDeletemas boleh tanya tu pake proteus berapa ea mas?aku pake 7.5 kok beda
ReplyDeleteBisa tau mas bedanya dimana?
Deletesaya pake proteus 7.1 SP4
mas bole minta file simulasi proteusnya ga mas??kalo bole kirim ke set.didik@yahoo.com gambar di atas ga keliatan mas makasih sebelumnya
Deleteeh salah maksunnya set.didik@yahoo.co.id
DeleteOK Insya Allah.
Deletemas boleh minta file simulasi proteusnya ga mas??
ReplyDeletekalo boleh kirim ke ariesmanlord@yahoo.co.id gambar di atas ga keliatan mas makasih sebelumnya
mas, kalu bikin nya pake ewb gimana ya? mumet aku.. cuman bisa detik satuan aja..
ReplyDeletejustcallmewo@gmail.com
salam kenal ya ms..
ReplyDeletemas blh mta tlg,klo saya minta file source cdode dan simulasi di proteusnya boleh apa tidak??
klo boleh kirim ke email saya aja mas
xcoray_xcellentz8@yahoo.co.id
trz mw tny klo xtal mikronya pake 4 mega gmn mas??
mas ketika saya buat hardware dan program yg sama...kok hasilnya tidak sesuai ya...mohon solusinya
ReplyDeletekalo program pake bahasa c gimana ya mas...soalnya saya msih kesulitan memahami bahasa basicnya
ReplyDeletemalam mas, punya pengontrol suhu gak ? dibahas dong mas...
ReplyDeletemas
ReplyDeletekl mengubah detiknya gmna programnya
kan tombolnya cma satu???
mas kalau tanpa lcd bagai mana programx?m0h0n bntuanya?
ReplyDeletesalam kenal mas,
ReplyDeletesaya ardi, saya ingin bertanya, mas ada gax program untuk membuat jam digital lampu led menggunakan mikrokontroler AT89S52,,
mohon bantuan nya?
mas tolong kirim source prog. dan file proteus ke : smk2bisa@gmail.com /untuk bahan ajar siswa.trimakasih
ReplyDeletesalam, Mas Kalau Jam digital Dot matrix yang pakai RTC DS1307 bisa ga mas, kalau bisa minta list codenya. terima kasih banyak. luthfan_55091@yahoo.co.id
ReplyDeletecara biar tampilan pada 7 segmentnya gak nye caning gimana
ReplyDeletemas, kalo program yang pake AVR ada ?
ReplyDeletemaster kok ada yang eror ya "error duplicate label name used by const or variabel [seco] dan [mine]
ReplyDeleteuntuk menampilkan detik dengan cara gimana mas?
ReplyDeletesalam knal mas.,
ReplyDeletesource code.nya kok ada yang eror ya "error duplicate label name used by const or variabel [seco] dan [mine]