
Program Assembly Membaca Keypad, Input Data ke RAM dan Menampilkan ke 7 Segment
;- BAB3_16.ASM -------------------------------------------------------------------
;
; Program Untuk Membaca Keypad Dan Memasukkan Data Ke RAM dan
; Menampilkan Isi RAM Tersebut Ke Display 7 Segment
;
; --------------------------------------------------------------------------------
DATA_INP EQU 35H
KOLOM EQU 30H
DATA_5 EQU 31H
PER_BARIS EQU 32H
BAN_P3 EQU 33H
COMMON EQU 34H
KEYPRESS EQU 36H
BOUNC EQU 37H
;
ORG 0H
;
LCALL CLEAR_BUFFER ; lakukan pembersihan buffer terlebih dahulu
MULAI:
MOV A,KEYPRESS ; Lihat Apakah Ada Tombol Ditekan
CJNE A,#0,LOMPAT ; Bila Ada, Loncat Ke Label LOMPAT
LCALL SCAN_TOMBOL ; Lakukan pengecekan tombol (SCAN_TOMBOL)
LCALL DISPLAY ; Tampilkan ke 7-segment
SJMP MULAI
LOMPAT:
MOV BOUNC,#0Fh ; Cek Apakah Tombol Betul-Betul
LOMPAT1: ; Ditekan / Untuk Menghindari
LCALL DISPLAY ; Bouncing Diulang Sampai 5x
MOV P2,COMMON
MOV A,P3
CJNE A,#0FFH,LOMPAT
DJNZ BOUNC,LOMPAT1
MOV KEYPRESS,#0 ; Buat Keypress = 0 Bila Tombol dilepas
SJMP MULAI ; Ulangi lagi dari awal
; --------------------------------------------------------------------------------
;
; Subrutin SCAN_TOMBOL, untuk melakukan pengecekan tombol di P3
;
; --------------------------------------------------------------------------------
SCAN_TOMBOL:
MOV KOLOM,#4 ; Jumlah kolom Tombol Matrik (4 kolom)
MOV COMMON,#0FEH ; Data awal scan Untuk Port 2 (1111 1110)
MOV DPTR,#ANGKA ; DPTR menunjuk pada ANGKA
MOV DATA_5,#0 ; Untuk Hitungan Data baris awal
ULANG:
MOV BAN_P3,#7FH ; Data awal Pembanding masukan P3 (0111 1111)
MOV PER_BARIS,#0 ; Hitungan Data Baris per kolom
ULANG1:
MOV P2,COMMON ; data scan dikirimkan ke P2
MOV A,P3 ; baca status tombol-tombol di P3 ke akumulator
CJNE A,BAN_P3,GESER1 ; Apakah ada tombol yang ditekan?
MOV A,PER_BARIS ; ADA! Lakukan penjumlahan antara data baris
ADD A,DATA_5 ; per kolom yg dicek dengan data baris
MOVC A,@A+DPTR ; sehingga menunjuk pada data
MOV DATA_INP,A ; yang akan ditampilkan ke 7-segmen
MOV KEYPRESS,#1 ; Ubah status KEYPRESS (Ada Tombol Ditekan)
LCALL ISI_BUFFER ; Isi Data tampilan Ke Buffer
RET
GESER1:
INC PER_BARIS ; TIDAK ADA! Naikkan jumlah baris yang telah dicek
MOV A,BAN_P3 ; Data scan digeser ke kanan
RR A ; per bit
MOV BAN_P3,A ; melalui akumulator
MOV A,PER_BARIS ; Periksa melalui akumulator
CJNE A,#5,ULANG1 ; apakah sudah 5 baris dicek?
; BELUM! ulangi lagi (ULANG1)
NEXTSCAN:
MOV A,DATA_5 ; SUDAH! siapkan untuk kolom berikutnya
ADD A,#5 ; atur hitungan data baris
MOV DATA_5,A ; dengan hitungan sebelumnya + 5
MOV A,COMMON ; siapkan data scan untuk kolom
RL A ; berikutnya dengan merotasi kekiri
MOV COMMON,A ; per bit melalui akumulator
DJNZ KOLOM,ULANG ; apakah semua kolom sudah discan?
; BELUM! ulangi untuk kolom berikutnya
MOV P2,#0FFH ; SUDAH! matikan tampilan 7-segmen
RET
; --------------------------------------------------------------------------------
;
; subrutin ISI_BUFFER untuk mengisi data tombol ke buffer
;
; --------------------------------------------------------------------------------
ISI_BUFFER:
MOV A,DATA_INP
CJNE A,#60H,BUFFER1 ; Apakah ditekan tombol 'A'
MOV A,77H ; YA! Buat tampilan '.'
ANL A,#0DFH ; melalui memori lokasi 77h
MOV 77H,A ; dan akumulator
RET
BUFFER1:
CJNE A,#0c0H,BUFFER2 ; TIDAK! Apakah tombol C (=Clear)
LCALL CLEAR_BUFFER ; YA! Bersihkan buffer
RET
BUFFER2:
MOV A,KEYPRESS ; TIDAK! Apakah
CJNE A,#1,NOPRESS ; Tombol Ditekan?
MOV R2,#7 ; YA! Lakukan inisialisasi
MOV R1,#70H ; R0, R1 dan R2
MOV R0,#71H
ISI_LAGI:
MOV A,@R0 ; Salin isi memori 71h ke
MOV @R1,A ; ke 70h
INC R0 ; naikkan isi R0
INC R1 ; naikkan isi R1
DJNZ R2,ISI_LAGI ; Sudah 7 lokasi?
; BELUM! ulangi lagi (ISI_LAGI)
MOV A,DATA_INP ; SUDAH! simpan data masukan
MOV 77H,A ; ke lokasi 77h
NOPRESS: ; TIDAK! kembali dari subrutin
RET
; --------------------------------------------------------------------------------
;
; SUBRUTIN UNTUK MENAMPILKAN DATA DARI BUFFER
;
; --------------------------------------------------------------------------------
DISPLAY:
MOV 7BH,#08H ; R6 = 8 =Jumlah Digit 7 Segment
MOV R1,#70H ; R0 = Alamat Buffer Display
MOV 78H,#0FEH ; 78h = Comm
ULANG2:
MOV A,@R1 ;
MOV P0,A ; Keluarkan Data A Ke Mulai
INC R1
MOV A,78H ; Pindahkan Data Ram Alamat Mulai Ke A
MOV P2,A ; Keluarkan Data A Ke Port 2
RL A
MOV 78H,A
LCALL DELAY ; Mulai
MOV P0,#0FFH
MOV P2,#0FFH
DJNZ 7BH,ULANG2 ; Ulangi S/D 8 Kali (Jml Digit 7 Segmen)
RET
; --------------------------------------------------------------------------------
;
; subrutin DELAY untuk tundaan
;
; --------------------------------------------------------------------------------
DELAY: MOV 79H,#090H ;Isi Ram Alamat Mulai Dengan 0
DJNZ 79H,$
RET ;Kembali Ke Langkah Setelah Perintah
; ;Acall
; --------------------------------------------------------------------------------
;
; subrutin CLEAR_BUFFER untuk membersihkan buffer
;
; --------------------------------------------------------------------------------
CLEAR_BUFFER: ; Subrutin Untuk Menghapus
MOV 78H,#8 ; Buffer
MOV R0,#70H
CLEAR1:
MOV @R0,#0FFH
INC R0
DJNZ 78H,CLEAR1
RET
;
ANGKA: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0A8H
DB 28H,29H,71H,0BAH,0E8H,21H,20H,67H,0E0H
END
Semoga bermanfaat & selamat belajar!