⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aaa.txt

📁 pic系列单片机得控制程序 主要进行温度采集和转换控制
💻 TXT
📖 第 1 页 / 共 3 页
字号:
        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 + -