$MOD51
DSEG AT 8
Temp: DS 4 ;RAM bajtowa
Oper: DS 4
StackCount: DS 1
DSEG AT 20h ;4 bajty RAM bitowej
DOTS: DS 1
KbStat: DS 1
BF2: DS 1 ;nie uzywane jako bajt
DisplayStatus: DS 1
DispBuff: DS 4 ;dcn RAM bajtowej
ValBuff: DS 2
ADCStatus: DS 1
Tmp: DS 1 ;nie uzywane
BitCnt: DS 1
KbTmp: DS 1 ;nie uzywane
KbCnt: DS 1 ;licznik opoznienia klawiszy
Cnt2s: DS 1
ToKbCnt: DS 1
KbStatBak: DS 1
Hour: DS 1
Min: DS 1
Val1Cnt: DS 1
Val2Cnt: DS 1
Val3Cnt: DS 1
PowSavCntDn: DS 1
ACVoltage: DS 1
ACCurrent: DS 1
ACTemperature1: DS 1
ACTemperature2: DS 1
BSEG
DOT0: DBIT 1
DOT1: DBIT 1
DOT2: DBIT 1
DOT3: DBIT 1
BSEG AT 11
KB_T1_UP: DBIT 1
KB_U_I: DBIT 1
BSEG AT 13
KB_ZEGAR: DBIT 1
BSEG AT 15
KB_T2_DOWN: DBIT 1
BSEG AT 16
bAllowMeasure: DBIT 1
bSwapTmp: DBIT 1
bMoreThan2s: DBIT 1
bSetClock: DBIT 1
bBlinker: DBIT 1
bPowerSave: DBIT 1
BSEG AT 24
DSB_CLOCK: DBIT 1
DSB_TEMP1: DBIT 1
DSB_TEMP2: DBIT 1
DSB_VOLTA: DBIT 1
DSB_CURRE: DBIT 1
; WL1 EQU P3.3 ;przyciski
; WL2 EQU P3.4
; WL3 EQU P3.5
; WL4 EQU P3.7
SIPODAT EQU P1.6 ;sygnaly 74HC164
SIPOCLK EQU P1.7
K1 EQU P1.4 ;LEDy
K2 EQU P1.5
K3 EQU P1.3
K4 EQU P1.2
ADCCLK EQU P3.1 ;sygnaly ADC0834
DI EQU P3.0
DO EQU P3.0
ADCCS EQU P3.2
DS_CLOCK EQU 1 ;wartosci do DisplayStatus
DS_TEMP1 EQU 2
DS_TEMP2 EQU 4
DS_VOLTA EQU 8
DS_CURRE EQU 16
; IS_TEMP1 EQU 00000011b ;nie uzywane
; IS_TEMP2 EQU 00000111b ;nie uzywane
; IS_VOLTA EQU 00001011b ;nie uzywane
; IS_CURRE EQU 00001111b ;nie uzywane
ACS_VOLTA EQU 11 ;00001011b
ACS_CURRE EQU 15 ;00001111b
ACS_TEMP1 EQU 3 ;00000011b
ACS_TEMP2 EQU 7 ;00000111b
;ponizsze wartosci jako krotnosci 9.6ms, najmniejsza wartosc 2
TimeValMax EQU 54
; TimeValMin EQU 5
TimeVal2s EQU 156
TenMinVal EQU 10
DivVal1 EQU 250
DivVal2 EQU 8
DivVal3 EQU 120
CSEG AT 0000H
LJMP Start
RstIn:
ACALL Init ;przerwanie IE0
MLoop:
ACALL MainLoop
SJMP MLoop
ORG 0Bh ;przerwanie timera T0
AJMP OvT0
Start:
MOV R0,#3Fh ;reset RAM
CLR A
ResetRAM:
MOV @R0,A
DJNZ R0,ResetRAM
MOV SP,#3Bh ;wskaznik stosu
LJMP RstIn
ORG 1Bh ;przerwanie timera T1
AJMP OvT1
TempCalc:
MOV R3,07h ;przechowaj w R3 zawartosc R7
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
ACALL Push32 ;long ADC na stos
MOV R7,#079h ;laduj 633 do R4 - R7
MOV R6,#02
MOV R5,#0
MOV R4,#0
ACALL Mul32 ;mnozenie long 633*ADC
ACALL Push32 ;iloczyn na stos
MOV R7,03h ;long ADC z R3
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
ACALL Push32 ;long ADC na stos
MOV R7,#00Ch ;laduj 1036 do R4 - R7
MOV R6,#04
MOV R5,#0
MOV R4,#0
ACALL Sub32 ;odjecie od 1036 long ADC
ACALL Div32 ;iloczyn/roznica
ACALL Pop32
MOV Temp+3,R7
MOV Temp+2,R6
MOV Temp+1,R5
MOV Temp,R4
RET
;*******************************************************************
INIT:
CLR bMoreThan2s
MOV TMOD,#12h ;T0 - 8 bit;T1 - 16 bit
MOV TH1,#256-19 ;ok 200Hz @12MHz
MOV TH0,#256-250
MOV TL0,#256-250
MOV IE,#8Ah ;T0+T1+EA
MOV TCON,#50h ;start T1 i T0
MOV ValBuff,#0
MOV ValBuff+1,#0
MOV DOTS,#0
MOV Hour,#0
MOV Min,#0
MOV Val1Cnt,#DivVal1 ;#250
MOV Val2Cnt,#DivVal2 ;#8
MOV Val3Cnt,#DivVal3 ;#120
MOV KbCnt,#0
SETB bAllowMeasure
CLR bBlinker
CLR bSwapTmp
CLR bPowerSave
MOV DisplayStatus,#01
MOV PowSavCntDn,#0Ah
SETB ADCCS ;P3.2
CLR ADCCLK ;P3.1
SETB bSetClock ;13
RET
;*******************************************************************
MainLoop:
ACALL CheckKb
JNB bPowerSave,NPS
ACALL LoadDisp
TestKb:
MOV A,P3
ANL A,#0B8h
CJNE A,#0B8h,ExitPS
SJMP TestKb
ACALL WaitFreeKey
ExitPS:
CLR bPowerSave
NPS:
JBC bAllowMeasure,SMeasure
ACALL LoadDisp
SJMP MainLoop
SMeasure:
ACALL MeasureAll
ACALL LoadDisp
SJMP MainLoop
;*******************************************************************
CheckKb:
ACALL CheckFreeKey
MOV KbStatBak,KbStat ;zapamietaj stan klawiszy
JNC ExitCheckKb ;jezeli zaden nie wcisniety to wyjdz
MOV PowSavCntDn,#TenMinVal ;init power save count down
CLR bMoreThan2s
ACALL KbExecute ;wykonaj - stan klawiszy w SBKB
MOV ToKbCnt,#TimeValMax ;#36h
MOV Cnt2s,#TimeVal2s ;#9Ch
RepKb:
MOV KbCnt,ToKbCnt ;odmierzaj czas
WTV1:
ACALL CheckFreeKey
JNC ExecuteBeforeExit ;jezeli puszczone to wyjdz
MOV A,KbCnt
JNZ WTV1 ;czekaj az licznik zliczy do TimeVal1
;zliczyl - wykonaj
SETB bMoreThan2s
MOV A,Cnt2s ;sprawdz czy uplynelo 2s
JZ MoreThan2s
CPL bMoreThan2s ;nie uplynelo
MoreThan2s:
ACALL KbExecute ;wykonaj - stan klawiszy w SBKB
MOV A,ToKbCnt
MOV B,#03
MUL AB
MOV B,#04
DIV AB
MOV ToKbCnt,A ;ToKbCnt=2*ToKbCnt/3
INC ToKbCnt
SJMP RepKb
ExitCheckKb:
RET
ExecuteBeforeExit:
RET
;*******************************************************************
KbDelay:
MOV R6,#14h ;okolo 20 ms
KbDL:
DJNZ R5,$
DJNZ R6,KbDL
RET
;*******************************************************************
ReadKb: ;KbStat stan klawiatury
MOV A,P3
ANL A,#0B8h
MOV KbStat,A ;ponizej petla antyodbiciowa
ACALL KbDelay
MOV A,P3
ANL A,#0B8h
XRL A,KbStat
JNZ ReadKb
RET
;*******************************************************************
WaitFreeKey:
LCALL ReadKb
MOV A,KbStat
CJNE A,#0B8h,WaitFreeKey
RET
;*******************************************************************
CheckFreeKey:
LCALL ReadKb
MOV A,KbStat
CJNE A,#0B8h,KbPressed
CLR C
RET
KbPressed:
SETB C
RET
;*******************************************************************
KbExecute:
JNB KB_T1_UP,E_T1_UP
JNB KB_U_I,E_U_I
JNB KB_ZEGAR,E_ZEGAR
JNB KB_T2_DOWN,E_T2_DOWN
RET
E_T1_UP:
JNB bSetClock,DisplayT1
ACALL IncClockValue
ACALL LoadDisp
RET
DisplayT1:
MOV DisplayStatus,#DS_TEMP1 ;#02
ACALL LoadDisp
RET
E_U_I:
JB bSetClock,NotAllowed
JB DSB_VOLTA,SCURRE
MOV DisplayStatus,#DS_VOLTA ;#08
ACALL LoadDisp
NotAllowed:
ACALL WaitFreeKey
RET
SCURRE:
MOV DisplayStatus,#DS_CURRE
ACALL LoadDisp
ACALL WaitFreeKey
RET
E_ZEGAR:
JB bMoreThan2s,ZE2S
MOV DisplayStatus,#DS_CLOCK ;#01
ACALL LoadDisp
RET
ZE2S:
CPL bSetClock
ACALL LoadDisp
ACALL WaitFreeKey
RET
E_T2_DOWN:
JNB bSetClock,DisplayT2
ACALL DecClockValue
ACALL LoadDisp
RET
DisplayT2:
MOV DisplayStatus,#DS_TEMP2 ;#04
ACALL LoadDisp
RET
;*******************************************************************
SendToDisp: ;w A dana do wyslania na 74164 (E_16C)
MOV BitCnt,#08
SLOOP:
CLR SIPOCLK
RLC A
MOV SIPODAT,C
SETB SIPOCLK
DJNZ BitCnt,SLOOP
RET
;*******************************************************************
Pulse:
SETB ADCCLK
NOP
NOP
CLR ADCCLK
RET
;*******************************************************************
XRADC:
MOV A,ADCStatus
; sb1 os sd start
;A - wartosc do wyslania - 0 0 0 0 0 0 0 0 b
CLR ADCCLK
MOV B,#04
CLR EA ;zablokuj przerwania
CLR ADCCS
Loop1:
RRC A
MOV DI,C ;send mux
ACALL Pulse
DJNZ B,Loop1
SETB DI ;przygotuj sie na odbior
ACALL Pulse
MOV B,#08
Loop2:
MOV C,DO ;rcv dat
ACALL Pulse
RLC A
DJNZ B,Loop2
ACALL Pulse
SETB EA ;odblokuj przerwania
SETB ADCCS
RET ;w A - wartosc odebrana
;*******************************************************************
IncClockValue:
MOV A,#256-60
INC Min
ADD A,Min
JNC ICVMO
MOV Min,#0
MOV A,#256-24
INC Hour
ADD A,Hour
JNC ICVMO
MOV Hour,#0
ICVMO:
RET
;*******************************************************************
DecClockValue:
MOV A,#01
DEC Min
ADD A,Min
JNZ DCVMO
MOV Min,#3Bh
MOV A,#01
DEC Hour
ADD A,Hour
JNZ DCVMO
MOV Hour,#17h
DCVMO:
RET
;*******************************************************************
LoadDisp:
JB DSB_CLOCK,LD_CLOCK
JB DSB_TEMP1,LD_TEMP1
JB DSB_TEMP2,LD_TEMP2
JB DSB_VOLTA,LD_VOLTA
JB DSB_CURRE,LD_CURRE
LD_CLOCK:
LCALL LoadTime
LCALL ValBuffToDispBuff
RET
LD_TEMP1:
LCALL CalcT1
LCALL ValBuffToDispBuff
RET
LD_TEMP2:
LCALL CalcT2
LCALL ValBuffToDispBuff
RET
LD_VOLTA:
LCALL CalcV
LCALL ValBuffToDispBuff
RET
LD_CURRE:
LCALL CalcI
LCALL ValBuffToDispBuff
RET
;*******************************************************************
LoadTime:
MOV A,Min
LCALL ByteToBCD
MOV ValBuff,A
MOV A,Hour
LCALL ByteToBCD
MOV ValBuff+1,A
ANL A,#0F0h
JNZ LZO
MOV A,ValBuff+1
ANL A,#0Fh
ADD A,#0B0h
MOV ValBuff+1,A
LZO:
MOV DOTS,#0
JNB bBlinker,NSAD
SETB DOT2
RET
NSAD:
JNB bSetClock,NSWD
JB bBlinker,NSWD
MOV DOTS,#0FFh
NSWD:
RET
;*******************************************************************
MeasureAll:
MOV ADCStatus,#ACS_TEMP1
ACALL XRADC
MOV ACTemperature1,A
MOV ADCStatus,#ACS_TEMP2
ACALL XRADC
MOV ACTemperature2,A
MOV ADCStatus,#ACS_VOLTA
ACALL XRADC
MOV ACVoltage,A
MOV ADCStatus,#ACS_CURRE
ACALL XRADC
MOV ACCurrent,A
RET
;*******************************************************************
CalcT1:
MOV ValBuff+1,#0EBh
MOV R7,ACTemperature1
ACALL TempCalc
MOV A,R7 ;wynik w R7
CLR C
SUBB A,#06Bh ;odejmij 107
JNC T1Dodatnie
CPL A
INC A
MOV ValBuff+1,#0EAh ;znak minus
T1Dodatnie:
LCALL ByteToBCD
MOV ValBuff,A
MOV DOTS,#0
RET
;*******************************************************************
CalcT2:
MOV ValBuff+1,#0FBh
MOV ADCStatus,#07
ACALL XRADC
MOV R7,ACTemperature2
ACALL TempCalc
MOV A,R7 ;wynik w R7
CLR C
SUBB A,#06Bh ;odejmij 107
JNC T2Dodatnie
CPL A ;T2 ujemne
INC A
MOV ValBuff+1,#0FAh ;znak minus
T2Dodatnie:
LCALL ByteToBCD
MOV ValBuff,A
MOV DOTS,#0
RET
;*******************************************************************
CalcV:
MOV A,ACVoltage
MOV B,#064h
DIV AB
MOV ValBuff+1,A
MOV A,B
LCALL ByteToBCD
MOV ValBuff,A
MOV DOTS,#0
SETB DOT1
MOV A,ValBuff+1
ANL A,#0Fh
ADD A,#0C0h ;wyswietl - u
MOV ValBuff+1,A
RET
;*******************************************************************
CalcI:
MOV A,ACCurrent
MOV B,#064h
DIV AB
MOV ValBuff+1,A
MOV A,B
LCALL ByteToBCD
MOV ValBuff,A
MOV DOTS,#0
MOV A,ValBuff+1
ANL A,#0Fh
ADD A,#0D0h ;wyswietl - i
MOV ValBuff+1,A
RET
;*******************************************************************
ByteToBCD:
MOV B,#0Ah ;A/10
DIV AB
SWAP A
ADD A,B
RET
;*******************************************************************
ValBuffToDispBuff:
MOV A,ValBuff
MOV DPTR,#Conv13
ANL A,#0Fh
MOVC A,@A+DPTR
JNB DOT0,ND0
CLR ACC.4
ND0:
MOV DispBuff,A
MOV A,ValBuff+1
ANL A,#0Fh
MOVC A,@A+DPTR
JNB DOT2,ND2
CLR ACC.4
ND2:
MOV DispBuff+2,A
MOV A,ValBuff
MOV DPTR,#Conv24
SWAP A
ANL A,#0Fh
MOVC A,@A+DPTR
JNB DOT1,ND1
CLR ACC.0
ND1:
MOV DispBuff+1,A
MOV A,ValBuff+1
SWAP A
ANL A,#0Fh
MOVC A,@A+DPTR
JNB DOT3,ND3
CLR ACC.0
ND3:
MOV DispBuff+3,A
RET
;*******************************************************************
Conv13: ;0 1 2 3 4 5 6 7 8 9 - blind
DB 14h,0D7h,98h,91h,53h,31h,30h,17h,10h,11h,0FBh,0FFh
Conv24: ;0 1 2 3 4 5 6 7 8 9 - blind
DB 21h,7Dh, 13h,19h,4Dh,89h,81h,2Dh,01h,09h,0DFh,0FFh
;u i o(upper) o(down)
DB 0F1h,0F7h, 0Fh, 0D1h
;*******************************************************************
OvT1:
PUSH ACC
PUSH PSW
MOV TH1,#256-19
MOV A,#0FFh
ACALL SendToDisp
JB bPowerSave,LeaveBlank
JNB K1,BK1
JNB K2,BK2
JNB K3,BK3
JNB K4,BK4
BK1:
SETB K1
CLR K2
MOV A,DispBuff+2
SJMP Common
BK2:
SETB K2
CLR K3
MOV A,DispBuff+1
SJMP Common
BK3:
SETB K3
CLR K4
MOV A,DispBuff
SJMP Common
BK4:
CLR K1
SETB K4
MOV A,DispBuff+3
Common:
ACALL SendToDisp
LeaveBlank:
CPL bSwapTmp
JNB bSwapTmp,NotDecCnt2s
MOV A,KbCnt
JZ NotDecKbCnt
DEC KbCnt
NotDecKbCnt:
MOV A,Cnt2s
JZ NotDecCnt2s ;czy licznik rowny 0
DEC Cnt2s
NotDecCnt2s:
POP PSW
POP ACC
RETI
;*******************************************************************
OvT0:
;minimalny czas = 0:00 ;maksymalny czas = 23:59
DJNZ Val1Cnt,LeaveOvT0 ;4000 Hz
MOV Val1Cnt,#DivVal1 ;16 Hz
DJNZ Val2Cnt,LeaveOvT0
CPL bBlinker ;2 Hz
SETB bAllowMeasure
MOV Val2Cnt,#DivVal2
DJNZ Val3Cnt,LeaveOvT0 ;1/60Hz
MOV Val3Cnt,#DivVal3 ;+1min
PUSH ACC
PUSH PSW
ACALL IncClockValue
DJNZ PowSavCntDn,NotPowerSave
;SETB bPowerSave
NotPowerSave:
POP PSW
POP ACC
LeaveOvT0:
RETI
;*******************************************************************
Sub32:
CLR C
MOV A,R7
SUBB A,Oper+3
MOV R7,A
MOV A,R6
SUBB A,Oper+2
MOV R6,A
MOV A,R5
SUBB A,Oper+1
MOV R5,A
MOV A,R4
SUBB A,Oper
MOV R4,A
LJMP ShortPop32
;*******************************************************************
Mul32:
MOV A,R7
MOV R0,A
MOV B,Oper+3
MUL AB
MOV R7,A
MOV A,Oper+3
XCH A,B
XCH A,R6
MOV R1,A
MUL AB
ADD A,R6
MOV R6,A
CLR A
ADDC A,B
XCH A,R5
MOV R2,A
MOV B,R0
MOV A,Oper+2
MUL AB
ADD A,R6
MOV R6,A
MOV A,R5
ADDC A,B
MOV R5,A
CLR A
RLC A
XCH A,R4
MOV B,Oper+3
MUL AB
ADD A,R4
MOV R4,A
MOV A,Oper+2
MOV B,R2
MUL AB
ADD A,R4
MOV R4,A
MOV A,Oper+1
MOV B,R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,Oper
MOV B,R0
MUL AB
ADD A,R4
MOV R4,A
MOV B,R1
MOV A,Oper+2
MUL AB
ADD A,R5
MOV R5,A
MOV A,R4
ADDC A,B
MOV R4,A
MOV A,Oper+1
MOV B,R0
MUL AB
ADD A,R5
MOV R5,A
MOV A,R4
ADDC A,B
MOV R4,A
MOV B,R2
MOV A,Oper+3
MUL AB
ADD A,R5
MOV R5,A
MOV A,R4
ADDC A,B
MOV R4,A
LJMP ShortPop32
;*******************************************************************
Div32:
CLR A
XCH A,R4
MOV R0,A
CLR A
XCH A,R5
MOV R1,A
CLR A
XCH A,R6
MOV R2,A
CLR A
XCH A,R7
MOV R3,A
MOV B,#20h ;licznik petli
Div32Loop:
CLR C
MOV A,Oper+3
RLC A
MOV Oper+3,A
MOV A,Oper+2
RLC A
MOV Oper+2,A
MOV A,Oper+1
RLC A
MOV Oper+1,A
MOV A,Oper
RLC A
MOV Oper,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R7
SUBB A,R3
MOV A,R6
SUBB A,R2
MOV A,R5
SUBB A,R1
MOV A,R4
SUBB A,R0
JC Carry32
MOV R4,A
MOV A,R7
SUBB A,R3
MOV R7,A
MOV A,R6
SUBB A,R2
MOV R6,A
MOV A,R5
SUBB A,R1
MOV R5,A
INC Oper+3
Carry32:
DJNZ B,Div32Loop
RET
;*******************************************************************
Push32:
MOV A,StackCount
INC StackCount
JZ NoPush32
POP B
POP ACC
PUSH Oper
PUSH Oper+1
PUSH Oper+2
PUSH Oper+3
PUSH ACC
PUSH B
NoPush32:
MOV Oper+3,R7
MOV Oper+2,R6
MOV Oper+1,R5
MOV Oper,R4
RET
;*******************************************************************
Pop32:
MOV R7,Oper+3
MOV R6,Oper+2
MOV R5,Oper+1
MOV R4,Oper
ShortPop32:
MOV A,StackCount
DEC A
JZ NoPop32
POP B
POP ACC
POP Oper+3
POP Oper+2
POP Oper+1
POP Oper
PUSH ACC
PUSH B
NoPop32:
DEC StackCount
RET
;*******************************************************************
END