📄 po.asm
字号:
QW6: CJNE R2,#06H,QW7 ;Fan Speed 6
MOV TL0,#0FFH
MOV TH0,#0F9H
SETB TR0
RETI
QW7: CJNE R2,#07H,QW8 ;Fan Speed 7
MOV TL0,#0FFH
MOV TH0,#0FAH
SETB TR0
RETI
QW8: CJNE R2,#08H,QW9 ;Fan full Speed
CLR TR0
CLR FAN
QW9: RETI
; ---------==========----------==========---------=========---------
; Timer 0 routine
; ---------==========----------==========---------=========---------
TRIGGER:
CLR FAN
CLR TR0
RETI
; ---------==========----------==========---------=========---------
; Main routine. Program execution starts here.
; ---------==========----------==========---------=========---------
MAIN:
MOV SP,#60H
MOV OUTPUT,#0FFH ;Switch off all devices
MOV STATUS,#00H ;Clear all devices bits
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; RESTORATION
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SETB SWITCH
JB SWITCH,NMB
MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,#05H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
CALL CREAD ;GET DATA BYTE
MOV STATUS,R1
CALL RESTORE
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; SPEED RESTORATION
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
NMB: MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,#06H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
CALL CREAD ;GET DATA BYTE
MOV SPEED,R1
CALL DISP
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SETB EX0 ; Enable external Interrupt0
CLR IT0 ; triggered by a high to low transition
SETB EX1
CLR IT1 ; triggered by a high to low transition
MOV TMOD,#11H
SETB ET0
SETB ET1
SETB EA
MOV ANS,#00H ;clear temp toggle bit
CLR NEW
LOO:
JNB NEW,LOO
CLR NEW
AJMP LOO
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; POWER RESTORE
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
RESTORE:
JB STATUS.0,UTR1
SETB OP1
AJMP MN1
UTR1: CLR OP1
MN1: JB STATUS.1,UTR2
SETB OP2
AJMP MN2
UTR2: CLR OP2
MN2: JB STATUS.2,UTR3
SETB OP3
AJMP MN3
UTR3: CLR OP3
MN3: JB STATUS.3,UTR4
SETB OP4
AJMP MN4
UTR4: CLR OP4
MN4: JB STATUS.4,UTR5
SETB OP5
AJMP MN5
UTR5: CLR OP5
MN5: JB STATUS.5,UTR6
SETB OP6
AJMP MN6
UTR6: CLR OP6
MN6: JB STATUS.6,UTR7
SETB FANL
AJMP MN7
UTR7: CLR FANL
MN7: RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 7 SEGMENT DISPLAY
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
DISP:
MOV R2,SPEED
CJNE R2,#00H,AAS1
CLR OP7
CLR OP8
CLR OP9
CLR OP10
CLR OP11
CLR OP12
SETB OP13
RET
AAS1: MOV R2,SPEED
CJNE R2,#01H,AS2
CLR OP8
CLR OP9
SETB OP7
SETB OP10
SETB OP11
SETB OP12
SETB OP13
RET
AS2: MOV R2,SPEED
CJNE R2,#02H,AS3
CLR OP7
CLR OP8
CLR OP10
CLR OP11
CLR OP13
SETB OP9
SETB OP12
RET
AS3: MOV R2,SPEED
CJNE R2,#03H,AS4
CLR OP7
CLR OP8
CLR OP9
CLR OP10
CLR OP13
SETB OP11
SETB OP12
RET
AS4: MOV R2,SPEED
CJNE R2,#04H,AS5
CLR OP8
CLR OP9
CLR OP12
CLR OP13
SETB OP7
SETB OP10
SETB OP11
RET
AS5: MOV R2,SPEED
CJNE R2,#05H,AS6
CLR OP7
CLR OP9
CLR OP10
CLR OP12
CLR OP13
SETB OP8
SETB OP11
RET
AS6: MOV R2,SPEED
CJNE R2,#06H,AS7
CLR OP7
CLR OP9
CLR OP10
CLR OP11
CLR OP12
CLR OP13
SETB OP8
RET
AS7: MOV R2,SPEED
CJNE R2,#07H,AS8
CLR OP7
CLR OP8
CLR OP9
SETB OP10
SETB OP11
SETB OP12
SETB OP13
RET
AS8: MOV R2,SPEED
CJNE R2,#08H,AS9
CLR OP7
CLR OP8
CLR OP9
CLR OP10
CLR OP11
CLR OP12
CLR OP13
AS9: RET
;***********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR
; to the EEPROM and includes START condition. Refer to the data sheets
; for discussion of START and STOP conditions.
;***********************************************************************
OUTS: MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
SETB SDA ;INSURE DATA IS HI
SETB SCL ;INSURE CLOCK IS HI
NOP ;NOTE 1
NOP
NOP
CLR SDA ;START CONDITION -- DATA = 0
NOP ;NOTE 1
NOP
NOP
CLR SCL ;CLOCK = 0
OTSLP: RLC A ;SHIFT BIT
JNC BITLS
SETB SDA ;DATA = 1
JMP OTSL1 ;CONTINUE
BITLS: CLR SDA ;DATA = 0
OTSL1: SETB SCL ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL ;CLOCK LOW
DJNZ R2,OTSLP ;DECREMENT COUNTER
SETB SDA ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
CLR SCL
RET
;**********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM
; without sending a START condition.
;**********************************************************************
OUT: MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
OTLP: RLC A ;SHIFT BIT
JNC BITL
SETB SDA ;DATA = 1
JMP OTL1 ;CONTINUE
BITL: CLR SDA ;DATA = 0
OTL1: SETB SCL ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL ;CLOCK LOW
DJNZ R2,OTLP ;DECREMENT COUNTER
SETB SDA ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
CLR SCL
RET
STOP: CLR SDA ;STOP CONDITION SET DATA LOW
NOP ;NOTE 1
NOP
NOP
SETB SCL ;SET CLOCK HI
NOP ;NOTE 1
NOP
NOP
SETB SDA ;SET DATA HIGH
RET
;*******************************************************************
; THIS ROUTINE READS A BYTE OF DATA FROM EEPROM
; From EEPROM current address pointer.
; Returns the data byte in R1
;*******************************************************************
CREAD: MOV A,#RDCMD ;LOAD READ COMMAND
CALL OUTS ;SEND IT
CALL IN ;READ DATA
MOV R1,A ;STORE DATA
CALL STOP ;SEND STOP CONDITION
RET
;**********************************************************************
; THIS ROUTINE READS IN A BYTE FROM THE EEPROM
; and stores it in the accumulator
;**********************************************************************
IN: MOV R2,#8 ;LOOP COUNT
SETB SDA ;SET DATA BIT HIGH FOR INPUT
INLP: CLR SCL ;CLOCK LOW
NOP ;NOTE 1
NOP
NOP
NOP
SETB SCL ;CLOCK HIGH
CLR C ;CLEAR CARRY
JNB SDA,INL1 ;JUMP IF DATA = 0
CPL C ;SET CARRY IF DATA = 1
INL1: RLC A ;ROTATE DATA INTO ACCUMULATOR
DJNZ R2,INLP ;DECREMENT COUNTER
CLR SCL ;CLOCK LOW
RET
;*********************************************************************
; This routine test for WRITE DONE condition
; by testing for an ACK.
; This routine can be run as soon as a STOP condition
; has been generated after the last data byte has been sent
; to the EEPROM. The routine loops until an ACK is received from
; the EEPROM. No ACK will be received until the EEPROM is done with
; the write operation.
;*********************************************************************
ACKTST: MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
CLR SDA ;START CONDITION -- DATA = 0
NOP ;NOTE 1
NOP
NOP
CLR SCL ;CLOCK = 0
AKTLP: RLC A ;SHIFT BIT
JNC AKTLS
SETB SDA ;DATA = 1
JMP AKTL1 ;CONTINUE
AKTLS: CLR SDA ;DATA = 0
AKTL1: SETB SCL ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL ;CLOCK LOW
DJNZ R2,AKTLP ;DECREMENT COUNTER
SETB SDA ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
JNB SDA,EXIT ;EXIT IF ACK (WRITE DONE)
JMP ACKTST ;START OVER
EXIT: CLR SCL ;CLOCK LOW
CLR SDA ;DATA LOW
NOP ;NOTE 1
NOP
NOP
SETB SCL ;CLOCK HIGH
NOP
NOP
SETB SDA ;STOP CONDITION
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -