RANCANG BANGUN JAM DIGITAL SEDERHANA DENGAN KEYPAD SEBAGAI SISTEM PENGATURAN WAKTU

    

RANCANG BANGUN JAM DIGITAL SEDERHANA
DENGAN KEYPAD SEBAGAI SISTEM PENGATURAN WAKTU

 

Ardinur Hanif Wibisono1., Dzaki Fadlullah Rasya2., Luthfi Bagas Fahreza3.,
Niko Rafarel4, Samuel Beta Kuntarjo5.

Email:
 1hanif.43424105@mhs.polines.ac.id,  2
dzaky.43424108@mhs.polines.ac.id,  3bagas.43424117@mhs.polines.ac.id 4niko.43424120@mhs.polines.ac.id,  5sambetak2@gmail.com. 

Program Studi Teknologi Rekayasa Elektronika Politeknik Negeri Semarang
Jl.
Prof. H. Sudharto, S.H., Tembalang, Semarang, Jawa Tengah Indonesia, 50275
Telp. (024)7473417, Website: www.polines.ac.id, Email:sekretariat@polines.ac.id





Kata Pengantar

 Puji dan syukur kami panjatkan ke hadirat Tuhan Yang Maha Esa atas rahmat dan karunia-Nya sehingga laporan praktikum yang berjudul "Rancang Bangun Jam Digital Sederhana dengan Keypad sebagai Sistem Pengaturan Waktu" dapat diselesaikan dengan baik.

 Laporan ini disusun sebagai salah satu tugas praktikum mata kuliah Mikrokontroler. Dalam proyek ini, kami merancang dan mengimplementasikan sistem jam digital berbasis mikrokontroler ATmega8051 yang mampu menampilkan informasi waktu berupa hari, tanggal, jam, dan menit pada LCD 16×2. Sistem ini dilengkapi dengan dua tombol kontrol untuk masuk ke mode pengaturan dan navigasi antar field, serta keypad 4×4 sebagai media input untuk mengubah nilai waktu.

Tujuan dari praktikum ini adalah untuk meningkatkan pemahaman mahasiswa tentang penggunaan mikrokontroler dalam aplikasi nyata, khususnya dalam merancang sistem pewaktuan digital yang dapat dikonfigurasi oleh pengguna. Melalui praktikum ini, kami mempelajari teknik pembacaan keypad dengan metode scanning, penggunaan timer internal untuk perhitungan waktu real-time, serta integrasi antara perangkat input dan output dalam satu sistem yang terintegrasi.

Kami menyadari bahwa laporan ini masih memiliki kekurangan dan keterbatasan. Oleh karena itu, kami sangat terbuka terhadap kritik dan saran yang membangun untuk perbaikan di masa mendatang. Kami mengucapkan terima kasih kepada dosen pembimbing yang telah memberikan bimbingan, arahan, dan dukungan selama proses praktikum ini berlangsung.


Semarang, 19 Desember 2025
 
 
 
 
  
Kelompok 5

 




BAB I
PENDAHULUAN

1.1  Latar Belakang

Dalam kehidupan sehari-hari, waktu memiliki peranan yang sangat penting bagi setiap individu. Kemampuan untuk mengelola waktu dengan baik dapat meningkatkan produktivitas dan efisiensi dalam berbagai aktivitas, baik dalam lingkungan pendidikan, pekerjaan, maupun kehidupan pribadi. Oleh karena itu, dibutuhkan alat penunjuk waktu yang akurat dan mudah digunakan. Namun, banyak jam digital yang tersedia di pasaran memiliki keterbatasan dalam pengaturan waktu, di mana beberapa jam digital hanya menyediakan tombol kecil yang sulit dioperasikan, sementara yang lain memerlukan langkah-langkah yang berbelit-belit untuk melakukan penyesuaian waktu.

Berdasarkan permasalahan tersebut, muncul kebutuhan untuk merancang dan membuat sebuah jam digital yang tidak hanya mampu menampilkan informasi waktu (hari, tanggal, jam, dan menit), tetapi juga dilengkapi dengan sistem pengaturan yang mudah dan user-friendly menggunakan keypad. Proyek pembuatan jam digital sederhana ini diharapkan dapat menjadi solusi praktis yang menggabungkan fungsionalitas penunjuk waktu yang lengkap dengan kemudahan dalam pengoperasian, sekaligus mengaplikasikan pengetahuan dalam bidang elektronika digital dan pemrograman mikrokontroler untuk meningkatkan pemahaman dan keterampilan teknis dalam perancangan sistem embedded.

            1.2  Rumusan masalah

1.     Bagaimana merancang dan membuat jam digital yang dapat menampilkan informasi hari, tanggal, jam, dan menit secara akurat?

2.     Bagaimana mengimplementasikan tombol dan keypad sebagai pengubah setingan jam digital?

3.     Bagaimana memastikan sistem tetap efisien dan aman saat dioperasikan?

            1.3  Tujuan

1.     Merancang dan mengimplementasikan sistem kontrol jam digital menggunakan mikrokontroler ATMega8535.

2.     Mengintegrasikan tombol dan keypad sebagai pengubah settingan jam digital.

3.   Menghasilkan sistem yang mudah digunakan dan memenuhi aspek keselamatan.


BAB II
KAJIAN PUSTAKA

            2.1  Komponen Utama

1.    ATMega8051

 


ATmega8051 adalah mikrokontroler yang digunakan sebagai pengendali pada sistem elektronika berbasis embedded, dengan arsitektur 8-bit yang mampu mengeksekusi instruksi program dari memori internal. Dalam satu chip telah terintegrasi CPU, memori program, memori data, port input/output, timer/counter, sistem interupsi, serta fasilitas komunikasi serial, sehingga dapat menerima input, memproses data sesuai program, dan menghasilkan output untuk mengendalikan perangkat elektronik..

2.    Lcd


LCD (Liquid Crystal Display) merupakan salah satu jenis media tampilan yang memanfaatkan kristal cair sebagai dalam menampilkan informasi. Tampilan pada LCD terbentuk dari banyak titik cahaya (piksel), di mana setiap piksel terdiri atas kristal cair. Meskipun disebut titik cahaya, kristal cair tersebut tidak menghasilkan cahaya sendiri, melainkan mengatur cahaya dari sumber penerangan. LCD berukuran 16x2 mampu menampilkan hingga 32 karakter, yang tersusun dalam dua baris, dengan masing-masing baris menampilkan 16 karakter.

3.    Saklar Tekan

 


Saklar tekan (Push Button) adalah komponen input berupa saklar sederhana yang berfungsi memberikan sinyal digital kepada mikrokontroler ketika ditekan. Pushbutton memiliki dua kondisi yaitu normally open (NO) yang terhubung saat ditekan, dan normally closed (NC) yang terputus saat ditekan. Dalam aplikasi mikrokontroler, pushbutton biasanya dihubungkan dengan resistor pull-up atau pull-down untuk memastikan pin input berada pada kondisi logika yang stabil (HIGH atau LOW), sehingga mencegah pembacaan sinyal yang tidak stabil (floating).

4.    Keypad

        



Keypad matriks merupakan perangkat input yang menggunakan kombinasi baris dan kolom untuk memberikan informasi status tombol kepada mikrokontroler. Pada keypad matriks 4x4, terdapat empat baris dan empat kolom yang membentuk 16 tombol. Prinsip kerja pembacaan keypad dilakukan dengan metode scanning, yaitu mikrokontroler secara bergantian memberikan sinyal logika pada setiap kolom, kemudian membaca status baris untuk mendeteksi tombol yang ditekan. Ketika tombol ditekan, terjadi kontak antara baris dan kolom tertentu yang menghasilkan perubahan level logika, sehingga mikrokontroler dapat mengidentifikasi posisi tombol berdasarkan kombinasi baris dan kolom yang aktif.

5.     Resistor


 

Resistor adalah komponen elektronika pasif yang berfungsi untuk menghambat atau membatasi arus listrik dalam rangkaian. Sifat inilah yang membuat resistor dapat digunakan untuk mengatur kondisi listrik tanpa menyebabkan hubungan langsung antara sumber tegangan dan komponen lain.

Pull-up resistor adalah penggunaan khusus dari resistor yang memanfaatkan fungsi pembatas arus tersebut untuk menentukan kondisi logika pada rangkaian digital. Dengan menghubungkan resistor antara pin input dan tegangan positif, resistor membatasi arus sekaligus memastikan pin tidak berada pada kondisi tidak menentu (floating), sehingga sinyal logika dapat terbaca dengan jelas dan rangkaian bekerja lebih stabil.


BAB III
PERANCANGAN ALAT

            3.1  Komponen Utama

            1.  Mikrokontroler Atmega8051

            2.  LCD 16x2

            3.  Saklar Tekan (2)

            4.  Keypad

            5.  Resistor

        3.2   Diagram Blok Sistem


          3.3   Diagram Alir

 


            3.4  Cara kerja

Sistem jam digital ini bekerja dengan prinsip perhitungan waktu pada mikrokontroler ATmega8051 yang menampilkan informasi hari, tanggal, jam, dan menit pada LCD 16x2. Saat sistem dinyalakan, mikrokontroler melakukan inisialisasi LCD dan timer, kemudian mulai menghitung waktu secara otomatis. Timer akan menghasilkan interrupt setiap detik untuk menambah nilai menit, dan ketika menit mencapai 60 akan reset ke 0 dan menambah nilai jam, begitu seterusnya hingga perhitungan tanggal dan hari. Tampilan LCD dibagi menjadi dua baris, baris pertama menampilkan hari dan tanggal, sedangkan baris kedua menampilkan jam dan menit dalam format JJ:MM.

Untuk mengatur waktu, pengguna menekan tombol SET untuk masuk ke mode pengaturan yang ditandai dengan perubahan tampilan LCD. Sistem akan menampilkan field yang sedang diatur (JAM, MENIT, TGL, atau HARI) dan nilai saat ini. Pengguna memasukkan nilai baru menggunakan keypad dengan sistem input 2 digit untuk jam, menit, dan tanggal. Tombol NEXT digunakan untuk berpindah ke field berikutnya yang akan diatur. Setelah selesai, pengguna menekan tombol SET kembali untuk keluar dari mode pengaturan dan sistem akan menyimpan perubahan serta kembali ke mode tampilan normal.

            3.5  Gambar Rangkaian

             3.6  Program


;===================================================================
; JAM DIGITAL 8051 - EDSIM51
; Program Jam Digital dengan LCD 16x2 – HARI, TANGGAL, JAM
;===================================================================
;--- Register Variables ---
MENIT       EQU 31H              ; Menit (0-59)
JAM         EQU 32H              ; Jam (0-23)
TGL         EQU 33H              ; Tanggal (1-31)
HARI        EQU 36H              ; Hari (0-6)
MODE        EQU 37H              ; Mode (0=Normal, 1=Setting)
FIELD       EQU 38H              ; Field setting (0-3: JAM, MENIT, TGL, HARI)
TEMP_KEY    EQU 40H              ; Temporary storage untuk keypad
INPUT_BUF   EQU 41H              ; Buffer untuk input 2 digit
DIGIT_CNT   EQU 42H              ; Counter digit yang sudah diinput
TICK_CNT    EQU 43H              ; Counter untuk 60 detik (60 tick = 1 menit)

;--- Pin Definitions ---
RS          EQU P2.0             ; LCD Register Select
EN          EQU P2.1             ; LCD Enable
RW          EQU P2.2             ; LCD Read/Write
BTN_SET     EQU P2.3             ; Tombol SET
BTN_NEXT    EQU P2.4             ; Tombol NEXT
LED         EQU P3.0             ; LED Indikator

;==================== INTERRUPT VECTORS ========================
            ORG 0000H
            LJMP MAIN

            ORG 000BH            ; Timer 0 Interrupt
            LJMP TIMER0_ISR
            ORG 0030H
========================= PROGRAM UTAMA ===========================
MAIN:
            ; Inisialisasi variabel waktu
            MOV MENIT, #00H
            MOV JAM, #12
            MOV TGL, #29
            MOV HARI, #05H          ; Jumat
            
            ; Inisialisasi mode
            MOV MODE, #00H          ; Mode normal
            MOV FIELD, #00H         ; Field pertama
            MOV INPUT_BUF, #00H
            MOV DIGIT_CNT, #00H
            MOV TICK_CNT, #00H      ; Counter untuk 60 detik
            
            ; Inisialisasi hardware
            LCALL LCD_INIT
            LCALL TIMER_INIT

;--- Main Loop ---
MAIN_LOOP:
            ; Cek tombol SET
            JB BTN_SET, CHECK_NEXT
            LJMP BTN_SET_PRESSED
            
CHECK_NEXT:
            ; Cek tombol NEXT (hanya di mode setting)
            MOV A, MODE
            CJNE A, #01H, SKIP_NEXT
            JB BTN_NEXT, SKIP_NEXT
            LJMP BTN_NEXT_PRESSED
SKIP_NEXT:
            
            ; Proses keypad jika mode setting
            MOV A, MODE
            CJNE A, #01H, NORMAL_MODE
            
            LCALL SCAN_KEYPAD
            CJNE A, #0FFH, PROCESS_KEYPAD_INPUT

ORMAL_MODE:
            ; Update tampilan dan delay
            LCALL UPDATE_DISPLAY
            LCALL DELAY_100MS
            LJMP MAIN_LOOP

;========== HANDLER INPUT KEYPAD - SUPPORT 2 DIGIT INPUT ===========
PROCESS_KEYPAD_INPUT:
            MOV TEMP_KEY, A         ; Simpan nilai keypad
            LCALL DELAY_DEBOUNCE
            
            ; Tunggu tombol dilepas
WAIT_KEY_UP:
            LCALL SCAN_KEYPAD
            CJNE A, #0FFH, WAIT_KEY_UP
            
            ; Proses input 2 digit
            MOV A, TEMP_KEY
            
            ; Cek apakah digit pertama atau kedua
            MOV R0, DIGIT_CNT
            CJNE R0, #00H, SECOND_DIGIT
            
            ; Digit pertama (puluhan)
            MOV INPUT_BUF, A
            MOV A, #0AH
            MOV B, INPUT_BUF
            MUL AB                  ; A = INPUT_BUF * 10
            MOV INPUT_BUF, A
            INC DIGIT_CNT
            
            ; Update display dengan digit pertama
            LCALL UPDATE_DISPLAY
            LJMP MAIN_LOOP
            
SECOND_DIGIT:
            ; Digit kedua (satuan)
            MOV A, INPUT_BUF
            ADD A, TEMP_KEY         ; A = (digit1 * 10) + digit2
            MOV INPUT_BUF, A
           
            ; Validasi dan simpan ke field yang sesuai
            MOV A, FIELD
            CJNE A, #00H, FIELD_1
            ; JAM (0-23)
            MOV A, INPUT_BUF
            CJNE A, #18H, JAM_OK    ; < 24?
JAM_OK:     JC JAM_STORE
            MOV A, #17H             ; Max 23
JAM_STORE:  MOV JAM, A
            SJMP UPDATE_AFTER_INPUT
            
FIELD_1:    CJNE A, #01H, FIELD_2
            ; MENIT (0-59)
            MOV A, INPUT_BUF
            CJNE A, #3CH, MENIT_OK  ; < 60?
MENIT_OK:   JC MENIT_STORE
            MOV A, #3BH             ; Max 59
MENIT_STORE:MOV MENIT, A
            SJMP UPDATE_AFTER_INPUT
            
FIELD_2:    CJNE A, #02H, FIELD_3
            ; TGL (1-31)
            MOV A, INPUT_BUF
            CJNE A, #00H, TGL_MIN_OK
            MOV A, #01H             ; Min 1
TGL_MIN_OK: CJNE A, #20H, TGL_OK   ; < 32?
TGL_OK:     JC TGL_STORE
            MOV A, #1FH             ; Max 31
TGL_STORE:  MOV TGL, A
            SJMP UPDATE_AFTER_INPUT
            
FIELD_3:    ; HARI (0-6) - single digit
            MOV A, TEMP_KEY
            CJNE A, #07H, HARI_OK
            MOV A, #06H             ; Max 6
HARI_OK:    MOV HARI, A

UPDATE_AFTER_INPUT:
            ; Reset input buffer
           MOV INPUT_BUF, #00H
            MOV DIGIT_CNT, #00H
            
            ; Clear LCD sebelum update display
            MOV A, #01H
            LCALL LCD_CMD
            LCALL DELAY_20MS
            
            LCALL UPDATE_DISPLAY
            LJMP MAIN_LOOP

;======================= HANDLER TOMBOL SET ========================
BTN_SET_PRESSED:
            LCALL DELAY_DEBOUNCE
            
            MOV A, MODE
            CJNE A, #00H, EXIT_SETTING_MODE
            
            ; Masuk mode setting
            MOV MODE, #01H
            MOV FIELD, #00H
            MOV INPUT_BUF, #00H
            MOV DIGIT_CNT, #00H
            SETB LED                ; LED ON
            
            ; Clear LCD saat masuk mode setting
            MOV A, #01H
            LCALL LCD_CMD
            LCALL DELAY_20MS
            SJMP WAIT_SET_RELEASE
            
EXIT_SETTING_MODE:
            ; Keluar mode setting
            MOV MODE, #00H
            MOV INPUT_BUF, #00H
            MOV DIGIT_CNT, #00H
            CLR LED                 ; LED OFF
            
            ; Clear LCD saat keluar mode setting
            MOV A, #01H
            LCALL LCD_CMD
            LCALL DELAY_20MS

WAIT_SET_RELEASE:
            JNB BTN_SET, WAIT_SET_RELEASE
            LJMP MAIN_LOOP

;======================= HANDLER TOMBOL NEXT =======================
BTN_NEXT_PRESSED:
            LCALL DELAY_DEBOUNCE
            
            ; Reset input buffer saat pindah field
            MOV INPUT_BUF, #00H
            MOV DIGIT_CNT, #00H
            
            ; Increment field (0-3, wrap to 0)
            INC FIELD
            MOV A, FIELD
            CJNE A, #04H, NEXT_CONT
            MOV FIELD, #00H

NEXT_CONT:
            ; Clear LCD sebelum tampilkan field baru
            MOV A, #01H
            LCALL LCD_CMD
            LCALL DELAY_20MS

WAIT_NEXT_RELEASE:
            JNB BTN_NEXT, WAIT_NEXT_RELEASE
            LJMP MAIN_LOOP

;======================= DISPLAY - MODE NORMAL =====================
UPDATE_DISPLAY:
            MOV A, MODE
            CJNE A, #00H, DISPLAY_SETTING_MODE
            
            ;--- Baris 1: HARI TGL (CENTER) ---
            MOV A, #80H             ; Set cursor ke baris 1
            LCALL LCD_CMD
            
            ; Padding kiri untuk center (3 spasi untuk "HARI DD")
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            
            LCALL DISPLAY_DAY       ; Tampilkan nama hari
            
            MOV A, #2CH             ; Koma ','
            LCALL LCD_DATA
            
            MOV A, #20H             ; Spasi
            LCALL LCD_DATA
            
            ; Tampilkan tanggal
            MOV A, TGL
            LCALL DISPLAY_2DIGIT
            
            ;--- Baris 2: JAM:MENIT ---
            MOV A, #0C0H            ; Set cursor ke baris 2
            LCALL LCD_CMD
            
            ; Padding spasi (center align)
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            MOV A, #20H
            LCALL LCD_DATA
            
            LCALL DISPLAY_TIME
            RET

;====================== DISPLAY - MODE SETTING =====================
DISPLAY_SETTING_MODE:
            ;--- Baris 1: SET: [FIELD_NAME] ---
            MOV A, #80H
            LCALL LCD_CMD
            
            ; Tampilkan "SET: "
            MOV A, #53H
            LCALL LCD_DATA          ; 'S'
            MOV A, #45H
            LCALL LCD_DATA          ; 'E'
            MOV A, #54H
            LCALL LCD_DATA          ; 'T'
            MOV A, #3AH
            LCALL LCD_DATA          ; ':'
            MOV A, #20H
            LCALL LCD_DATA          ; ' '
            
            ; Tampilkan nama field
            MOV A, FIELD
            CJNE A, #00H, FSET_1
            ; JAM
            MOV A, #4AH
            LCALL LCD_DATA          ; 'J'
            MOV A, #41H
            LCALL LCD_DATA          ; 'A'
            MOV A, #4DH
            LCALL LCD_DATA          ; 'M'
            SJMP SHOW_VALUE
            
FSET_1:     CJNE A, #01H, FSET_2
            ; MENIT
            MOV A, #4DH
            LCALL LCD_DATA          ; 'M'
            MOV A, #45H
            LCALL LCD_DATA          ; 'E'
            MOV A, #4EH
            LCALL LCD_DATA          ; 'N'
            MOV A, #49H
            LCALL LCD_DATA          ; 'I'
            MOV A, #54H
            LCALL LCD_DATA          ; 'T'
            SJMP SHOW_VALUE
            
FSET_2:     CJNE A, #02H, FSET_3
            ; TGL
            MOV A, #54H
            LCALL LCD_DATA          ; 'T'
            MOV A, #47H
            LCALL LCD_DATA          ; 'G'
            MOV A, #4CH
            LCALL LCD_DATA          ; 'L'
            SJMP SHOW_VALUE
            
FSET_3:     ; HARI
            MOV A, #48H
            LCALL LCD_DATA          ; 'H'
            MOV A, #41H
            LCALL LCD_DATA          ; 'A'
            MOV A, #52H
            LCALL LCD_DATA          ; 'R'
            MOV A, #49H
            LCALL LCD_DATA          ; 'I'

            ;--- Baris 2: Nilai: [VALUE] ---
SHOW_VALUE:
            MOV A, #0C0H            ; Set cursor ke baris 2
            LCALL LCD_CMD
            
            ; Tampilkan "Nilai: "
            MOV A, #4EH
            LCALL LCD_DATA          ; 'N'
            MOV A, #69H
            LCALL LCD_DATA          ; 'i'
            MOV A, #6CH
            LCALL LCD_DATA          ; 'l'
            MOV A, #61H
            LCALL LCD_DATA          ; 'a'
            MOV A, #69H
            LCALL LCD_DATA          ; 'i'
            MOV A, #3AH
            LCALL LCD_DATA          ; ':'
            MOV A, #20H
            LCALL LCD_DATA          ; ' '
            
            ; Tampilkan nilai field atau buffer input
            MOV A, DIGIT_CNT
            CJNE A, #00H, SHOW_PARTIAL
            
            ; Tampilkan nilai lengkap
            MOV A, FIELD
            CJNE A, #00H, SVAL_1
            MOV A, JAM
            LCALL DISPLAY_2DIGIT
            LCALL CLEAR_REST_LINE
            RET
            
SVAL_1:     CJNE A, #01H, SVAL_2
            MOV A, MENIT
            LCALL DISPLAY_2DIGIT
            LCALL CLEAR_REST_LINE
            RET
            
SVAL_2:     CJNE A, #02H, SVAL_3
            MOV A, TGL
            LCALL DISPLAY_2DIGIT
            LCALL CLEAR_REST_LINE
            RET
            
SVAL_3:     MOV A, HARI
            ADD A, #30H             ; Convert to ASCII
            LCALL LCD_DATA
            MOV A, #20H             ; Spasi untuk clear
            LCALL LCD_DATA
            LCALL CLEAR_REST_LINE
            RET

SHOW_PARTIAL:
            ; Tampilkan digit pertama yang sudah diinput
            MOV A, INPUT_BUF
            MOV B, #0AH
            DIV AB                  ; A = puluhan
            ADD A, #30H
            LCALL LCD_DATA
            MOV A, #5FH             ; '_' untuk digit kedua
            LCALL LCD_DATA
            LCALL CLEAR_REST_LINE
            RET

;==== CLEAR REST OF LINE - Membersihkan sisa karakter di baris =====
CLEAR_REST_LINE:
            MOV R3, #6              ; Clear 6 karakter sisa
CLR_LOOP:   MOV A, #20H             ; Spasi
            LCALL LCD_DATA
            DJNZ R3, CLR_LOOP
            RET

;======================== DISPLAY HELPER ===========================
DISPLAY_DAY:
            MOV A, HARI
            CJNE A, #00H, DAY_1
            MOV DPTR, #TXT_MINGGU
            MOV R0, #06H            ; MINGGU = 6 huruf
            SJMP PUT_DAY_CHARS
            
DAY_1:      CJNE A, #01H, DAY_2
            MOV DPTR, #TXT_SENIN
            MOV R0, #05H            ; SENIN = 5 huruf
            SJMP PUT_DAY_CHARS
            
DAY_2:      CJNE A, #02H, DAY_3
            MOV DPTR, #TXT_SELASA
            MOV R0, #06H            ; SELASA = 6 huruf
            SJMP PUT_DAY_CHARS
            
DAY_3:      CJNE A, #03H, DAY_4
            MOV DPTR, #TXT_RABU
            MOV R0, #04H            ; RABU = 4 huruf
            SJMP PUT_DAY_CHARS
           
DAY_4:      CJNE A, #04H, DAY_5
            MOV DPTR, #TXT_KAMIS
            MOV R0, #05H            ; KAMIS = 5 huruf
            SJMP PUT_DAY_CHARS
            
DAY_5:      CJNE A, #05H, DAY_6
            MOV DPTR, #TXT_JUMAT
            MOV R0, #05H            ; JUMAT = 5 huruf
            SJMP PUT_DAY_CHARS
            
DAY_6:      MOV DPTR, #TXT_SABTU
            MOV R0, #05H            ; SABTU = 5 huruf

PUT_DAY_CHARS:
            CLR A
            MOVC A, @A+DPTR
            LCALL LCD_DATA
            INC DPTR
            DJNZ R0, PUT_DAY_CHARS
            RET

;--- String Table ---
TXT_MINGGU: DB "MINGGU"
TXT_SENIN:  DB "SENIN"
TXT_SELASA: DB "SELASA"
TXT_RABU:   DB "RABU"
TXT_KAMIS:  DB "KAMIS"
TXT_JUMAT:  DB "JUMAT"
TXT_SABTU:  DB "SABTU"

;===================== DISPLAY HELPER – WAKTU ======================
DISPLAY_TIME:
            ; Tampilkan jam
            MOV A, JAM
            LCALL DISPLAY_2DIGIT
            
            MOV A, #3AH             ; ':'
            LCALL LCD_DATA
            
           ; Tampilkan menit
            MOV A, MENIT
            LCALL DISPLAY_2DIGIT
            RET

;================= DISPLAY HELPER - 2 DIGIT DECIMAL ================
DISPLAY_2DIGIT:
            MOV B, #0AH
            DIV AB                  ; A = A/10, B = A%10
            PUSH B
            ADD A, #30H             ; Convert to ASCII
            LCALL LCD_DATA
            POP ACC
            ADD A, #30H             ; Convert to ASCII
            LCALL LCD_DATA
            RET

;================ TIMER 0 INTERRUPT SERVICE ROUTINE ================
TIMER0_ISR:
            PUSH ACC
            PUSH PSW
            PUSH B                  ; Save B register
            
            ; Reload timer untuk ~1 detik
            MOV TH0, #3CH
            MOV TL0, #0B0H
            
            ; Increment tick counter (20 ticks = 1 detik)
            INC TICK_CNT
            MOV A, TICK_CNT
            CJNE A, #14H, NOT_SECOND  ; Belum 1 detik
            LJMP ONE_SECOND           ; Sudah 1 detik
            
NOT_SECOND:
            LJMP TIMER_END            ; Skip semua, keluar ISR
            
ONE_SECOND:
            ; Sudah 1 detik, reset tick counter
            MOV TICK_CNT, #00H
            
            ; Increment menit
            INC MENIT
            MOV A, MENIT
            CJNE A, #3CH, NOT_HOUR    ; Belum 60 menit
            LJMP ONE_HOUR             ; Sudah 60 menit
            
NOT_HOUR:
            LJMP TIMER_END            ; Skip, keluar ISR
            
ONE_HOUR:
            ; Reset menit, increment jam
            MOV MENIT, #00H
            INC JAM
            MOV A, JAM
            CJNE A, #18H, NOT_DAY     ; Belum 24 jam
            LJMP ONE_DAY              ; Sudah 24 jam
            
NOT_DAY:
            LJMP TIMER_END            ; Skip, keluar ISR
            
ONE_DAY:
            ; Reset jam, increment tanggal dan hari
            MOV JAM, #00H
            
            ; Increment hari (0-6, wrap to 0)
            INC HARI
            MOV A, HARI
            CJNE A, #07H, CHECK_DATE
            MOV HARI, #00H
            
CHECK_DATE:
            ; Increment tanggal (simplified: wrap at 31)
            INC TGL
            MOV A, TGL
            CJNE A, #20H, DATE_OK   ; < 32?
            MOV TGL, #01H           ; Reset ke 1
            
DATE_OK:
            CPL LED                 ; Toggle LED setiap ganti hari

IMER_END:
            POP B
            POP PSW
            POP ACC
            RETI

;==================== TIMER 0 INITIALIZATION =======================
TIMER_INIT:
            MOV TMOD, #01H          ; Timer 0, Mode 1 (16-bit)
            MOV TH0, #3CH           ; Initial value
            MOV TL0, #0B0H
            SETB ET0                ; Enable Timer 0 interrupt
            SETB EA                 ; Enable global interrupt
            SETB TR0                ; Start Timer 0
            RET

;===================================================================
; KEYPAD SCAN - Keypad 3x4 (12 tombol) EdSim51
; P0.0-P0.3 = Rows (output, aktif LOW)
; P0.4-P0.6 = Columns (input dengan pull-up)
;===================================================================
SCAN_KEYPAD:
            ; Scan Row 0 (P0.0)
            MOV P0, #0FEH           ; Row 0 low: 11111110B
            LCALL DELAY_SCAN
            MOV A, P0
            ANL A, #70H             ; Mask columns: 01110000B
            CJNE A, #70H, KEY_ROW0
            
            ; Scan Row 1 (P0.1)
            MOV P0, #0FDH           ; Row 1 low: 11111101B
            LCALL DELAY_SCAN
            MOV A, P0
            ANL A, #70H
            CJNE A, #70H, KEY_ROW1
            
            ; Scan Row 2 (P0.2)
            MOV P0, #0FBH           ; Row 2 low: 11111011B
            LCALL DELAY_SCAN
            MOV A, P0
            ANL A, #70H
            CJNE A, #70H, KEY_ROW2
            
            ; Scan Row 3 (P0.3)
            MOV P0, #0F7H           ; Row 3 low: 11110111B
            LCALL DELAY_SCAN
            MOV A, P0
            ANL A, #70H
            CJNE A, #70H, KEY_ROW3
            
            ; No key pressed - reset P0
            MOV P0, #0FFH
            MOV A, #0FFH
            RET

KEY_ROW0:   ; Row 0: keys 1,2,3
            MOV P0, #0FFH           ; Reset P0
            CJNE A, #60H, KR0_1     ; P0.4=0: 01100000B
            MOV A, #01H             ; Key 1
            RET
KR0_1:      CJNE A, #50H, KR0_2     ; P0.5=0: 01010000B
            MOV A, #02H             ; Key 2
            RET
KR0_2:      MOV A, #03H             ; Key 3 (P0.6=0: 00110000B)
            RET

KEY_ROW1:   ; Row 1: keys 4,5,6
            MOV P0, #0FFH           ; Reset P0
            CJNE A, #60H, KR1_1
            MOV A, #04H             ; Key 4
            RET
KR1_1:      CJNE A, #50H, KR1_2
            MOV A, #05H             ; Key 5
            RET
KR1_2:      MOV A, #06H             ; Key 6
            RET

KEY_ROW2:   ; Row 2: keys 7,8,9
            MOV P0, #0FFH           ; Reset P0
            CJNE A, #60H, KR2_1
            MOV A, #07H             ; Key 7
            RET
KR2_1:      CJNE A, #50H, KR2_2
            MOV A, #08H             ; Key 8
            RET
KR2_2:      MOV A, #09H             ; Key 9
            RET

KEY_ROW3:   ; Row 3: keys *,0,#
            MOV P0, #0FFH           ; Reset P0
            CJNE A, #60H, KR3_1
            MOV A, #0FFH            ; Key * (ignore)
            RET
KR3_1:      CJNE A, #50H, KR3_2
            MOV A, #00H             ; Key 0
            RET
KR3_2:      MOV A, #0FFH            ; Key # (ignore)
            RET

DELAY_SCAN:
            MOV R7, #10
DSCAN:      DJNZ R7, DSCAN
            RET

;========================= LCD ROUTINES ============================
LCD_INIT:
            LCALL DELAY_20MS
            MOV A, #38H             ; 8-bit, 2 lines, 5x7 font
            LCALL LCD_CMD
            MOV A, #0CH             ; Display ON, cursor OFF
            LCALL LCD_CMD
            MOV A, #01H             ; Clear display
            LCALL LCD_CMD
            MOV A, #06H             ; Entry mode: increment, no shift
            LCALL LCD_CMD
            RET

LCD_CMD:
            MOV P1, A
           CLR RS                  ; Command mode
            CLR RW                  ; Write mode
            SETB EN
            LCALL DELAY_1MS
            CLR EN
            LCALL DELAY_1MS
            RET

LCD_DATA:
            MOV P1, A
            SETB RS                 ; Data mode
            CLR RW                  ; Write mode
            SETB EN
            LCALL DELAY_1MS
            CLR EN
            LCALL DELAY_1MS
            RET

;========================= DELAY ROUTINES ==========================
DELAY_1MS:
            MOV R6, #250
D1MS_LOOP:  DJNZ R6, D1MS_LOOP
            RET

DELAY_20MS:
            MOV R5, #20
D20MS_LOOP: LCALL DELAY_1MS
            DJNZ R5, D20MS_LOOP
            RET

DELAY_100MS:
            MOV R4, #5
D100MS_LOOP:LCALL DELAY_20MS
            DJNZ R4, D100MS_LOOP
            RET

DELAY_DEBOUNCE:
            MOV R5, #20
DDEB_LOOP:  LCALL DELAY_1MS
            DJNZ R5, DDEB_LOOP
            RET


BAB IV
HASIL DAN PEMBAHASAN

4.1  Latar Belakang

Setelah dilakukan perancangan rangkaian dan pembuatan program, sistem Jam Digital berbasis mikrokontroler ATmega8051 berhasil dijalankan dan diuji melalui simulasi menggunakan Proteus ISIS. Hasil simulasi menunjukkan bahwa sistem dapat bekerja sesuai dengan perencanaan awal, mulai dari proses penampilan waktu hingga pengaturan waktu menggunakan keypad dan tombol kontrol.

Pada saat sistem pertama kali diaktifkan, LCD menampilkan "Jumat, 29" pada baris pertama dan "12:00" pada baris kedua sebagai tampilan awal. Sistem langsung mulai menghitung waktu secara otomatis menggunakan timer internal mikrokontroler. Tampilan LCD diperbarui setiap menit untuk menunjukkan waktu yang berjalan secara real-time.

            4.2  Pengujian Mode Normal dan Tampilan Waktu

Pada mode normal, sistem menampilkan informasi waktu secara kontinyu tanpa adanya gangguan. Berdasarkan hasil pengujian, LCD 16×2 dapat menampilkan karakter dengan jelas dan terstruktur pada kedua barisnya.

Sistem menggunakan interrupt timer untuk menghitung detik, menit, dan jam. Hasil pengujian menunjukkan bahwa perhitungan waktu berjalan dengan cukup akurat. Ketika menit mencapai 60, sistem otomatis menambahkan jam, dan ketika jam mencapai 23:59, sistem akan mengganti hari dan menambahkan tanggal, kemudian mereset jam kembali ke 00:00. Sistem membatasi maksimal tanggal hingga 31, sehingga setelah tanggal 31, sistem akan kembali ke tanggal 1 dan mengganti hari secara otomatis.

           4.3  Pengujian Mode Seting

Sistem dilengkapi dengan 2 tombol khusus yaitu tombol SET dan NEXT ntuk masuk ke mode setting dan berpindah setting. Berdasarkan hasil pengujian, ketika tombol SET ditekan, LCD menampilkan indikator bahwa sistem berada dalam mode pengaturan.

Tombol NEXT berfungsi untuk berpindah antar field yang akan diubah. Setiap kali tombol NEXT ditekan, fokus berpindah dari hari ke tanggal, dari tanggal ke jam, dan dari jam ke menit secara berurutan. Field yang sedang aktif ditandai dengan kursor atau karakter yang berkedip, sehingga pengguna dapat mengetahui bagian mana yang sedang dipilih.

           4.4  Pengujian Fungsi Keypad

Keypad digunakan untuk memasukkan nilai baru pada field yang sedang dipilih dalam mode setting. Pengujian dilakukan dengan menekan tombol-tombol angka pada keypad untuk mengubah nilai hari, tanggal, jam, dan menit. Berdasarkan hasil pengujian, metode scanning baris dan kolom dapat mendeteksi penekanan tombol dengan baik.

Setiap angka yang dimasukkan langsung ditampilkan pada posisi field yang aktif di LCD. Sistem juga mampu melakukan validasi input, misalnya membatasi jam maksimal 23, menit maksimal 59, dan tanggal sesuai jumlah hari pada bulan yang bersangkutan. Hal ini mencegah pengguna memasukkan nilai yang tidak valid dan memastikan sistem tetap berjalan dengan benar.

           4.5 Pembahasan Hasil Pengujian

Berdasarkan keseluruhan hasil pengujian, dapat disimpulkan bahwa sistem Jam Digital ini telah bekerja dengan cukup baik. Integrasi antara perangkat keras dan perangkat lunak berjalan sesuai dengan perancangan. Mikrokontroler ATmega8051 mampu menjalankan fungsi perhitungan waktu, membaca input dari keypad dan tombol, serta menampilkan informasi pada LCD dengan baik.

Meskipun sistem sudah berfungsi dengan baik, masih terdapat beberapa keterbatasan, seperti akurasi waktu yang tergantung pada kestabilan kristal oscilator dan belum adanya fitur tambahan seperti alarm atau penyimpanan waktu saat mati listrik. Namun secara keseluruhan, sistem ini sudah memenuhi tujuan sebagai contoh penerapan jam digital sederhana berbasis mikrokontroler.

4.6  Dokumentasi Hasil Pengujian




BAB V
KESIMPULAN

Berdasarkan hasil perancangan, implementasi, dan pengujian yang telah dilakukan, dapat disimpulkan bahwa sistem Jam Digital berbasis mikrokontroler ATmega8051 telah berhasil dibuat dan berfungsi dengan baik sesuai rancangan awal. Sistem mampu menampilkan informasi waktu berupa hari, tanggal, jam, dan menit pada LCD 16×2 dengan format yang jelas dan mudah dibaca. Perhitungan waktu menggunakan timer internal mikrokontroler bekerja dengan cukup akurat, dan sistem dapat melakukan pergantian hari secara otomatis setelah melewati jam 23:59 dengan batasan tanggal maksimal hingga 31.

Fitur pengaturan waktu melalui dua tombol kontrol dan keypad 4×4 berfungsi dengan baik, memungkinkan pengguna untuk masuk ke mode setting, berpindah antar field yang ingin diubah, dan memasukkan nilai waktu baru dengan mudah. Integrasi antara perangkat keras dan perangkat lunak berjalan sesuai perencanaan, meskipun masih terdapat keterbatasan seperti akurasi waktu jangka panjang yang bergantung pada kristal oscilator dan belum adanya fitur tambahan seperti alarm. Secara keseluruhan, sistem jam digital ini telah memenuhi tujuan praktikum sebagai contoh implementasi sistem pewaktuan sederhana berbasis mikrokontroler.


LAMPIRAN

 I.          REFERENSI

1.     Universitas Negeri Semarang. (2015). Belajar mikrokontroler Atmel AT89C51. http://lib.unnes.ac.id/29055/1/01_BELAJAR_MIKROKONTROLER_ATMEL_AT89C51.pdf

2.     Delta Electronic Articles. (2017). Teori Dasar LCD 16×2.

https://delta-electronic.com/article/2017/10/teori-dasar-lcd-16x2-karakter-m1632/

3.     Repository Universitas Medan Area (UMA).
https://repositori.uma.ac.id/bitstream/123456789/1141/5/098120024_file5.pdf

4.     8051 Assembly Code Demo for HD47780 LCD Display

https://www.hackster.io/patrick-fitzgerald2/8051-assembly-code-demo-for-hd47780-lcd-display-43698c

 

II.          PPT

https://www.canva.com/design/DAG6LGtAh-o/CNmFKsUCXk1uuyaG6JIqtQ/edit?utm_content=DAG6LGtAh-o&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton

 

III.          VIDEO PRESENTASI

https://youtu.be/LgRW3Y5lXIQ?si=4m2MAFtZcPShpumT


Komentar

Postingan populer dari blog ini

AIR TEMPERATURE SWITCHING AND MONITORING SYSTEM DENGAN MENGGUNAKAN SENSOR LM35 BERBASIS ATMEGA 16

RANCANG BANGUN KALKULATOR DIGITAL OPERASI KALI DAN BAGI BERBASIS MIKROKONTROLER AT89C51

SISTEM LAMPU LALU LINTAS PERTIGAAN BERBASIS AT89s51 DENGAN SENSOR INFRAMERAH