📄 du_追加.dt
字号:
ret
exit_jie_ma:
bc flag,erro
bc flag,F_HAVE_KEY ;pass
nop
nop
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++解码主程序 end++++
;+++++++++++++++++++++++解码子程序+++++++++++++++++++++++++++++++
;++++++++++++++
du_ma_cheng_xu:
clr REC_BUF
wait_hight:
jbc p6,IRIN
jmp hight_go_on ;+++++++++是否大于14a,大于退出
call delay_1a ;++++++++高电平pass
bc psw,c
mov a,@15 ;14a 13
sub a,REC_BUF
jbs psw,c ;大于
jmp wait_hight ;每到重检口
/*错码*/
bs flag,erro
ret
hight_go_on: ;高电平时
clr REC_BUF
hight_time:
call delay_1a ;+++++++++是否大于14a,大于退出
jbs p6,IRIN ;++++++++低电平pass
jmp one_zero
bc psw,c
mov a,@15 ;14a 13
sub a,REC_BUF
jbs psw,c ; 时间到了?,-H
jmp hight_time ;没到,重复检查口
/*错码*/
bs flag,erro
ret
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;++++++解码子程序 end+++++++++++
;+++++++++++++++++++++++识码程序+++++++++++++++++++++++++++++++++
;+++++++++++++
one_zero: ;低电平
bc psw,c
rlc tmep_code
MOV A,@0X01 ;+++++++辨别码为1或为0
MOV ADD_TIME,A ;++++++++++++大于10a为1
;+++++++++++小于10a为0 ;
mov a,@7 ;10a
bc psw,c
sub a,REC_BUF ;;
mov a,tmep_code ;保持数据
jbc psw,c ;时间到?
or a,ADD_TIME
mov tmep_code,a
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++识码程序 end+++++++++++
;++++++++++++++++++++++++++连码解决方案+++++++++++
;+++++++++++++++++++++
check_double:
jbs flag,F_CONTINUE_KEY ;辨别第一码
jmp check_lian ;接到码辨别是否一样,不一样F_HAVE_KEY生效
nop
jbs flag,F_HAVE_KEY
jmp exit_cause_ma
bc flag,F_HAVE_KEY
clr add_nop ;否则F_HAVE_KEY没效
mov a,tmep_data2
mov REC_BUF,a
mov a,REC_DATA2
bc psw,z
xor a,REC_BUF
jbs psw,z ;所接的码是否与上一次相同
ret ;不同跳转
;@@@@@@@@@@@@@@@接受累计重复的码的次数@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
jbs flag2,open_set_key
ret
inc have_many_key ;
mov a,@2
mov REC_BUF,a
mov a,have_many_key
bc psw,z
xor a,REC_BUF
jbs psw,z
jmp end_cause
clr have_many_key
bs flag,set_key_flag
ret
;@@@@@@@@@@@@@@@@@@@@@是否是连码@@@@@@@@@@@@@@@@@@@@@@@
check_lian:
jbs flag,F_HAVE_KEY ;接了一码,连码标志为生效
ret
bs flag,F_CONTINUE_KEY
mov a,REC_DATA2
mov tmep_data2,a
ret
;@@@@@@@@@@@@@@@@@@@@@是否连续测到没键@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
exit_cause_ma:
inc add_nop ;连续没有接到码,清除连码标志
mov a,@5
bc psw,c
sub a,add_nop
jbs psw,c
jmp end_cause
clr add_nop
clr have_many_key
bc flag,F_CONTINUE_KEY
bc flag,F_HAVE_KEY
nop
ret
;@@@@@@@@@@@@@@@@@@@结束键测试@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
end_cause:
bc flag,F_HAVE_KEY
ret
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
;++++++++连码解决方案+end++++++++
;++++++++++++++++++++24c02 处理程序++++++++++++++++++
;++++++++++++++++++++++++
;按照错误状态表识别SCL状态和SDA数据子程序
ERR:
JBS FLAG,ERROR ; Remain as first error encountered
MOV ADD_TIME,A ; Save error code
BS FLAG,ERROR ; Set error flag
RET
;-----------------------------------------------------------------------------
; 启动总线通信程序
; input : none
; output : initialize bus communication
;-----------------------------------------------------------------------------
;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.
BSTART:
MOV A,@0B10111111; MOV A,@0B00111111 ; Put SCL, SDA line in output state
IOW P6
MOV A,@0x00
IOW P5
bs P5,SDA ;make sure sda is high
BS P6,SCL ; Set clock high
MOV A,@1 ; Ready error status code 1
JBS P6,SCL ; Locked?
CALL ERR ; SCL locked low by device
BC P5,SDA ; SDA goes low during SCL high
NOP ; Timing adjustment
NOP
NOP
BC P6,SCL ; Start clock train
RET
nop
nop
jmp BSTART
;-----------------------------------------------------------------------------
; 启动总线通信程序
; Input : None
; Output : Bus communication, STOP condition
;-----------------------------------------------------------------------------
;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.
BSTOP:
MOV A,@0B10111111;A,@0B00111111 ; Put SCL, SDA line in output state
IOW P6
MOV A,@0x00
IOW P5
BC P5,SDA ; Return SDA to low
BS P6,SCL ; Set SCL high
nop
nop
MOV A,@1 ; Ready error code 1
JBS P6,SCL ; High?
CALL ERR ; No, SCL locked low by device
BS P5,SDA ; SDA goes from low to high during SCL high
MOV A,@4 ; Ready error code 4
MOV A,@0B00000001
IOW P5
JBS P5,SDA ; High?
CALL ERR ; No, SDA bus not release for STOP
RET
nop
nop
jmp BSTOP
; END SUB:
;-----------------------------------------------------------------------------
; 从EM78 发送数据到串行EEPROM, 一位一位子程序
; Input : None
; Output : To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
BITIN:
MOV A,@0B10111111;MOV A,@0B10111111 ; Force SDA line as input
IOW P6
mov a,@0b00000000
IOW P5
BS P5,SDA ; Set SDA for input
BC REC_BUF,DI
BS P6,SCL ; Clock high
MOV A,@1
nop
nop
/* mov a,@0B11111111
IOW p6
JBS P6,SCL ; Skip if SCL is high
JMP BIT1
JBS FLAG,ERROR ; Remain as first error encountered
MOV ADD_TIME,A ; Save error code
BS FLAG,ERROR ; Set error flag*/
BIT1:
mov a,@0b00000001
IOW P5
nop
nop
JBC P5,SDA ; Read SDA pin
BS REC_BUF,DI ; DI = 1
NOP ; Delay
BC P6,SCL ; Return SCL to low
RET
nop
nop
jmp RDBYTE
;-----------------------------------------------------------------------------
; 从串行EEPROM 接收数据, 一位一位子程序
; Input : EEPROM file
; Output : From (DO) of serial EEPROM device to PIC
;-----------------------------------------------------------------------------
BITOUT:
MOV A,@0B10111111;MOV A,@0B00111111 ; Set SDA, SCL as outputs
IOW P6
MOV A,@0x00
IOW P5
JBS REC_BUF,DO
JMP BIT0
BS P5,SDA ; Output bit 0
MOV A,@2
JBC P5,SDA ; Check for error code 2
JMP CLK1
JBS FLAG,ERROR ; Remain as first error encountered
MOV ADD_TIME,A ; Save error code
BS FLAG,ERROR ; Set error flag
JMP CLK1 ; SDA locked low by device
BIT0:
BC P5,SDA ; Output bit 0
NOP ; Delay
NOP
NOP
CLK1: BS P6,SCL
MOV A,@1 ; Error code 1
JBC P6,SCL ; SCL locked low?
JMP BIT2 ; No.
JBS FLAG,ERROR ; Yes.
MOV ADD_TIME,A ; Save error code
BS FLAG,ERROR ; Set error flag
BIT2: NOP
NOP
BC P6,SCL ; Return SCL to low
RET
nop
nop
jmp RDBYTE
;-----------------------------------------------------------------------------
; 接收数据子程序
; Input : None
; Output : RXBUF = Receive 8-bit data
;-----------------------------------------------------------------------------
RX:
MOV A,@8 ; 8 bits of data
MOV have_many_key,A
CLR tmep_data2
RXLP:
RLC tmep_data2 ; Shift data to buffer
JBS PSW,C ;SKPC
BC tmep_data2,0 ; carry ---> f(0)
JBC PSW,C ;SKPNC
BS tmep_data2,0
CALL BITIN
JBC REC_BUF,DI
BS tmep_data2,0 ; Input bit =1
DJZ have_many_key ; 8 bits?
JMP RXLP
BS REC_BUF,DO ; Set acknowledge bit = 1
CALL BITOUT ; to STOP further input
RET
nop
nop
jmp RDBYTE
;-----------------------------------------------------------------------------
; 发送数据子程序
; Input : TXBUF
; Output : Data X'mitted to EEPROM device
;-----------------------------------------------------------------------------
TX: MOV A,@8
MOV have_many_key,A
TXLP: BC REC_BUF,DO ; Shift data bit out.
JBC tmep_code,7 ; If shifted bit = 0, data bit = 0
BS REC_BUF,DO ; Otherwise data bit = 1
CALL BITOUT ; Serial data out
RLC tmep_code ; Rotate TXBUF left
JBS PSW,C ; f(6) ---> f(7)
BC tmep_code,0 ; f(7) ---> carry
JBC PSW,C ; carry ---> f(0)
BS tmep_code,0
DJZ have_many_key ; 8 bits done?
JMP TXLP
; No.
CALL BITIN ; Read acknowledge bit
MOV A,@3
JBC REC_BUF,DI ; Check for acknowledgement
CALL ERR ; No acknowledge from device
RET
nop
nop
jmp RDBYTE
;-----------------------------------------------------------------------------
; 字节写,写一个字节到EEPROM器件
; Input : DATAO= data to be written
; ADDR = destination address
; SLAVE = device address (1010xxx0)
; Output : Data written to EEPROM device
;-----------------------------------------------------------------------------
WRBYTE:
BC FLAG,ERROR
MOV A,@0xa0 ; 芯片地址
MOV tmep_code,A ; to TX buffer
CALL BSTART ; Generate START bit
CALL TX ; Output SLAVE address
MOV A,add_nop ; Get WORD address
MOV tmep_code,A ; into buffer
CALL TX ; Output WORD address
MOV A,TIMER0 ; Move DATA
MOV tmep_code,A ; into buffer
CALL TX ; Output DATA and detect acknowledgement
CALL BSTOP ; Generate STOP bit
JBC FLAG,ERROR
jmp WRBYTE
mov a,REC_DATA2
mov tmep_data2,a
ret
nop
nop
jmp WRBYTE
;-----------------------------------------------------------------------------
; 字节读,从EEPROM器件读一个字节
; Input : ADDR = source address
; SLAVE = device address (1010xxx0)
; Output : DATAI = data read from serial EEPROM
;-----------------------------------------------------------------------------
RDBYTE:
BC FLAG,ERROR
MOV A,@0xa0 ; 芯片地址
MOV tmep_code,A ; into buffer (R/W = 0)
CALL BSTART ; Generate START bit
CALL TX ; Output SLAVE address. Check ACK.
MOV A,add_nop ; Get WORD address
MOV tmep_code,A
CALL TX ; Output WORD address. Check ACK.
CALL BSTART ; START READ (if only one device is
MOV A,@0xa1 ; connected to the I2C bus)
MOV tmep_code,A
BS tmep_code,0 ; Specify READ mode (R/W = 1)
CALL TX ; Output SLAVE address
CALL RX ; READ in data and acknowledge
CALL BSTOP ; Generate STOP bit
JBC FLAG,ERROR
jmp RDBYTE
MOV A,tmep_data2 ; Save data from buffer
MOV TMEP_CI,A ; to DATAI file.
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++end+24c02 处理程序++++++++++++
;++++++++++++++++++++++++++设键程序+++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++
SET_KEY:
bc flag,set_key_flag
bc flag2,open_set_key
bs flag,F_CONTINUE_KEY
nop
NOP
;******第一个按键设定*********
SET_KEY1:
jbs flag2,set_key_one ;辨别set_ma标志
jmp SET_KEY2
mov a,tmep_data2
mov REC_DATA2,a
nop
nop
BC FLAG,F_HAVE_KEY ; 清掉标志位
MOV A,REC_DATA0
MOV TIMER0,A
MOV A,@0x10
MOV add_nop,A
CALL WRBYTE
call delay_1ms
nop
nop
MOV A,REC_DATA1
MOV TIMER0,A
MOV A,@0x11
MOV add_nop,A
CALL WRBYTE
call delay_1ms
nop
nop
MOV A,REC_DATA2
MOV TIMER0,A
MOV A,@0x12
MOV add_nop,A
CALL WRBYTE
call delay_1ms
nop
nop
; call read24c02
;*****第二个按键设定***********
SET_KEY2:
nop
nop
jbs flag2,set_key_two ;辨别set_ma标志
jmp SET_KEY3
mov a,tmep_data2
mov REC_DATA2,a
BC FLAG,F_HAVE_KEY
nop
nop
MOV A,REC_DATA0
MOV TIMER0,A
MOV A,@0x13
MOV add_nop,A
CALL WRBYTE
call delay_1ms
nop
nop
MOV A,REC_DATA1
MOV TIMER0,A
MOV A,@0x14
MOV add_nop,A
CALL WRBYTE
call delay_1ms
nop
nop
MOV A,REC_DATA2
MOV TIMER0,A
MOV A,@0x15
MOV add_nop,A
CALL WRBYTE
call delay_1ms
nop
nop
; call read24c02
;*****第3个按
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -