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