;********* ; TEMPLATE PEMBUATAN PROGRAM DST-52 DENGAN ALDS untuk BIOS versi 2.7 ; .DATA Org 60H JARAK DS 1 ;RAM Internal yang digunakan DST-52 ;30H - 38H digunakan oleh Program Monitor DDT-52 namun tetap dapat digunakan ;pada program aplikasi anda. ;39H digunakan oleh variabel delay, bebas digunakan bila rutin2 delay tidak ;dipanggil ;3AH dan 3BH digunakan oleh variabel Serial EEPROM, bebas digunakan bila rutin2 ;Serial EEPROM tidak dipanggil ;3CH - 4CH digunakan oleh Program Monitor DDT-52 namun tetap bebas anda gunakan ;selama proses trace dan breakpoint tidak dilakukan ;4DH - 4EH digunakan oleh LCD Grafik, namun bebas digunakan selama rutin-rutin ;LCD Grafik tidak dipanggil ;50H - 5FH digunakan oleh Program Monitor DDT-52 namun tetap dapat digunakan ;pada program aplikasi anda .CODE Hex_ASCII2 EQU 002EH ;Konversi Hexa ke 2 byte ASCII ;- Akumulator diisi bilangan hexa yang akan dikonversi ;Hasil: ;- Akumulator menyimpan nibble atas ;- Register B menyimpan nibble bawah Hex_ASCII1 EQU 003AH ;Konversi Hexa ke 1 byte ASCII ;- Akumulator diisi bilangan hexa yang akan dikonversi ;Hasil: ;- Akumulator menyimpan nibble bawah ASCII_HEX EQU 0047H ;Konversi 2 byte ASCII ke hexa ;- Akumulator diisi nibble atas ;- Register B diisi nibble bawah ;Hasil: ;- Akumulator menyimpan hasil konversi Dec_DPTR EQU 0064H ;Mengurangi isi dari Register DPTR Capitalize EQU 0070H ;Mengubah semua jenis huruf kecil menjadi huruf besar SPACE_CODE EQU 0082H ;Mengirim kode spasi ke port serial Writeext_Memory EQU 008BH ;Menulis data ke memori EEPROM ;- Akumulator berisi data yang akan ditulis ;- DPTR berisi alamat dari data yang akan ditulis Delay_1detik EQU 0090H ;Menunda waktu selama 1 detik (timer 0 digunakan) Delay_500mS EQU 0099H ;Menunda waktu selama 500 mS (timer 0 digunakan) Delay_100mS EQU 00A2H ;Menunda waktu selama 100 mS (timer 0 digunakan) Delay_75mS EQU 00ABH ;Menunda waktu selama 75 mS (timer 0 digunakan) Delay_5mS EQU 00B4H ;Menunda waktu selama 5 mS (timer 0 digunakan) ASCII_Out EQU 00CBH ;Mengirim data ke port serial dalam 2 byte ASCII ;- Akumulator diisi dengan data yang akan dikirim Out_DPTR EQU 00D4H ;Mengirim nilai DPTR dalam bentuk 4 byte ASCII ke port serial Enter_Code EQU 00DFH ;Mengirim kode ke port serial Init_Serial EQU 00ECH ;Inisialisasi Port Serial 9600 bps Serial_Out EQU 00FCH ;Kirim nilai akumulator ke port serial Serial_In EQU 010EH ;Ambil data dari port serial dan simpan di akumulator KirimPesan_Serial EQU 0116H ;Kirim data di alamat yang ditunjuk oleh DPTR hingga data 0F ;- DPTR diisi dengan alamat dari data yang akan dikirim ;- Memori yang diakses adalah memori CODE/PROGRAM Filter EQU 0122H ;Menentukan besaran data apakah berada di dalam atau di luar nilai setpoint ;- R7 diisi nilai max ;- R6 diisi nilai min ;- besaran data di akumulator ;Hasil: ;- Carry flag akan set bila besaran berada di luar nilai setpoint ;=================== ; SERIAL EEPROM ;=================== Tulis_SEE16b EQU 01A0H ;Menulis data ke Serial EEPROM 16 bit ;- R7 diisi Device Address ;- Register B diisi Word Address 1 ;- R6 diisi Word Address 2 ;- Variabel DataSEE diisi data yang akan ditulis Tulis_SEE8b EQU 01B7H ;Menulis data ke Serial EEPROM 8 bit ;- R7 diisi Device Address ;- Register B diisi Word Address 1 ;- Variabel DataSEE diisi data yang akan ditulis Baca_SEE16b EQU 01CEH ;Membaca data ke Serial EEPROM 16 bit ;- R7 diisi Device Address ;- Register B diisi Word Address 1 ;- Akumulator berisi data yang telah dibaca Baca_SEE8b EQU 01E5H ;Membaca data ke Serial EEPROM 8 bit ;- R7 diisi Device Address ;- Register B diisi Word Address 1 ;- Akumulator berisi data yang telah dibaca DPTRSEE8bit EQU 02E3H ;Membaca data dari Serial EEPROM 8 bit ;- DPTR sebagai pointer ;- Akumulator berisi data yang telah dibaca DPTRSEE16bit EQU 02E8H ;Membaca data dari Serial EEPROM 16 bit ;- DPTR sebagai pointer ;- Akumulator berisi data yang telah dibaca PageSEE8bWrite EQU 027CH ;Menulis data ke Serial EEPROM 8 bit secara page mode (Flag F0 digunakan) ;- R7 diisi Device Address ;- Register B diisi Word Address 1 ;- Akumulator diisi data yang akan ditulis PageSEE16bWrite EQU 0285H ;Menulis data ke Serial EEPROM 16 bit secara page mode (Flag F0 digunakan) ;- R7 diisi Device Address ;- Register B diisi Word Address 1 ;- Akumulator diisi data yang akan ditulis TulisDPTRSEE8b EQU 02F2H ;Menulis data ke Serial EEPROM dengan menggunakan DPTR sebagai pointer ;- DPTR diisi alamat yang akan ditulis ;- Variabel DataSEE diisi data yang akan ditulis TulisDPTRSEE16b EQU 02F7H ;Menulis data ke Serial EEPROM dengan menggunakan DPTR sebagai pointer ;- DPTR diisi alamat yang akan ditulis ;- Variabel DataSEE diisi data yang akan ditulis DataSEE EQU 3AH Perbandingan16bit EQU 0396H ;Membandingkan data 16 bit ; DPTR = PTR, A = 0 ; DPTR < PTR, C = 1 ; DPTR > PTR, C = 0 ;Untuk Built In Routine ; PTR+1 = 3EH ; PTR = 3FH ;============= ;HD44780 ;============= GeserDisplay_Kanan EQU 05BDH ;Menggeser tampilan LCD HD44780 ke kanan GeserDisplay_Kiri EQU 05C4H ;Menggeser tampilan LCD HD44780 ke kiri Posisi_Awal EQU 05CBH ;Mengatur posisi cursor LCD ke posisi awal GeserCursor_Kiri EQU 05D2H ;Menggeser Cursor LCD ke kiri GeserCursor_Kanan EQU 05D9H ;Menggeser Cursor LCD ke kanan KirimPesan_LCD EQU 05E0H ;Mengirim data di alamat yang ditunjuk oleh DPTR ke LCD hingga data 0F ;- DPTR diisi dengan alamat awal data yang dikirim ;- Akhir data adalah 0FH Init_LCD EQU 05ECH ;Inisialisasi LCD Kirim_Perintah EQU 062BH ;Mengirim data ke register perintah LCD ;- Data diisi di akumulator Kirim_Karakter EQU 064AH ;Mengirim data ke register data LCD ;- Data diisi di akumulator Baris2 EQU 0654H ;Memindah posisi cursor ke baris 2 ;========== LCD GRAFIK ========= InitLCDGRP EQU 0678H ;Inisialisasi LCD Grafik SetTextHome EQU 06B7H ;Mengatur posisi awal teks ;- Akumulator diisi nibble tinggi alamat memori text ;- Register B diisi nibble rendah alamat memori text SetGrafikHome EQU 06BDH ;Mengatur posisi awal tampilan grafik ;- Akumulator diisi nibble tinggi alamat memori grafik ;- Register B diisi nibble rendah alamat memori grafik SetGrafikArea EQU 06C3H ;Mengatur area tampilan Grafik ;- Akumulator diisi baris dari LCD grafik ;- Register B diisi kolom dari LCD Grafik SetTextArea EQU 06C9H ;Mengatur area tampilan Text ;- Akumulator diisi jumlah baris text ;- Register B diisi jumlah kolom text TextON EQU 06DBH ;Mengaktifkan tampilan teks GrafikON EQU 06E4H ;Mengaktifkan tampilan grafik CursorONBlinkON EQU 06EDH ;Mengaktifkan Cursor dan blinking CursorONBlinkOFF EQU 0710H ;Mengaktifkan cursor dan no blink TextOFF EQU 071AH ;Menonaktifkan teks GrafikOFF EQU 0724H ;Menonaktifkan grafik TulisDataLCD EQU 072EH ;Menulis data ke memori LCD grafik ;- Register B diisi nibble tinggi dari alamat memori LCD ;- Akumulator diisi nibble rendah dari alamat memori LCD ;- Panggil subroutine SetPointerAlamat ;- R7 diisi data yang akan ditulis BacaDataLCD EQU 0742H ;Membaca data dari memori LCD Grafik ;- Register B diisi nibble tinggi dari alamat memori LCD ;- Akumulator diisi nibble rendah dari alamat memori LCD ;- Panggil subroutine SetPointerAlamat KirimPerintah EQU 0752H ;Mengirim data ke register perintah dari LCD Grafik ;==== DATA-DATA PERINTAH ====== TXHOME EQU 40H TXAREA EQU 41H GRHOME EQU 42H GRAREA EQU 43H SETCURSOR EQU 21H OFFSET EQU 22H ADPSET EQU 24H AWRON EQU 0B0H AWROFF EQU 0B2H ARON EQU 0B1H AROFF EQU AWROFF TungguStatus1 EQU 077AH ;Menunggu status penulisan data ke LCD grafik selesai TungguStatusAWR EQU 0790H ;Menunggu status penulisan data secara otomatis ke LCD Grafik selesai TungguStatusAR EQU 07A6H ;Menunggu status membaca data secara otomatis ke LCD Grafik selesai SetPolaCursor EQU 07BCH ;Mengatur pola cursor LCD Cursor1Line EQU 0A0H Cursor2Line EQU 0A1H Cursor3Line EQU 0A2H Cursor4Line EQU 0A3H Cursor5Line EQU 0A5H Cursor6Line EQU 0A6H Cursor7Line EQU 0A7H SetPosisiCursor EQU 07C6H ;Mengatur posisi cursor LCD ;- Register B diisi baris ;- Akumulator diisi kolom SetPointerAlamat EQU 07CFH ;- Register B diisi alamat nibble tinggi ;- Akumulator diisi alamat nibble rendah HapusMemori EQU 07D8H ;Menghapus memori teks dan memori grafik CommandKarakter EQU 41H ; Konstanta Command Karakter di RAM Internal alamat 4FH KirimKarakterLCD EQU 80AH ;Mengirim karakter ke LCD Grafik ;- R7 diisi data karakter ;- Akumulator diisi alamat nibble tinggi ;- Register B diisi alamat nibble rendah ;- Panggil subroutine set pointer alamat ;- Tulis CommandKarakter dengan data TulisADPplus EQU 0C0H BacaADPplus EQU 0C1H TulisADPminus EQU 0C2H BacaADPminus EQU 0C3H TulisADP EQU 0C4H BacaADP EQU 0C5H CMDP EQU 8200H DP EQU 8000H KirimPesanLCD EQU 0817H ;Mengirim data di alamat yang ditunjuk oleh DPTR ke LCD hingga data 0F ;- DPTR diisi dengan alamat awal data yang dikirim ;- Akhir data adalah 0FH ;- Data di memori data (sinyal RD) BacaMemoriLCD EQU 0831H ;Membaca data dari memori LCD dengan DPTR sebagai pointer ;- DPTR sebagai pointer alamat ;- Data yang dibaca disimpan di akumulator TulisMemoriLCD EQU 084BH ;Menulis data dari memori LCD dengan DPTR sebagai pointer ;- DPTR sebagai pointer alamat ;- Akumulator sebagai data yang akan ditulis AmbilScanCode EQU 865H InitKeyboard EQU 8C4H capslockLED EQU 8DDH SWIINT EQU 0EBCH ROM EQU 2000H ORG ROM ;Reset Vector LJMP START ; ORG ROM+3H ;External Interrupt 0 Vector RETI ; ORG ROM+0BH ;Timer 0 Interrupt Vector RETI ; ORG ROM+13H ;External Interrupt 1 Vector RETI ; ORG ROM+1BH ;Timer 1 Interrupt Vector RETI ; ORG ROM+23H ;Serial Interrupt Vector RETI ; START: LCALL INIT_SERIAL LCALL INIT_LCD LOOP: ACALL ADC ACALL HITUNG_JARAK ACALL TAMPILKAN_HASIL LCALL DELAY_1DETIK MOV A,#' ' LCALL SERIAL_OUT SJMP LOOP ADC: MOV DPTR,#0800H MOV A,#00H MOVX @DPTR,A JB INT0,* ACALL DELAY MOV A,#00H MOVX A,@DPTR RET HITUNG_JARAK: JARAK_80CM: CJNE A,#17H,JARAK_80CM_BESAR SJMP JARAK_80CM_SAMA JARAK_80CM_BESAR: JNC JARAK_70CM JARAK_80CM_SAMA: MOV A,#80 LJMP HITUNG_JARAK_SELESAI JARAK_70CM: CJNE A,#1AH,JARAK_70CM_BESAR SJMP JARAK_70CM_SAMA JARAK_70CM_BESAR: JNC JARAK_60CM JARAK_70CM_SAMA: MOV A,#70 LJMP HITUNG_JARAK_SELESAI JARAK_60CM: CJNE A,#1CH,JARAK_60CM_BESAR SJMP JARAK_60CM_SAMA JARAK_60CM_BESAR: JNC JARAK_50CM JARAK_60CM_SAMA: MOV A,#60 LJMP HITUNG_JARAK_SELESAI JARAK_50CM: CJNE A,#20H,JARAK_50CM_BESAR SJMP JARAK_50CM_SAMA JARAK_50CM_BESAR: JNC JARAK_40CM JARAK_50CM_SAMA: MOV A,#50 SJMP HITUNG_JARAK_SELESAI JARAK_40CM: CJNE A,#27H,JARAK_40CM_BESAR SJMP JARAK_40CM_SAMA JARAK_40CM_BESAR: JNC JARAK_30CM JARAK_40CM_SAMA: MOV A,#40 SJMP HITUNG_JARAK_SELESAI JARAK_30CM: CJNE A,#34H,JARAK_30CM_BESAR SJMP JARAK_30CM_SAMA JARAK_30CM_BESAR: JNC JARAK_20CM JARAK_30CM_SAMA: MOV A,#30 SJMP HITUNG_JARAK_SELESAI JARAK_20CM: CJNE A,#49H,JARAK_20CM_BESAR SJMP JARAK_20CM_SAMA JARAK_20CM_BESAR: JNC JARAK_10CM JARAK_20CM_SAMA: MOV A,#20 SJMP HITUNG_JARAK_SELESAI JARAK_10CM: CJNE A,#82H,JARAK_10CM_BESAR SJMP JARAK_10CM_SAMA JARAK_10CM_BESAR: JNC JARAK_0CM JARAK_10CM_SAMA: MOV A,#10 SJMP HITUNG_JARAK_SELESAI JARAK_0CM: MOV A,#0 HITUNG_JARAK_SELESAI: MOV JARAK,A RET HEX2DEC: MOV B,#10 DIV AB SWAP A ANL A,#0F0H ORL A,B RET TAMPILKAN_HASIL: LCALL POSISI_AWAL MOV DPTR,#TAMPILAN_JARAK LCALL KIRIMPESAN_LCD MOV A,JARAK ACALL HEX2DEC PUSH A LCALL ASCII_OUT POP A PUSH A ANL A,#0F0H SWAP A ADD A,#30H LCALL KIRIM_KARAKTER POP A ANL A,#0FH ADD A,#30H LCALL KIRIM_KARAKTER MOV DPTR,#TAMPILAN_CM LCALL KIRIMPESAN_LCD RET DELAY: PUSH B MOV B,#0FFH DJNZ B,* POP B RET TAMPILAN_JARAK: DB 'Jarak: ',0FH TAMPILAN_CM: DB 'cm',0FH