资源描述
#INCLUDE<P12F509.INC>
__CONFIG _OSC_IntRC&_WDT_OFF&_MCLRE_OFF&_CP_ON
#DEFINE LED2 GPIO,2
#DEFINE LED4 GPIO,4
#DEFINE KEY GPIO,5
#DEFINE SCL GPIO,1
#DEFINE SDA GPIO,0
KTM EQU 08H
KM EQU 0AH
MODE EQU 0BH
KO EQU 0CH
KEYDQ EQU 0DH
IIC_TEMP EQU 0EH
IIC_C EQU 0FH
T EQU 10H
ORG 000H
GOTO MAIN
;============================================
MAIN
CLRF GPIO
MOVLW 20H
TRIS GPIO
MOVLW 05H
OPTION;TIMER064分频,内部弱上拉
CLRF GPIO
CLRF STATUS
CLRF KTM
CLRF KM
CLRF KEYDQ
CLRF KO
CALL INIT_IIC
;----------------------------------------------
READONEBIT;读一个字节
MOVLW 20H
TRIS GPIO
CALL START
MOVLW 0A0H
CALL WRITE_IIC
MOVLW 00H
CALL WRITE_IIC
CALL START
MOVLW 0A1H
CALL WRITE_IIC
CALL READ_IIC
MOVLW 04H
SUBWF MODE,0
BTFSC STATUS,C
CLRF MODE
GOTO MLOOP
;-----------------------------------------------------------------
MLOOP
CLRF TMR0
INCF KTM,1
TABLE_MODE
MOVF MODE,0
ADDWF PCL,1
GOTO MODE0
GOTO MODE1
GOTO MODE2
GOTO MODE3
MODE0
BCF LED2
BCF LED4
GOTO MLDS
MODE1
BSF LED2
BCF LED4
GOTO MLDS
MODE2
BCF LED2
BSF LED4
GOTO MLDS
MODE3
BSF LED2
BSF LED4
GOTO MLDS
;--------------/////////////////////////////////以下按键检测
MLDS
BTFSC KEY
GOTO TAIQI
GOTO ANXIA
TAIQI
INCF KM,1
CLRF KO
MOVLW 04H
SUBWF KM,0
BTFSS STATUS,C
GOTO MLDTS
BSF KEYDQ,1
CLRF KM
GOTO MODE_TEST
ANXIA
INCF KO,1
CLRF KM
MODE_TEST
BTFSS KEYDQ,1
GOTO MLDTS
MOVLW 0AH
SUBWF KO,0;kO是否大于10,按下消抖时间是否达到50MS
BTFSS STATUS,C
GOTO MLDTS
INCF MODE,1
CLRF KTM
MOVLW 04H
SUBWF MODE,0
BTFSC STATUS,C
CLRF MODE
WT ;写一个字节
CALL START
MOVLW 0A0H
CALL WRITE_IIC
MOVLW 00H
CALL WRITE_IIC
MOVF MODE,0
CALL WRITE_IIC
CALL STOP
CLRF KO
BCF KEYDQ,1;防止一直按下,键值发生变化。按键一次清一次键值。
GOTO MLDTS
MLDTS
MOVLW 4EH;一周时间为 5MS
SUBWF TMR0,0
BTFSS STATUS,C
GOTO $-3
BCF STATUS,5
GOTO MLOOP
;======================================================================================================;---------------------------IIc子程序------------------------------------------
DELAY
MOVLW 06H
MOVWF T
DECFSZ T,1
GOTO $-1
RETURN
;---------------------------------
INIT_IIC
BSF SCL
CALL DELAY
BSF SDA
CALL DELAY
RETURN
;---------------------------------
START
BSF SDA
CALL DELAY
BSF SCL
CALL DELAY
BCF SDA
CALL DELAY
BCF SCL
CALL DELAY
RETURN
;---------------------------------
STOP
BCF SDA
CALL DELAY
BSF SCL
CALL DELAY
BSF SDA
RETURN
;---------------------------------
WRITE_IIC
MOVWF IIC_TEMP
MOVLW 08H
MOVWF IIC_C
TEMP
BCF SDA
RLF IIC_TEMP,1
BTFSC STATUS,C
BSF SDA
CALL DELAY
BSF SCL
CALL DELAY
BCF SCL
CALL DELAY
DECFSZ IIC_C,1
GOTO TEMP
GETACK
BCF SDA
MOVLW 21H
TRIS GPIO
BTFSC SDA
GOTO $-1
CALL DELAY
BSF SCL
CALL DELAY
BCF SCL
MOVLW 20H
TRIS GPIO
CALL DELAY
RETURN
;-----------------------------------
READ_IIC
MOVLW 08H
MOVWF IIC_C
MOVLW 21H
TRIS GPIO
RDTEMP
BCF STATUS,C
BTFSC SDA
BSF STATUS,C
RLF IIC_TEMP,1
CALL DELAY
BSF SCL
CALL DELAY
BCF SCL
CALL DELAY
DECFSZ IIC_C,1
GOTO RDTEMP
MASTERACK
MOVLW 20H
TRIS GPIO
BCF SCL
CALL DELAY
BSF SDA
CALL DELAY
CALL STOP
MOVF IIC_TEMP,0
MOVWF MODE
RETURN
;------------------------------------------------
END
展开阅读全文