Gamabar Rangkaian dengan simulator Proteus :
Source Code *asm
; *** File Name: CLOCK.ASM
; *** Project: Programmable Digital Clock with Alarm
; *** Author: Suparno, M.Pd
; *** Date: 26/03/2011
; *** Processor: Atmel AT89C51 Microcontroller (Compatible With MCS-51)
; *** Timekeeper: DS1307 I2C Serial Timekeeper IC
; *** Display: 16 characters x 2 lines LCD
;**************************************************************
; LCD Connections
LCD DATA P2 ; define LCD data port on port 1
Busy BIT LCD.7 ; define LCD busy flag
EN BIT P3.5 ; define LCD enable pin on port 2.2
RW BIT P3.6 ; define LCD register select pin on port 2.0
RS BIT P3.7 ; define LCD read/write pin on port 2.1
;**************************************************************
; KEYS
UP BIT P1.3
DN BIT P1.2
Rel_Set BIT P3.4
T_Set BIT P3.2
A_Set BIT P3.3
;**************************************************************
Rel_Out BIT P1.4
;**************************************************************
; I2C Connections
SCL BIT P1.0 ; I2C serial clock line
SDA BIT P1.1 ; I2C serial data line
;**************************************************************
; Slave Address
SAW EQU 0D0H ; Slave address for write (DS1307)
SAR EQU 0D1H ; Slave address for read (DS1307)
;**************************************************************
BitCnt DATA 20H ; BIT COUNTER FOR I2C ROUTINES
Sec DATA 21H ; SECONDS STORAGE RAM
Min DATA 22H ; MINUTES STORAGE RAM
Hour DATA 23H ; HOURS STORAGE RAM
Day DATA 24H ; DAY STORAGE RAM
Date DATA 25H ; DATE STORAGE RAM
Month DATA 26H ; MONTH STORAGE RAM
Year DATA 27H ; YEAR STORAGE RAM
SQW DATA 28H ; SQUARE-WAVE CONTROL
AL_Hour DATA 29H ; ALARM HOURS STORAGE RAM SPACE
AL_Min DATA 2AH ; ALARM MINUTES STORAGE RAM SPACE
Rel_H DATA 2BH ; RELAY HOURS STORAGE RAM SPACE (FOR ON)
Rel_M DATA 2CH ; RELAY MINUTES STORAGE RAM SPACE (FOR ON)
RH_Off DATA 2DH ; RELAY HOURS STORAGE RAM SPACE (FOR OFF)
RM_Off DATA 2EH ; RELAY MINUTES STORAGE RAM SPACE (FOR OFF)
Flags DATA 2FH ; FLAGS
AL_Flag BIT Flags.0 ; ALARM FLAG
RL_Flag BIT Flags.1 ; RELAY TIMER FLAG
RL_On BIT FlagS.2
;**************************************************************
; ***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
;--------------------------------------------------------------
CLR AL_Flag
CLR RL_Flag
CLR RL_On
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
;--------------------------------------------------------------
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
;--------------------------------------------------------------
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
;--------------------------------------------------------------
AL_Off: CLR AL_Flag
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
ACALL RL_Logo
SJMP Main
;--------------------------------------------------------------
Alarm_Set:
JB AL_Flag,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
;--------------------------------------------------------------
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
ACALL Relay_Check
SJMP Start
;--------------------------------------------------------------
Key_Scan:
JNB T_Set,Jump1
JNB A_Set,Alarm_Set
JNB Rel_Set,Jump2
RET
;--------------------------------------------------------------
Jump1: LJMP Time_Set
Jump2: SJMP Relay_Set
;--------------------------------------------------------------
Alarm_Check:
JNB AL_Flag,CH
MOV A,AL_Min
CJNE A,Min,Alarm_Off
MOV A,AL_Hour
CJNE A,Hour,Alarm_Off
ACALL Alarm_On
CH: RET
;--------------------------------------------------------------
Alarm_Off:
MOV SQW,#80H
ACALL SQW_W
RET
;--------------------------------------------------------------
RL_Off: CLR RL_Flag
SETB Rel_Out
CLR RL_On
CLR_LCD
MOV A,#84H
D_Str
DB 'Relay Off!',0
MOV A,#82H
ACALL Command
MOV A,#00H
ACALL Data_Disp
ACALL Delay
ACALL AL_Logo
SJMP Main
;--------------------------------------------------------------
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
;--------------------------------------------------------------
Alarm_On:
MOV SQW,#10H
ACALL SQW_W
RET
;--------------------------------------------------------------
Relay_Check:
JNB RL_Flag,CH1
JB RL_On,Rel_Off
MOV A,Rel_M
CJNE A,Min,Relay_Off
MOV A,Rel_H
CJNE A,Hour,Relay_Off
SETB RL_On
ACALL Relay_On
CH1: RET
;--------------------------------------------------------------
Relay_Off:
SETB Rel_Out
RET
;--------------------------------------------------------------
Relay_On:
CLR Rel_Out
RET
;--------------------------------------------------------------
Relay_Set:
JB RL_Flag,RL_Off
LJMP R_Set
;--------------------------------------------------------------
Rel_Off:MOV A,RM_Off
CJNE A,Min,Relay_On
MOV A,RH_Off
CJNE A,Hour,Relay_On
CLR RL_On
ACALL Relay_Off
CH2: RET
;--------------------------------------------------------------
Time_Set:
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Hours:',0
MOV A,#0C7H
ACALL Command
MOV A,Hour
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
I24: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KS24: JNB UP,Inc_Hour
JNB DN,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 UP,$
JNB DN,$
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 Hour,R7
;--------------------------------------------------------------
Mint: CLR_LCD
MOV A,#82H
D_Str
DB 'Set Minutes:',0
MOV A,#0C7H
ACALL Command
MOV A,Min
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
M1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KSMIN: JNB UP,Inc_Min
JNB DN,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 UP,$
JNB DN,$
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 Min,R7
;--------------------------------------------------------------
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,Day
PUSH ACC
LCALL W_Day
POP ACC
JNB T_Set,$
D1: PUSH ACC
MOV A,#0C6H
ACALL Command
POP ACC
KSDAY: JNB UP,Inc_Day
JNB DN,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 UP,$
JNB DN,$
SJMP D1
Dec_Day:NOP
DEC A
CJNE A,#00H,SDay
MOV A,#07H
SJMP SDay
DoneDay:JNB T_Set,$
MOV Day,A
;--------------------------------------------------------------
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Date:',0
MOV A,#0C7H
ACALL Command
MOV A,Date
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
DA1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KSDAT: JNB UP,Inc_DAT
JNB DN,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 UP,$
JNB DN,$
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 Date,R7
;--------------------------------------------------------------
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Month:',0
MOV A,#0C7H
ACALL Command
MOV A,Month
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
MM1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KSMON: JNB UP,Inc_MON
JNB DN,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 UP,$
JNB DN,$
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 Month,R7
;--------------------------------------------------------------
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,Year
MOV R7,A
ACALL Disp_BCD
JNB T_Set,$
YY1: PUSH ACC
MOV A,#0C8H
ACALL Command
POP ACC
KSYY: JNB UP,Inc_YY
JNB DN,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 UP,$
JNB DN,$
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 Year,R7
MOV Sec,#00H
ACALL RTC_Reset
ACALL Done
ACALL Disp_C
ACALL RL_Logo
ACALL AL_Logo
LJMP Main
;--------------------------------------------------------------
Done:
CLR_LCD
MOV A,#86H
D_Str
DB 'Done!',0
ACALL Delay
RET
;--------------------------------------------------------------
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
;--------------------------------------------------------------
AH: CLR_LCD
MOV A,#83H
D_Str
DB 'Set Hours:',0
MOV A,#0C7H
ACALL Command
MOV A,AL_Hour
MOV R7,A
ACALL Disp_BCD
ALH1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
ALH2: JNB UP,Inc_AL_Hour
JNB DN,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 UP,$
JNB DN,$
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_Hour,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 UP,Inc_AL_Min
JNB DN,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 UP,$
JNB DN,$
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_Flag
ACALL ALT_Done
ACALL Done
ACALL RL_Logo
ACALL AL_Logo
LJMP Main
;--------------------------------------------------------------
R_Set: CLR_LCD
MOV A,#81H
D_Str
DB ' Set Timer(ON)',0
MOV A,#80H
ACALL Command
MOV A,#00H
ACALL Data_Disp
ACALL Delay
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Hours:',0
MOV A,#0C7H
ACALL Command
MOV A,Rel_H
MOV R7,A
ACALL Disp_BCD
JNB Rel_Set,$
RTH1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KHREL: JNB UP,Inc_Rel_H
JNB DN,Dec_Rel_H
JNB Rel_Set,DoneRel_H
SJMP KHREL
Inc_Rel_H:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#18H,HRel
MOV A,#00H
HRel: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB UP,$
JNB DN,$
SJMP RTH1
Dec_Rel_H:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,HRel
MOV A,#17H
SJMP HRel
DoneRel_H:
JNB Rel_Set,$
MOV Rel_H,R7
CLR_LCD
MOV A,#82H
D_Str
DB 'Set Minutes:',0
MOV A,#0C7H
ACALL Command
MOV A,Rel_M
MOV R7,A
ACALL Disp_BCD
JNB Rel_Set,$
RTM1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KMREL: JNB UP,Inc_Rel_M
JNB DN,Dec_Rel_M
JNB Rel_Set,DoneRel_M
SJMP KMREL
Inc_Rel_M:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#3CH,MRel
MOV A,#00H
MRel: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB UP,$
JNB DN,$
SJMP RTM1
Dec_Rel_M:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,MRel
MOV A,#3BH
SJMP MRel
DoneRel_M:
JNB Rel_Set,$
MOV Rel_M,R7
Off: CLR_LCD
MOV A,#81H
D_Str
DB ' Set Timer(OFF)',0
MOV A,#80H
ACALL Command
MOV A,#00H
ACALL Data_Disp
ACALL Delay
CLR_LCD
MOV A,#83H
D_Str
DB 'Set Hours:',0
MOV A,#0C7H
ACALL Command
MOV A,RH_Off
MOV R7,A
ACALL Disp_BCD
JNB Rel_Set,$
RTHF1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KHFREL: JNB UP,Inc_Rel_HF
JNB DN,Dec_Rel_HF
JNB Rel_Set,DoneRel_HF
SJMP KHFREL
Inc_Rel_HF:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#18H,HFRel
MOV A,#00H
HFRel: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB UP,$
JNB DN,$
SJMP RTHF1
Dec_Rel_HF:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,HFRel
MOV A,#17H
SJMP HFRel
DoneRel_HF:
JNB Rel_Set,$
MOV RH_Off,R7
CLR_LCD
MOV A,#82H
D_Str
DB 'Set Minutes:',0
MOV A,#0C7H
ACALL Command
MOV A,RM_Off
MOV R7,A
ACALL Disp_BCD
JNB Rel_Set,$
RFTM1: PUSH ACC
MOV A,#0C7H
ACALL Command
POP ACC
KFMREL: JNB UP,Inc_Rel_MF
JNB DN,Dec_Rel_MF
JNB Rel_Set,DoneRel_MF
SJMP KFMREL
Inc_Rel_MF:
NOP
ACALL BCD_2_Hex
INC A
CJNE A,#3CH,MFRel
MOV A,#00H
MFRel: ACALL Hex_2_BCD
ACALL Disp_BCD
JNB UP,$
JNB DN,$
SJMP RFTM1
Dec_Rel_MF:
NOP
ACALL BCD_2_Hex
DEC A
CJNE A,#00H-1,MFRel
MOV A,#3BH
SJMP MFRel
DoneRel_MF:
JNB Rel_Set,$
MOV RM_Off,R7
SETB RL_Flag
ACALL ALT_Done
ACALL Done
ACALL RL_Logo
ACALL AL_Logo
LJMP Main
;--------------------------------------------------------------
RL_Logo:JNB RL_Flag,WE1
MOV A,#0CDH
ACALL Command
MOV A,#00H
ACALL Data_Disp
WE1: RET
;--------------------------------------------------------------
AL_Logo:JNB AL_Flag,WE2
MOV A,#0C2H
ACALL Command
MOV A,#01H
ACALL Data_Disp
WE2: RET
;--------------------------------------------------------------
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
;--------------------------------------------------------------
LCD_Initial:
MOV A,#38H
ACALL Command
MOV A,#0CH
ACALL Command
CLR_LCD
MOV A,#06H
ACALL Command
RET
;--------------------------------------------------------------
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
;---------------------------------------;
; ************I2C Commands************* ;
;---------------------------------------;
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
;--------------------------------------;
; ************LCD CommandS*************;
;--------------------------------------;
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 Busy
CLR RS
SETB RW
Back: CLR EN
SETB EN
JB Busy,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
;--------------------------------------------------------------
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