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, 2dzaky.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
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
RETBAB 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
III.
VIDEO
PRESENTASI
https://youtu.be/LgRW3Y5lXIQ?si=4m2MAFtZcPShpumT
Komentar
Posting Komentar