📄 main02.asm
字号:
XDEF Entry, main
Include 'jl8_registers.inc'
Include 'gpregister.inc'
; code section
MyCode: SECTION
main:
Entry:
dummyVector:
rsp ; reset stack pointer
jsr initRAM
jsr initSPR
jsr parameterRead
mainLoop
cli
sta COPCTL ; COP
jsr display
jsr levoutSet
jsr keypad
jsr sample
jsr dataDispose
jsr parameterSave
mainEnd
brclr 1,flag,mainEnd
bclr 1,flag
jsr time
BRA mainLoop ; endless loop
; -------------------------------------
; initialize RAM
; -------------------------------------
initRAM:
ldhx #$60
initLP00:
clr ,x
incx
cpx #$f0
blo initLP00
lda #$08
sta dispBuf0
sta dispBuf1
sta dispBuf2
rts
; -------------------------------------
; initialize special register
; -------------------------------------
initSPR
; -----I/O-------
lda #$c0 ; PORTB.6 7 output
sta PORTB
sta DDRB
mov #$1f,PORTD
mov #$e0,DDRD
clr PDCR ; disable PTD pull-up device
mov #$90,DDRA
bclr SCL,PORTA ; setting PORTA.SCL low
mov #$0f,PTAUE ; PORTA.0~3 pull-up enable
clr KBIER ; disable kaypad interrupt
; -----initialize TIM2---------
mov #%01100000,T2SC ; enable TIM overflow interrupt
mov #$0d,T2MODH
mov #$00,T2MODL ; set timeout 3.3ms
bclr 5,T2SC ; TIM active
bset 4,T2SC ; reset TIM
; ----------config------
lda #$0
sta CONFIG1
lda #$10 ; Vlvr5=4.25V
sta CONFIG2
rts
; -------------------------------------
; time base subroutine
; -------------------------------------
time
inc timeBase
lda #$32
cmp timeBase
bls timeLP01
rts
timeLP01
clr timeBase
inc timeBaseS
lda #$3C
cmp timeBaseS
bls timeLP02
rts
timeLP02
clr timeBaseS
inc timeBaseM
lda #$3C
cmp timeBaseM
bls timeLP03
rts
timeLP03
clr timeBaseM
lda #$ff
cmp timeBaseH
bls timeLP04
inc timeBaseH
timeLP04
rts
; -------------------------------------
; display time(timeBaseM:timeBaseS)
; -------------------------------------
display
brset 7,sampleFlag,errDisp
lda sampleCode
and #$0f
sta dispBuf2
lda quotient
and #$0f
sta dispBuf0
lda quotient
and #$f0
nsa
sta dispBuf1
rts
errDisp:
lda errCode
and #$0f
sta dispBuf0
lda errCode
and #$f0
nsa
sta dispBuf1
mov #$0e,dispBuf2
rts
; -------------------------------------
; data dispose if sample end
; -------------------------------------
dataDispose:
brset 1,sampleFlag,dataLP00
rts
; -----sample end,needed data dispose
dataLP00
bclr 1,sampleFlag
bclr 7,sampleFlag ; clear sample fault
ldx #$0f
tst TMSTR ; test
beq noErrorLP01
bset 7,sampleFlag ; TMSTR result too high err
mov #$03,errCode ; TMSTR>0,fault
rts
; ---------------TMRES/TMSTR----------------
noErrorLP01:
lda TMRES
cmp TMSTR+1 ; TMRES-TMSTR
bhi dataLP01
brset 7,TMRES,dataLP01
dbnzx noErrLP02
dataLP01
stx sampleCode
lsr TMRES
ror TMRES+1
ldhx TMRES
txa
ldx TMSTR+1
div
sta quotient
bcs errLP02
rts
noErrLP02
lsl TMRES+1
rol TMRES
bra noErrorLP01
errLP01
bset 7,sampleFlag
mov #$04,errCode
rts
errLP02
bset 7,sampleFlag
mov #$05,errCode
rts
; -------------------------------------
; sample,measurement charge time
; -------------------------------------
sample
inc sampleCounter
lda #$40
cmp sampleCounter
beq sampleStart ; sampleCounter=80,
bhi dischargeLP00 ; discharge capacitor
dec sampleCounter ; >80,no operation
rts
sampleStart
bclr 4,DDRD ; setting channel 0 input
bclr 7,T1SC
mov #$42,T1SC ; TIM1 reset,prescale=1/8
lda #$ff
sta T1MODH
sta T1MODL
sei ; disable interrupt
brclr 0,sampleFlag,resCharge ; sampleFlag.0=0,res charge
thermiCharge:
mov #%01000100,T1SC0 ; input capture,capture on rising edge
bset thermi,PORTD ; charge
bset thermi,DDRD
bset 4,T1SC ; reset TIM1
bclr 6,sampleFlag
cli ; enable interrupt
rts
resCharge:
mov #%01000100,T1SC0 ; input capture,capture on rising edge
bset stdRes,PORTD ; charge
bset stdRes,DDRD
bset 4,T1SC ; reset TIM1
bclr 6,sampleFlag
cli ; enable interrupt
rts
; ---------dispcharge capacitor-------
dischargeLP00:
lda #$1
cmp sampleCounter
beq dischargeLP01
rts
dischargeLP01
clr T1SC
bclr thermi,DDRD
bclr stdRes,DDRD ; as input
mov #$0,T1SC0
bset 4,DDRD
bclr 4,PTD
rts
; -------------------------------------
; parameter save
; -------------------------------------
parameterSave
brset 6,eepFlag,saveLP00
brclr 7,eepFlag,saveRts ; eepRom save flag
bclr 7,eepFlag
mov #$08,counterByte
ldhx #sc
mov #$1,addrEEPROM
jsr writeBytes
saveRts
rts
saveLP00
bclr 6,eepFlag
mov #$01,counterByte
clr addrEEPROM
ldhx #settemp
jsr writeBytes
rts
; -------------------------------------
; parameter meter
; -------------------------------------
parameterRead
jsr BSTART
lda #$a0
jsr TXIIC ; slave address write
clra
jsr TXIIC ; EEPROM address
; -------------
jsr BSTART
lda #$A1
jsr TXIIC
; ------------- ; initialize register
ldhx #settemp
mov #$08,counterByte
readLP00:
jsr RXIIC
sta ,x
dbnz counterByte,readLP01
nop
jsr BSTOP
rts
readLP01:
incx
clc
jsr BITOUT ; send ACK bit
bra readLP00
; -------------------------------------
; write 8 bytes to IIC device
; input:addrEEP(EEPROM address),counterByte,x
; output:
; -------------------------------------
writeBytes
jsr BSTART
lda #$a0 ; slave address write
jsr TXIIC
lda addrEEPROM ; EEPROM address
jsr TXIIC
writeLP00:
lda ,x
jsr TXIIC
incx
dbnz counterByte,writeLP00
nop
jsr BSTOP
rts
; -------------------------------------
; transmit 8-bit data
; input:ACC
; output:
; -------------------------------------
TXIIC
pshx
ldx #$08
txLP00:
rola ; ACC.7 -->C
jsr BITOUT
dbnzx txLP00
nop
; transmit over,then receive ACK
jsr BITIN
bcc txLP01
bset 0,eepFlag ; no acknowledge
mov #$06,errCode
txLP01
pulx
rts
; ---------------------------------
; receive 8-bit data
; input:none
; output:ACC
; ---------------------------------
RXIIC
lda #$01
rxLP00
jsr BITIN
rola
bcc rxLP00
rts
; ---------------------------------
; single bit receive
; input:none
; output:C
; ---------------------------------
BITIN
bclr SDA,DDRA ; SDA input,ready for receive bit
bset SCL,PORTA
jsr bitDelay
clc ; clear bit C
brclr SDA,PORTA,bitinLP00
sec
bitinLP00
bclr SCL,PORTA
rts
; ---------------------------------
; single bit transmit
; input:C
; output:none
; ---------------------------------
BITOUT
bcc bitout0
bitout1:
bclr SDA,DDRA ; SDA input(pull-up -->1)
bra bitoutLP00
bitout0:
bset SDA,DDRA
bclr SDA,PORTA ; SDA output 0
nop
bitoutLP00
bset SCL,PORTA
jsr bitDelay
bclr SCL,PORTA
rts
; ---------------------------------
; IIC start bit generation
; ---------------------------------
BSTART
bclr SDA,DDRA ; SDA input(pull-up -->1)
bset SCL,PORTA ; SCL=1
jsr bitDelay
bset SDA,DDRA
bclr SDA,PORTA ; SDA output 0
jsr bitDelay
bclr SCL,PORTA ; SCL=0
rts
; ---------------------------------
; IIC stop bit generation
; ---------------------------------
BSTOP
bset SDA,DDRA
bclr SDA,PORTA ; SDA output 0
bset SCL,PORTA
jsr bitDelay
bclr SDA,DDRA ; SDA input(pull-up -->1)
bclr SCL,PORTA
rts
; ---------------------------------
; bit delay
; ---------------------------------
bitDelay
nop
rts
; -------------------------------------
; -------------------------------------
keypad
lda PORTA
ora #$f0
inca
beq nokeyLP00
clr nokeyCounter
clr nokeyCounter+1
bclr 0,keyFlag ; no any key 60S flag
brset 0,PORTA,keyLP000
; ---------------------
ldhx keySet
sthx keyTemp
mov keySet+2,keyTemp+2
jsr keypadSub
ldhx keyTemp ; subroutine
sthx keySet
mov keyTemp+2,keySet+2
bra keyLP00
keyLP000
clr keySet
clr keySet+1
clr keySet+2
keyLP00:
brset 1,PORTA,keyLP010
; ---------------------
ldhx keyUp
sthx keyTemp
mov keyUp+2,keyTemp+2
jsr keypadSub
ldhx keyTemp ; subroutine
sthx keyUp
mov keyTemp+2,keyUp+2
bra keyLP01
keyLP010
clr keyUp
clr keyUp+1
clr keyUp+2
keyLP01:
brset 2,PORTA,keyLP020
; ---------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -