Follow by Email

February 26, 2012

Jam digital dengan tampilan seven segmen dan LCD menggunakan RTC DS1307 dan mikrokontroler AVR atmega 8535

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.





ini codenya.

$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?


31 comments:

  1. 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?

    ReplyDelete
    Replies
    1. Saya 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.

      Delete
  2. Sepertinya 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.
    Saya 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?

    ReplyDelete
    Replies
    1. Terima kasih masukannya mas sigondrong.

      masukan 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

      Delete
    2. Benarkah Bascom tidak punya operator Mod (sisa bagi)?
      Langkah 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?

      Delete
    3. Makasih atas masukannya mas Sulhan Setiawan.
      koreksinya 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??

      Delete
  3. mas nanya kalo semisal jam digital ini ditambah funsi alarm tuh gimana mas? trus penambahannya juga seperti apa? tolong dijelaskan terima kasih

    ReplyDelete
    Replies
    1. Bisa dilihat disini

      http://bagindra.blogspot.com/2012/03/jam-digital-dengan-fungsi-alarm.html

      Delete
    2. makasih ya mas, bisa jadi inspirasi ini, kalau masih bingung, saya mau share nanya disini mas

      Delete
    3. Alhamdulillah kalo bisa membantu. silakan tanya mas. kalo tau saya jawab. kalo gak tau kita bisa cari solusinya bersama

      Delete
  4. mas kalo source code yang pake c language punya g mas?
    tolong balas ke bank_wiera@ymail.com

    ReplyDelete
  5. mas boleh tanya tu pake proteus berapa ea mas?aku pake 7.5 kok beda

    ReplyDelete
    Replies
    1. Bisa tau mas bedanya dimana?
      saya pake proteus 7.1 SP4

      Delete
    2. mas bole minta file simulasi proteusnya ga mas??kalo bole kirim ke set.didik@yahoo.com gambar di atas ga keliatan mas makasih sebelumnya

      Delete
    3. eh salah maksunnya set.didik@yahoo.co.id

      Delete
  6. mas boleh minta file simulasi proteusnya ga mas??
    kalo boleh kirim ke ariesmanlord@yahoo.co.id gambar di atas ga keliatan mas makasih sebelumnya

    ReplyDelete
  7. mas, kalu bikin nya pake ewb gimana ya? mumet aku.. cuman bisa detik satuan aja..

    justcallmewo@gmail.com

    ReplyDelete
  8. salam kenal ya ms..
    mas 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??

    ReplyDelete
  9. mas ketika saya buat hardware dan program yg sama...kok hasilnya tidak sesuai ya...mohon solusinya

    ReplyDelete
  10. kalo program pake bahasa c gimana ya mas...soalnya saya msih kesulitan memahami bahasa basicnya

    ReplyDelete
  11. malam mas, punya pengontrol suhu gak ? dibahas dong mas...

    ReplyDelete
  12. mas
    kl mengubah detiknya gmna programnya
    kan tombolnya cma satu???

    ReplyDelete
  13. mas kalau tanpa lcd bagai mana programx?m0h0n bntuanya?

    ReplyDelete
  14. salam kenal mas,
    saya ardi, saya ingin bertanya, mas ada gax program untuk membuat jam digital lampu led menggunakan mikrokontroler AT89S52,,
    mohon bantuan nya?

    ReplyDelete
  15. mas tolong kirim source prog. dan file proteus ke : smk2bisa@gmail.com /untuk bahan ajar siswa.trimakasih

    ReplyDelete
  16. salam, 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

    ReplyDelete
  17. cara biar tampilan pada 7 segmentnya gak nye caning gimana

    ReplyDelete
  18. mas, kalo program yang pake AVR ada ?

    ReplyDelete

Let's us sharing

Recent Comment

Grab This Widget