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


ada file.c nya ga mas?
BalasHapuskalau boleh tau ini untuk runnya bukan pakae bascom ya?
BalasHapusapa ini pake mide-51?
Pak yang hitam hitam itu di proteus namanya apa
BalasHapusPak boleh minta file simulasinya ndak pak soalnya buat tugas harian pak
BalasHapuskirim ke manaf.isnansyah@gmail.com tolong sekali pak trimakasih
skemanya ada yang pake bascom ngak pak ?
BalasHapusudah copy paste aja jangan banyak tanya
BalasHapusmaf pak ganggu waktu nya sebentar pak bisa krim skema sama daftar komponen yang jelas pak, yang di atas kurang jelas ini untuk tugas kuliah pak,mohon bnatun bapak ucapkan terimakasih krim aja ke yfyusuf59@gmail.com
BalasHapusmkasih pak ^_^
OK siap izin copy.
BalasHapushehe.....