📄 aaa.txt
字号:
goto Service_Cp_data_read
;-------------------------------------
Cp_data_write
goto Service_Cp_data_write
;-------------------------------------
Temperature_read
bsf stateflags, TEMP_READ
goto Service_Temperature_access
;-------------------------------------
Temperature_write
bcf stateflags, TEMP_READ
goto Service_Temperature_access
;-------------------------------------
ADC_read
bsf stateflags, ADC_READ
goto Service_ADC_access
;-------------------------------------
ADC_write
bcf stateflags, ADC_READ
goto Service_ADC_access
;-------------------------------------
Get_version
; Create response packet
movlw low (response_packet)
movwf FSR
movlw 0x52
movwf INDF
movlw low (response_packet+D'5')
movwf FSR
movlw 0x01 ; version 1
movwf INDF
incf FSR, F ; 28.02.2002
movlw 0x28
movwf INDF
incf FSR, F
movlw 0x02
movwf INDF
incf FSR, F
movlw 0x20
movwf INDF
incf FSR, F
movlw 0x02
movwf INDF
call Send_packet
goto Serial_loop
;-------------------------------------
LCD_read
bsf stateflags, LCD_READ
goto Service_LCD_access
;-------------------------------------
LCD_write
bcf stateflags, LCD_READ
goto Service_LCD_access
;-------------------------------------
I2C_Error
; send the error packet to the computer
call I2C_Stop
movlw low (error_packet)
movwf FSR
movlw 0x45
movwf INDF
movlw low (error_packet+D'78')
movwf FSR
movlw 0xF2
movwf INDF
call Send_packet
goto Serial_loop
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++
I2C_Send_address
call I2C_Start
movf busaddress, W
call I2C_Write ; send slave address + r/w
banksel SSPCON2
btfsc SSPCON2, ACKSTAT
retlw 0x01 ; ack not received send error code
movlw low (command_packet+D'2')
movwf FSR
movf INDF, W
btfsc stateflags, SHORT_ADDR
goto LO_only
call I2C_Write ; send address HI
banksel SSPCON2
btfsc SSPCON2, ACKSTAT
retlw 0x01 ; ack not received send error code
LO_only
incf FSR, F
movf INDF, W
call I2C_Write ; send address LO
banksel SSPCON2
btfsc SSPCON2, ACKSTAT
retlw 0x01 ; ack not received send error code
retlw 0x00
;+++++++++++++++++++++++++++++++++++++
I2C_Read_data
call I2C_Stop
call I2C_Start ; start again
bsf busaddress, 0x00; change to read
movf busaddress, W
call I2C_Write ; send slave address + r/w
banksel SSPCON2
btfsc SSPCON2, ACKSTAT
retlw 0x01 ; ack not received send error code
movlw low (command_packet+D'4')
movwf FSR
movf INDF, W
movwf looptemp
incf FSR, F ; buffer pointer now at data start
RD_loop
call I2C_Read
movwf INDF
incf FSR, F
decfsz looptemp, F
goto Ack_RD
call I2C_Nack
call I2C_Stop
retlw 0x00 ; OK no error
Ack_RD
call I2C_Ack
goto RD_loop
;+++++++++++++++++++++++++++++++++++++
I2C_Write_data
movlw low (command_packet+D'4')
movwf FSR
movf INDF, W
movwf looptemp
incf FSR, F ; buffer pointer now at data start
WD_loop
movf INDF, W
incf FSR, F
call I2C_Write
banksel SSPCON2
btfsc SSPCON2, ACKSTAT
retlw 0x01 ; ack not received send error code
decfsz looptemp, F
goto WD_loop
call I2C_Stop
retlw 0x00
;+++++++++++++++++++++++++++++++++++++
;......................................
Service_Memory_access
; check that the count is between 1-64
movlw D'64'
movwf maxcount
call Check_count_range
; Generate the I2C bus address
movlw B'10100000'
movwf busaddress
movlw low (command_packet+D'2')
movwf FSR
btfsc INDF, 0x07 ; if highest set use bank 2
bsf busaddress, 0x02
bcf stateflags, SHORT_ADDR
call I2C_Send_address
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
btfss stateflags, MEM_READ
goto W_operation_mem
call I2C_Read_data
goto Go_on_mem
W_operation_mem
call I2C_Write_data
Go_on_mem
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
; change command packet to a response packet
movlw low (command_packet)
movwf FSR
movlw 0x52
movwf INDF
call Send_packet
goto Serial_loop
;......................................
Service_Clock_access
; check that the count is between 1-16
movlw D'16'
movwf maxcount
call Check_count_range
banksel busaddress
movlw B'10100010'
movwf busaddress
bsf stateflags, SHORT_ADDR
call I2C_Send_address
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
btfss stateflags, CLK_READ
goto W_operation_clk
call I2C_Read_data
goto Go_on_clk
W_operation_clk
call I2C_Write_data
Go_on_clk
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
; change command packet to a response packet
movlw low (command_packet)
movwf FSR
movlw 0x52
movwf INDF
call Send_packet
goto Serial_loop
;......................................
Service_Temperature_access
; let the user be responsible to provide
; the right number off bytes to read/write
; check that the count is between 1-2
movlw D'2'
movwf maxcount
call Check_count_range
; now create the busaddress for the selected sensor
movlw low (command_packet+D'2')
movwf FSR
movf INDF, W
movwf busaddress
bcf STATUS, C
rlf busaddress, F
movlw B'10010000'
iorwf busaddress, F
bsf stateflags, SHORT_ADDR
call I2C_Send_address
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
btfss stateflags, TEMP_READ
goto W_operation_temp
call I2C_Read_data
goto Go_on_temp
W_operation_temp
call I2C_Write_data
Go_on_temp
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
; change command packet to a response packet
movlw low (command_packet)
movwf FSR
movlw 0x52
movwf INDF
call Send_packet
goto Serial_loop
;......................................
Service_ADC_access
; check that the count is between 1-64
movlw D'64'
movwf maxcount
call Check_count_range
movlw B'10011110'
movwf busaddress
bsf stateflags, SHORT_ADDR
call I2C_Send_address
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
btfss stateflags, ADC_READ
goto W_operation_ADC
call I2C_Read_data
goto Go_on_ADC
W_operation_ADC
call I2C_Write_data
Go_on_ADC
movwf temp
movf temp, F ; check if zero
btfss STATUS, Z
goto I2C_Error
; change command packet to a response packet
movlw low (command_packet)
movwf FSR
movlw 0x52
movwf INDF
call Send_packet
goto Serial_loop
;......................................
Service_Cp_data_read
; check that the count is between 1-64
movlw D'64'
movwf maxcount
call Check_count_range
banksel EECON1
bcf EECON1, EEPGD
movlw low (command_packet+D'3')
movwf FSR
movf INDF, W
banksel EEADR
movwf EEADR
movlw low (command_packet+D'4')
movwf FSR
movf INDF, W
movwf looptemp
incf FSR, F ; now points to start of data area
DR_loop
banksel EECON1
bsf EECON1, RD ; initiate the read
banksel EEDATA
movf EEDATA, W
movwf INDF
incf FSR, F
incf EEADR, F
decfsz looptemp, F
goto DR_loop
; convert to response packet
movlw low (command_packet)
movwf FSR
movlw 0x52
movwf INDF
call Send_packet
goto Serial_loop
;......................................
Service_Cp_data_write
; this is time consuming if high datacount
; is used (written byte by byte)
; check that the count is between 1-64
movlw D'64'
movwf maxcount
call Check_count_range
banksel EECON1
bcf EECON1, EEPGD
bsf EECON1, WREN
movlw low (command_packet+D'3')
movwf FSR
movf INDF, W
banksel EEADR
movwf EEADR
movlw low (command_packet+D'4')
movwf FSR
movf INDF, W
movwf looptemp
incf FSR, F ; now points to start of data area
DW_loop
movf INDF, W
banksel EEDATA
movwf EEDATA
banksel EECON2
movlw 0x55 ; required sequence
movwf EECON2
movlw 0xAA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -