; LCD Connections
LCD DATA P2 ; menetapkan LCD data pada port 2
Sibuk BIT LCD.7 ; menetapkan LCD sibuk
EN BIT P3.5 ; menetapkan LCD enable pada port 3.5
RW BIT P3.6 ; menetapkan LCD register pada port 3.6
RS BIT P3.7 ; menetapkan LCD baca/tulis pada port 3.7
;**************************************************************
; KEYS
NAIK BIT P1.3 ; menetapkan tombol NAIK pada p1.3
TURUN BIT P1.2 ; menetapkan tombol TURUN pada p1.2
T_Set BIT P3.2 ; menetapkan tombol Time Set pada p3.2
A_Set BIT P3.3 ; menetapkan tombol Alarm Set pada p3.3
;**************************************************************
; I2C Connections
SCL BIT P1.0 ; menetapkan p1.0 I2C serial clock
SDA BIT P1.1 ; menetapkan p1.1 I2C serial data
;**************************************************************
; Slave Address
SAW EQU 0D0H ; untuk penulis pada RTC DS3231
SAR EQU 0D1H ; untuk pembaca pada RTC DS3231
;**************************************************************
BitCnt DATA 20H ; BIT COUNTER FOR I2C ROUTINES
Detik DATA 21H ; DETIK STORAGE RAM
Menit DATA 22H ; MENIT STORAGE RAM
Jam DATA 23H ; JAM STORAGE RAM
Hari DATA 24H ; HARI STORAGE RAM
Tanggal DATA 25H ; TANGGAL STORAGE RAM
Bulan DATA 26H ; BULAN STORAGE RAM
Tahun DATA 27H ; TAHUN STORAGE RAM
SQW DATA 28H ; SQUARE-WAVE CONTROL
AL_Jam DATA 29H ; ALARM JAM
AL_Min DATA 2AH ; ALARM MENIT
Logo DATA 2FH ; Logo
AL_Logo BIT Logo.0 ; ALARM Logo
; ***MACRO'S***
I2C_Delay MACRO
NOP
ENDM
;--------------------------------------------------------------
SCLHigh MACRO
SETB SCL
JNB SCL,$
ENDM
;--------------------------------------------------------------
D_Str MACRO
ACALL Command
LCALL Disp_Char
ENDM
;--------------------------------------------------------------
CLR_LCD MACRO
MOV A,#01H
ACALL Command
ENDM
;**************************************************************
ORG 0000H
;--------------------------------------------------------------
;perintah awal
CLR AL_Logo
MOV SP,#2FH
MOV SQW,#80H
ACALL SQW_W
ACALL I2C_Start
MOV A,#SAW
ACALL I2C_Write
MOV A,#3FH
ACALL I2C_Write
ACALL I2C_Start
MOV A,#SAR
ACALL I2C_Write
ACALL I2C_Read_Last
ACALL I2C_Stop
CJNE A,#'~',INIT
LJMP LCD_I
;--------------------------------------------------------------
;inisalisasi
INIT: ACALL I2C_Start
MOV A,#SAW
ACALL I2C_Write
MOV A,#3FH
ACALL I2C_Write
MOV A,#'~'
ACALL I2C_Write
MOV A,#00H
ACALL I2C_Write
ACALL I2C_Stop
SJMP LCD_I
;--------------------------------------------------------------
;untuk reset Rel=al Time Clock
RTC_Reset:
MOV R0,#21H
MOV R6,#07H
ACALL I2C_Start
MOV A,#SAW
ACALL I2C_Write
MOV A,#00H
ACALL I2C_Write
Loop1: MOV A,@R0
ACALL I2C_Write
INC R0
DJNZ R6,Loop1
ACALL I2C_Stop
RET
;--------------------------------------------------------------
;untuk mematikan alarm
AL_Off: CLR AL_Logo
SETB P3.4
MOV SQW,#80H
ACALL SQW_W
CLR_LCD
MOV A,#84H
D_Str
DB 'Alarm Off!',0
MOV A,#82H
ACALL Command
MOV A,#01H
ACALL Data_Disp
ACALL Delay
SJMP Main
;--------------------------------------------------------------
;untuk me- set waktu alarm yang dikehendaki
Alarm_Set:
JB AL_Logo,AL_Off
CLR_LCD
MOV A,#84H
D_Str
DB 'Set Alarm',0
MOV A,#82H
ACALL Command
MOV A,#01H
ACALL Data_Disp
ACALL Delay
AJMP AH
;--------------------------------------------------------------
LCD_I: ACALL LCD_Initial
ACALL CGR
;--------------------------------------------------------------
;Untuk menjalankan perintah utama
Main: ACALL Disp_C
Start: ACALL Key_Scan
Back1: MOV R0,#21H
MOV R1,#0DH
ACALL I2C_Start
MOV A,#SAW
ACALL I2C_Write
MOV A,#00H
ACALL I2C_Write
ACALL I2C_Start
MOV A,#SAR
ACALL I2C_Write
Loop: ACALL I2C_Read
DJNZ R1,Loop
ACALL I2C_Read_Last
ACALL I2C_Stop
ACALL Display
ACALL Alarm_Check
SJMP Start
;--------------------------------------------------------------
;untuk membaca tombol mana yang ditekan oleh user
Key_Scan:
JNB T_Set,Jump1
JNB A_Set,Alarm_Set
RET
;--------------------------------------------------------------
Jump1: LJMP Time_Set
;--------------------------------------------------------------
;cek nilai alarm yang si set
Alarm_Check:
JNB AL_Logo,CH
MOV A,AL_Min
CJNE A,Menit,Alarm_Off
MOV A,AL_Jam
CJNE A,Jam,Alarm_Off
ACALL Alarm_On
CH: RET
;--------------------------------------------------------------
;tampilan mematikan alarm
Alarm_Off:
MOV SQW,#80H
SETB P3.4
ACALL SQW_W
RET
;--------------------------------------------------------------
;untuk fungsi RTC
SQW_W: ACALL I2C_Start
MOV A,#SAW
ACALL I2C_Write
MOV A,#07H
ACALL I2C_Write
MOV A,SQW
ACALL I2C_Write
ACALL I2C_Stop
RET
;--------------------------------------------------------------
;tampilan bahwa alarm on/telah di set
Alarm_On:
MOV SQW,#10H
CLR P3.4
ACALL SQW_W
RET
;--------------------------------------------------------------
;fungsi untuk mengatur waktu dan tanggal
Time_Set:
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Hours:',0
MOV A,#0C7H
ACALL Command
MOV A,Jam
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
I24: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KS24: JNB NAIK,Inc_Hour
JNB TURUN,Dec_Hour
JNB T_Set,Done_H
SJMP KS24
Inc_Hour:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#18H,SH
MOV A,#00H
SH: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP I24
Dec_Hour:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,SH
MOV A,#17H
SJMP SH
Done_H: JNB T_Set,$
MOV JAM,R7
;--------------------------------------------------------------
;mengatur nilai menit
Mint: CLR_LCD
MOV A,#82H
D_Str
DB 'Set Minutes:',0
MOV A,#0C7H
ACALL Command
MOV A,Menit
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
M1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KSMIN: JNB NAIK,Inc_Min
JNB TURUN,Dec_Min
JNB T_Set,DoneMin
SJMP KSMIN
Inc_Min:NOP
ACALL BCD_2_Hex
INC A
CJNE A,#3CH,SMin
MOV A,#00H
SMin: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP M1
Dec_Min:NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,SMin
MOV A,#3BH
SJMP SMin
DoneMin:JNB T_Set,$
MOV Menit,R7
;--------------------------------------------------------------
;mengatur nilai hari
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Days:',0
MOV A,#0C5H
D_Str
DB '* *',0
MOV A,#0C6H
ACALL Command
MOV A,Hari
PUSH ACC
LCALL W_Day
POP ACC
JNB T_Set,$
D1: PUSH ACC
MOV A,#0C6H
ACALL Command
POP ACC
KSDAY: JNB NAIK,Inc_Day
JNB TURUN,Dec_Day
JNB T_Set,DoneDay
SJMP KSDAY
Inc_Day:NOP
INC A
CJNE A,#08H,SDay
MOV A,#01H
SDay: PUSH ACC
LCALL W_Day
POP ACC
JNB NAIK,$
JNB TURUN,$
SJMP D1
Dec_Day:NOP
DEC A
CJNE A,#00H,SDay
MOV A,#07H
SJMP SDay
DoneDay:JNB T_Set,$
MOV Hari,A
;--------------------------------------------------------------
;mengatur nilai tanggal
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Date:',0
MOV A,#0C7H
ACALL Command
MOV A,Tanggal
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
DA1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KSDAT: JNB NAIK,Inc_DAT
JNB TURUN,Dec_DAT
JNB T_Set,DoneDAT
SJMP KSDAT
Inc_DAT:NOP
ACALL BCD_2_Hex
INC A
CJNE A,#20H,SDAT
MOV A,#01H
SDAT: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP DA1
Dec_DAT:NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H,SDAT
MOV A,#1FH
SJMP SDAT
DoneDAT:JNB T_Set,$
MOV Tanggal,R7
;--------------------------------------------------------------
;mengatur nilai bulan
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Month:',0
MOV A,#0C7H
ACALL Command
MOV A,Bulan
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
MM1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KSMON: JNB NAIK,Inc_MON
JNB TURUN,Dec_MON
JNB T_Set,DoneMON
SJMP KSMON
Inc_MON:NOP
ACALL BCD_2_Hex
INC A
CJNE A,#0DH,SMON
MOV A,#01H
SMON: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP MM1
Dec_MON:NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H,SMON
MOV A,#0CH
SJMP SMON
DoneMON:JNB T_Set,$
MOV Bulan,R7
;--------------------------------------------------------------
;mengatur nilai tahun
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Year:',0
MOV A,#0C6H
D_Str
DB '20',0
MOV A,#0C8H
ACALL Command
MOV A,Tahun
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
YY1: PUSH ACC
MOV A,#0C8H
ACALL Command
POP ACC
KSYY: JNB NAIK,Inc_YY
JNB TURUN,Dec_YY
JNB T_Set,DoneYY
SJMP KSYY
Inc_YY: NOP
ACALL BCD_2_Hex
INC A
CJNE A,#64H,SYY
MOV A,#00H
SYY: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP YY1
Dec_YY: NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,SYY
MOV A,#63H
SJMP SYY
DoneYY: JNB T_Set,$
MOV Tahun,R7
MOV Detik,#00H
ACALL RTC_Reset
ACALL Done
ACALL Disp_C
ACALL AL_Flag
LJMP Main
;--------------------------------------------------------------
;menampilkan kata done saat user selesai memberikan perintah dengan tombol
Done:
CLR_LCD
MOV A,#86H
D_Str
DB 'Done!',0
ACALL Delay
RET
;--------------------------------------------------------------
;memberikan delay waktu
Delay: MOV R2,#0FFH
MOV R3,#14H
LP3: MOV R2,#0FFH
LP2: MOV R5,#0FFH
LP1: DJNZ R5,LP1
DJNZ R2,LP2
DJNZ R3,LP3
RET
;--------------------------------------------------------------
;set fungsi dari alarm
AH: CLR_LCD
MOV A,#83H
D_Str
DB 'Set Hours:',0
MOV A,#0C7H
ACALL Command
MOV A,AL_Jam
MOV R7,A
ACALL Disp_BCD
ALH1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
ALH2: JNB NAIK,Inc_AL_Hour
JNB TURUN,Dec_AL_Hour
JNB A_Set,DoneALH
SJMP ALH2
Inc_AL_Hour:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#18H,Z_AL_H
MOV A,#00H
Z_AL_H: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP ALH1
Dec_AL_Hour:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,Z_AL_H
MOV A,#17H
SJMP Z_AL_H
DoneALH:JNB A_Set,$
MOV AL_Jam,R7
CLR_LCD
MOV A,#82H
D_Str
DB 'Set Minutes:',0
MOV A,#0C7H
ACALL Command
MOV A,AL_Min
MOV R7,A
ACALL Disp_BCD
JNB A_Set,$
ALM1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
ALM2: JNB NAIK,Inc_AL_Min
JNB TURUN,Dec_AL_Min
JNB A_Set,DoneAL_Min
SJMP ALM2
Inc_AL_Min:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#3CH,SAL_Min
MOV A,#00H
SAL_Min:ACALL Hex_2_BCD
ACALL Disp_BCD
JNB NAIK,$
JNB TURUN,$
SJMP ALM1
Dec_AL_Min:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,SAL_Min
MOV A,#3BH
SJMP SAL_Min
DoneAL_Min:
JNB A_Set,$
MOV AL_Min,R7
SETB AL_Logo
ACALL ALT_Done
ACALL Done
ACALL AL_Flag
LJMP Main
;--------------------------------------------------------------
;difungsikan tampilan alarm pada LCD
AL_Flag:JNB AL_Logo,WE2
MOV A,#0C2H
ACALL Command
MOV A,#01H
ACALL Data_Disp
WE2: RET
;--------------------------------------------------------------
;fungsi sambungan pada LCD
ALT_Done:
MOV R1,#29H
MOV R3,#07H
ACALL I2C_Start
MOV A,#SAW
ACALL I2C_Write
MOV A,#08H
ACALL I2C_Write
LOOP4: MOV A,@R1
ACALL I2C_Write
INC R1
DJNZ R3,LOOP4
ACALL I2C_Stop
RET
;--------------------------------------------------------------
;inisialisasi LCD
LCD_Initial:
MOV A,#38H
ACALL Command
MOV A,#0CH
ACALL Command
CLR_LCD
MOV A,#06H
ACALL Command
RET
;--------------------------------------------------------------
; fungsi tampilan pada LCD full
Display:MOV R1,#21H
MOV A,#0CAH
ACALL Command
MOV A,@R1
ACALL Disp_BCD
;
INC R1
MOV A,#0C7H
ACALL Command
MOV A,@R1
ACALL Disp_BCD
;
INC R1
MOV A,#0C4H
ACALL Command
MOV A,@R1
ACALL Disp_BCD
;
INC R1
MOV A,#80H
ACALL Command
MOV A,@R1
LCALL W_Day
;
INC R1
MOV A,#86H
ACALL Command
MOV A,@R1
ACALL Disp_BCD
;
INC R1
MOV A,#89H
ACALL Command
MOV A,@R1
ACALL Disp_BCD
;
INC R1
MOV A,#8EH
ACALL Command
MOV A,@R1
ACALL Disp_BCD
RET
;--------------------------------------------------------------
Hex_2_BCD:
MOV B,#00001010B
DIV AB
MOV R3,B
MOV B,#00010000B
MUL AB
ADD A,R3
MOV R7,A
RET
;--------------------------------------------------------------
BCD_2_Hex:
MOV B,#00010000B
DIV AB
MOV R3,B
MOV B,#00001010B
MUL AB
ADD A,R3
RET
;--------------------------------------------------------------
Disp_BCD:
PUSH ACC
MOV R5,A
ANL A,#11110000B
SWAP A
MOV DPTR,#Ascii_Code
MOVC A,@A+DPTR
ACALL Data_Disp
MOV A,R5
ANL A,#00001111B
MOVC A,@A+DPTR
ACALL Data_Disp
POP ACC
RET
;--------------------------------------------------------------
Disp_C: MOV A,#80H
D_Str
DB ' / /20 ',0
MOV A,#0C0H
ACALL Command
MOV A,#'*'
ACALL Data_Disp
MOV A,#0C6H
ACALL Command
MOV A,#':'
ACALL Data_Disp
MOV A,#0C9H
ACALL Command
MOV A,#':'
ACALL Data_Disp
MOV A,#0CFH
ACALL Command
MOV A,#'*'
ACALL Data_Disp
RET
;--------------------------------------------------------------
CGR: MOV R4,#08H
MOV R5,#40H
MOV DPTR,#Clock
ACALL WRI
MOV R4,#08H
MOV R5,#48H
MOV DPTR,#Bell
ACALL WRI
RET
;--------------------------------------------------------------
WRI: CLR A
ACALL Get_Ready
MOV LCD,R5
CLR RS
CLR RW
SETB EN
CLR EN
INC R5
MOVC A,@A+DPTR
ACALL Data_Disp
INC DPTR
DJNZ R4,WRI
RET
;---------------------------------------;
; ************PERINTAH I2C************* ;
;---------------------------------------;
I2C_Start:
SETB SCL
SETB SDA
I2C_Delay
CLR SDA
I2C_Delay
CLR SCL
RET
;--------------------------------------------------------------
I2C_Stop:
CLR SDA
SETB SCL
I2C_Delay
SETB SDA
RET
;--------------------------------------------------------------
I2C_Write:
MOV BitCnt,#08H
I2C_Write_Loop:
RLC A
MOV SDA,C
NOP
SCLHigh
CLR SCL
DJNZ BitCnt,I2C_Write_Loop
NOP
SETB SDA
NOP
SETB SCL
I2C_Delay
MOV C,SDA
CLR SCL
NOP
JNC Label
ACALL I2C_Stop
ACALL I2C_Start
SJMP I2C_Write
Label: RET
;--------------------------------------------------------------
I2C_Read_Dummy:
SETB SDA
CLR A
MOV BitCnt,#08H
I2C_Read_Loop:
CLR SCL
I2C_Delay
SCLHigh
MOV C,SDA
RLC A
DJNZ BitCnt,I2C_Read_Loop
CLR SCL
MOV @R0,A
INC R0
RET
;--------------------------------------------------------------
I2C_Ack_Write:
CLR SDA
NOP
SETB SCL
I2C_Delay
CLR SCL
SETB SDA
I2C_Delay
RET
;--------------------------------------------------------------
I2C_Nack_Write:
SETB SDA
NOP
SETB SCL
I2C_Delay
CLR SCL
I2C_Delay
RET
;--------------------------------------------------------------
I2C_Read:
ACALL I2C_Read_Dummy
ACALL I2C_Ack_Write
RET
;--------------------------------------------------------------
I2C_Read_Last:
ACALL I2C_Read_Dummy
ACALL I2C_Nack_Write
RET
;--------------------------------------;
; ************PERINTAH LCD*************;
;--------------------------------------;
Command:ACALL Get_Ready
MOV LCD,A
CLR RS
CLR RW
SETB EN
CLR EN
RET
;--------------------------------------------------------------
Data_Disp:
ACALL Get_Ready
MOV LCD,A
SETB RS
CLR RW
SETB EN
CLR EN
RET
;--------------------------------------------------------------
Get_Ready:
SETB Sibuk
CLR RS
SETB RW
Back: CLR EN
SETB EN
JB Sibuk,BACK
RET
;--------------------------------------------------------------
Disp_Char:
POP DPH
POP DPL
Print_Text:
CLR A
MOVC A,@A+DPTR
CJNE A,#00H,Loop2
SJMP Return
Loop2: MOV R4, A
LCALL Data_Disp
INC DPTR
LJMP Print_Text
Return: MOV A,#01H
JMP @A+DPTR
;--------------------------------------------------------------
;fungsi tampilan pada LCD terkait waktu dan tanggal
W_Day: CJNE A,#01H,MON
LCALL Disp_Char
DB 'Sun',0
RET
MON: CJNE A,#02H,TUE
LCALL Disp_Char
DB 'Mon',0
RET
TUE: CJNE A,#03H,WED
LCALL Disp_Char
DB 'Tue',0
RET
WED: CJNE A,#04H,THU
LCALL Disp_Char
DB 'Wed',0
RET
THU: CJNE A,#05H,FRI
LCALL Disp_Char
DB 'Thu',0
RET
FRI: CJNE A,#06H,SAT
LCALL Disp_Char
DB 'Fri',0
RET
SAT: CJNE A,#07H,WHAT
LCALL Disp_Char
DB 'Sat',0
RET
WHAT: RET
;--------------------------------------------------------------
Ascii_Code:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
;--------------------------------------------------------------
;Icons
Clock: DB 00H,0EH,15H,17H,11H,0EH,00H,00H
Bell: DB 04H,0EH,0EH,0EH,1FH,00H,04H,00H
;--------------------------------------------------------------
END
Komentar
Posting Komentar