?? bell.a51
字號:
MOV A,#0AAH ; WRITE BYTE TO ENTIRE RAM SPACE
LCALL SEND_BYTE
LCALL SEND_STOP ; SEND 2WIRE STOP CONTION
LCALL SEND_START ; SEND 2WIRE START CONDITION
MOV A,#DS1307W ; LOAD DS1307 WRITE COMMAND
LCALL SEND_BYTE ; SEND WRITE COMMAND
MOV A,#01H ; SET DS1307 DATA POINTER TO BEGINNING
LCALL SEND_BYTE ; OF 00H
MOV A,NUMB4 ; SET DS1307 DATA POINTER TO BEGINNING
LCALL SEND_BYTE ; OF 00H
MOV A,NUMB2
CLR ACC.6
LCALL SEND_BYTE
LCALL SEND_STOP ; SEND 2WIRE STOP CONTION
;*******************************************************************************
; MAIN PROGRAM
;*******************************************************************************
START_PROGRAM:
CALL READ_CLOCK
MOV R1,#25H ;GET MIN AND DISPLAY
MOV A,@R1
ANL A,#0FH
MOV VALUE_4,A
MOV R1,#25H
MOV A,@R1
ANL A,#0F0H
SWAP A
MOV VALUE_3,A
MOV R1,#26H ;GET HOUR AND DISPLAY
MOV A,@R1
CLR C
SUBB A,#12H
JNC CCX
MOV A,@R1
CCX:
CJNE A,#00H,HHGH
MOV A,#12H
HHGH:
ANL A,#0FH
MOV VALUE_2,A
MOV R1,#26H
MOV A,@R1
CLR C
SUBB A,#12H
JNC CCX1
MOV A,@R1
CCX1:
CJNE A,#00H,HHGH1
MOV A,#12H
HHGH1:
ANL A,#0F0H
SWAP A
MOV VALUE_1,A
CALL LOAD_ALRM
CLR ROW4
SETB COL2
JB COL2,NEXT1
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
; EMERGENCY BELL
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
SETB RELAY
JNB COL2,$
CLR RELAY
AJMP START_PROGRAM
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
NEXT1: CLR ROW4
SETB COL3
JB COL3,START_PROGRAM
CALL SQW_CONTROL_32KHZ
MOV NUMBER1,#01H
SETB CANCEL
SETB CANCEL1
MOV DPTR,#0001H
START_PROG:
ORL WMCON, #EEMEN ; enable EEPROM accesses
MOVX A,@DPTR
CJNE A,#0FFH,TFT1
MOV VALUE_1,#16H
MOV VALUE_2,#16H
AJMP TFT3
TFT1: MOV R1,A ;GET MIN AND DISPLAY
ANL A,#0FH
MOV VALUE_2,A
MOV A,R1
ANL A,#0F0H
SWAP A
MOV VALUE_1,A
TFT3: INC DPTR
MOVX A,@DPTR
CJNE A,#0FFH,TFT2
XRL WMCON, #EEMEN ; disable EEPROM accesses
MOV VALUE_3,#16H
MOV VALUE_4,#16H
JMP KEYBOARD
TFT2:
MOV R1,A
ANL A,#0FH
MOV VALUE_4,A
MOV A,R1
ANL A,#0F0H
SWAP A
MOV VALUE_3,A
JMP KEYBOARD
START_PM:
CLR ROW4
SETB COL3
JNB COL3,$
CALL DEC_DPTR ;store the count of timings
CALL DEC_DPTR
MOV A,DPL
MOV DPTR,#0100H
MOV WMCON,#18H
MOVX @DPTR,A
CZTHD:
MOV A,WMCON ;Check for eeprom finished or not
JNB ACC.1,CZTHD
MOV WMCON,#08H
CALL SQW_CONTROL_1HZ
AJMP START_PROGRAM
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
; CHECK FOR TIME IS EQUAL
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
LOAD_ALRM:
MOV DPTR,#0100H
ORL WMCON, #EEMEN ; enable EEPROM accesses
MOVX A,@DPTR
MOV B,#02H
DIV AB
MOV R5,A
MOV DPTR,#0001H
REPEAT:
MOVX A,@DPTR
MOV ALM_HOUR,A
INC DPTR
MOVX A,@DPTR
MOV ALM_MIN,A
INC DPTR
MOV A,HRS
CJNE A,ALM_HOUR,CHKK
MOV A,MINS
CJNE A,ALM_MIN,CHKK
MOV A,SECS
ANL A,#01111111B
MOV SECS,A
MOV A,#00H
CJNE A,SECS,CHKK
;Time Is Equal
JB ALARM,CHKK
ORL TMOD,#10H ;ENABLE TIMER 0
MOV TL1,#08H
MOV TH1,#01H
SETB ET1
MOV TIM,#100
SETB TR1
SETB RELAY
SETB ALARM
CHKK: DJNZ R5,REPEAT
XRL WMCON, #EEMEN ; disable EEPROM accesses
RET
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
KB_RET:
MOV A,KEY
CJNE A,#10H,CAXCX0 ;Key to Erase last dislled NUMBER1
JB CANCEL,START_PM1
MOV KEY,#00H
MOV NUMBER1,#01H
MOV VALUE_1,#15H
MOV VALUE_2,#15H
MOV VALUE_3,#15H
MOV VALUE_4,#15H
SETB CANCEL
CLR CANCEL1
AJMP KEYBOARD
START_PM1:
AJMP START_PM
CAXCX0:
CJNE A,#12H,CAXX5
CLR CANCEL
AJMP CAXCX5
CAXX5:
MOV A,NUMBER1
CJNE A,#01H,CAXCX1
MOV A,KEY
CLR C
SUBB A,#03H ; Chk Key Pressed 0,1,2
JNC CAXCX5
MOV A,KEY
INC NUMBER1
MOV NUMB1,KEY
MOV VALUE_1,KEY
CLR CANCEL
AJMP KEYBOARD
CAXCX1: CJNE A,#02H,CAXCX2
MOV A,NUMB1
CJNE A,#02,JAKJL
MOV A,KEY
CLR C
SUBB A,#04H ; Chk Key Pressed 0,1,2,3
JNC CAXCX5
JAKJL: MOV A,KEY
CLR C
SUBB A,#10H ; Chk Key Pressed 0,1...8,9
JNC CAXCX5
INC NUMBER1
MOV NUMB2,KEY
MOV VALUE_2,KEY
CLR CANCEL
AJMP KEYBOARD
CAXCX2: CJNE A,#03H,CAXCX3
MOV A,KEY
CLR C
SUBB A,#06H ; Chk Key Pressed 0,1...,5
JNC CAXCX5
INC NUMBER1
MOV NUMB3,KEY
MOV VALUE_3,KEY
CLR CANCEL
AJMP KEYBOARD
CAXCX3: CJNE A,#04H,CAXCX4
MOV A,KEY
CLR C
SUBB A,#10H ; Chk Key Pressed 0,1,....,8,9
JNC CAXCX5
INC NUMBER1
MOV NUMB4,KEY
MOV VALUE_4,KEY
CLR CANCEL
SETB CANCEL1
CAXCX4:
AJMP KEYBOARD
CAXCX5:
JNB CANCEL1,CAXCX4
CALL DEC_DPTR
MOV A,VALUE_1
SWAP A
ORL A,VALUE_2
MOV NUMB2,A
MOV A,VALUE_3
SWAP A
ORL A,VALUE_4
MOV NUMB4,A
MOV WMCON,#18H
MOV A,NUMB2
MOVX @DPTR,A
CTHD: MOV A,WMCON ;Check for eeprom finished or not
JNB ACC.1,CTHD
INC DPTR
MOV A,NUMB4
MOVX @DPTR,A
CTTHD: MOV A,WMCON ;Check for eeprom finished or not
JNB ACC.1,CTTHD
INC DPTR
MOV WMCON,#08H ; DISable EEPROM WRITE
AJMP START_PROG
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
DEALAY:
PUSH ACC
MOV R1,#20
REPP2: MOV A,#0A6H
MD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MD_OLP
NOP
DJNZ R1,REPP2
POP ACC
RET
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
DEC_DPTR:
XCH A,DPL ;Exchange A for DPL
DEC A ;Decrement A (which is DPL)
CJNE A,#0FFh,_dec_dptr2 ;If A (DPL) is not #0FFh, continue normally
DEC DPH ;If A=FFh, we need to decrement DPH
_dec_dptr2:
XCH A,DPL ;Exchange A for DPL (thus saving DPL and restoring A)
RET
; **********************************************************
; DELAY TIMER FOR BELL
; **********************************************************
RELAY_TIMER:
DJNZ TIM,GAHJ
CLR TR1
CLR RELAY
CLR ALARM
RETI
GAHJ: MOV TL1,#08H
MOV TH1,#01H
SETB TR1
RETI
; **********************************************************
; SUB SETS THE DS1307 OSCILLATOR
; **********************************************************
OSC_CONTROL:
ACALL SEND_START ; GENERATE START CONDITION
MOV A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT
ACALL SEND_BYTE ; SEND BYTE TO 1307
MOV A,#00H ; ADDRESS BYTE TO REGISTER 00H
ACALL SEND_BYTE ; SECONDS REGISTER, ALWAYS LEAVE
SETB LASTREAD ; REG 00H-BIT #7 = 0 (LOW)
ACALL SEND_STOP ; IF REG 00H-BIT #7 = 1 CLOCK
ACALL SEND_START ; OSCILLATOR IS OFF.
MOV A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT
ACALL SEND_BYTE ;
ACALL READ_BYTE ; READ A BYTE FROM THE 1307
CLR ACC.7 ; CLEAR REG 00H-BIT #7 TO ENABLE
OSC_SET: ; OSCILLATOR.
PUSH ACC ; SAVE ON STACK
ACALL SEND_STOP ;
ACALL SEND_START ;
MOV A,#DS1307W ; SETUP TO WRITE
ACALL SEND_BYTE ;
MOV A,#00H ; REGISTER 00H ADDRESS
ACALL SEND_BYTE ;
POP ACC ; GET DATA TO START OSCILLATOR
ACALL SEND_BYTE ; SEND IT
ACALL SEND_STOP
RET
; **********************************************************
; THIS SUB CONTROLS THE SQW OUTPUT 1HZ
; **********************************************************
SQW_CONTROL_1HZ:
LCALL SEND_START ; SEND START CONDITION
MOV A,#DS1307W ; SET POINTER TO REG 07H ON
; DS1307
LCALL SEND_BYTE
MOV A,#07H
LCALL SEND_BYTE
MOV A,#90H ; SQW/OUT ON AT 1HZ
JNB SQW,SQW_SET ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H ; TURN SQW/OUT OFF
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -