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

📄 qcyk.asm

📁 用于汽车遥控的Ev1527的pic单片机软件接收解码程序
💻 ASM
字号:
          LIST      P=16f57
          #INCLUDE  "p16F5X.INC"
           __CONFIG _CP_OFF&_WDT_OFF&_XT_OSC
;说明:SCL接单片机   RC0
;    : SDA接单片机   RC1      
;------------------------------------------------------------         
;寄存器定义                        
;------------------------------------------------------------        
BY_COUNT  EQU 14H         ;I2C
COUNT_T0 EQU 12H                
COUNT_T1 EQU 13H
COUNT    EQU 11H
STATUS   EQU 3H
PORTB    EQU 6H
PORTC    EQU 7H
EEPROM   EQU 08H
ADDR     EQU 09H
BUFIN    EQU 0AH
BUFOUT   EQU 0BH
SLAVE    EQU 0CH
TXBUF    EQU 0DH
BIT      EQU 0EH
DLY1     EQU 0FH
DLY2     EQU 10H
;******************************************

FLAG      EQU 20H
IN_DATA_0 EQU 19H
IN_DATA_1 EQU 1AH
IN_DATA_2 EQU 1BH
COUNTER0	EQU	15H				;计数器
COUNTER1	EQU	16H
COUNTER2	EQU	17H
COUNTER3	EQU	18H
CAR_STATUS	EQU 1CH				;	
W_SHADOW	EQU 1DH				;函数调用时传送参数
COUNTER		EQU 1EH		
		 
DATA1       EQU 1FH         ;保留四位按键信息
DEVICE_W	EQU B'10100000'		;
DEVICE_R	EQU B'10100001'		;
		
ADR_LOCK	EQU 0x00			;存储器锁门指令入口
ADR_UNLOCK	EQU 0x10			;存储器开门指令入口
		
DATA_2		EQU	B'11001111'
DATA_1		EQU	B'00100111'
DATA_U		EQU	B'10111000'
DATA_L		EQU	B'10110100'
		;都为反码 与上位机通信
COMC_LOCK	EQU	B'11110111'		;开锁指令 		00001000B	
COMC_UNLOCK	EQU	B'11110001'		;锁门指令 		00001110B
COMC_RELAY	EQU	B'11110010'		;继电器指令		00001101B
PORTA_S	EQU	B'11110001'
DI       EQU 7
DO       EQU 6
SDA      EQU 1
SCL      EQU 0
ACKF     EQU 0


;--------------------------------------------------------------   
;定义管脚         
;-------------------------------------------------------------
          #define    STUDY    PORTC,6
          #define    SIGNAL   PORTC,3
          #define    LIGHT    PORTC,5
         
          
          ORG      00H
          GOTO     INT_INIT
;**********************
BSTART 
       BSF    PORTC,SDA
       BSF    PORTC,SCL 
       MOVLW  B'11001000'
       TRIS   PORTC
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       BCF    PORTC,SDA
       NOP
       NOP
       NOP
       NOP
       NOP
       BCF    PORTC,SCL
       NOP
       NOP
       RETLW  0
;**********************
BSTOP
       BCF    PORTC,SDA
       MOVLW  B'11001000'
       TRIS   PORTC
       BCF    PORTC,SDA
       NOP
       NOP
       NOP
       BSF    PORTC,SCL
       NOP
       NOP
       NOP
       BSF    PORTC,SDA
       NOP
       NOP
       BCF    PORTC,SCL
       NOP
       NOP
       RETLW  0
;**********************
TX     
       MOVLW  D'8'
       MOVWF  BIT
TXLP   BCF    EEPROM,DO
       BTFSC  TXBUF,7
       BSF    EEPROM,DO
       CALL   BITOUT
       RLF    TXBUF,1
       DECFSZ BIT,1
       GOTO   TXLP
       CALL   BITIN
       BTFSC  EEPROM,DI
       BSF    PORTC,ACKF
       RETLW  0
;************************
RX
       CLRF   BUFIN
       MOVLW  D'8'
       MOVWF  BIT
       BCF    STATUS,0
RXLP   RLF    BUFIN,1
       BCF    BUFIN,0
       CALL   BITIN
       BTFSC  EEPROM,DI
       BSF    BUFIN,0
       DECFSZ BIT
       GOTO   RXLP
       NOP
       RETLW  0
;**********************
BITOUT
       MOVLW   B'11001000'
       tris    PORTC
       BTFSS   EEPROM,DO
       GOTO    BITLOW
       BSF     PORTC,SDA
       GOTO    CLKOUT
BITLOW BCF     PORTC,SDA
CLKOUT BSF     PORTC,SCL
       NOP
       NOP
       NOP
       NOP
       BCF     PORTC,SCL
       RETLW   0
;**********************
BITIN
       BSF     EEPROM,DI
       MOVLW   B'11001010'
       TRIS    PORTC
       BSF     PORTC,SCL
       NOP
       NOP
       NOP
       NOP
       NOP
       BTFSS   PORTC,SDA
       BCF     EEPROM,DI
       BCF     PORTC,SCL
       RETLW   0
;---------------------------------
;延时1s
;---------------------------------`		
DELAY_1S:							;延时1s
		MOVLW 04H					;3+1
		MOVWF COUNTER1
		MOVLW 0AH					;10
		MOVWF COUNTER2
		MOVLW 031H					;49
		MOVWF COUNTER3
									;49*5+(256*5+5)*10+[(256*5+5)*256+5]*3+10=1,000,000us
DELAY_1S_WAIT
		NOP		
		NOP
		DECFSZ COUNTER3,F
		GOTO DELAY_1S_WAIT
		NOP
		NOP
		DECFSZ COUNTER2,F
		GOTO DELAY_1S_WAIT
		NOP
		CLRWDT
		DECFSZ COUNTER1,F 
		GOTO DELAY_1S_WAIT
		;DECFSZ COUNTER0,F
		;GOTO DELAY_WAIT
DELAY_RET
		RETLW 0		  


;**************************************** 

DELAY_10MS
       MOVLW  D'13'
       MOVWF  DLY1
       MOVLW  0FFH
       MOVWF  DLY2
LP0    DECFSZ DLY2,1
       GOTO   $-1
       DECFSZ DLY1,1
       GOTO   $-5
       RETLW  0
  

;********************************************       
WR_EEPROM
       BTFSC  FLAG,1
       GOTO   OUT1
       MOVLW  B'00000000'
       TRIS   PORTC
       CLRF   PORTC

       CLRF   PORTC
       MOVLW  B'10100000'
       MOVWF  SLAVE
       MOVLW  13H
       MOVWF  FSR          ;IN_DATA_0地址
       MOVLW  B'10101100'
       MOVWF  BUFOUT
       CLRF   ADDR
       CALL   BSTART
       MOVF   SLAVE,0
       MOVWF  TXBUF
       CALL   TX
       MOVF   ADDR,0
       MOVWF  TXBUF
       CALL   TX
       MOVF   INDF,0
       MOVWF  TXBUF
       CALL   TX
       INCF   FSR
       MOVF   INDF,0
       MOVWF  TXBUF
       CALL   TX
       INCF   FSR
       MOVF   INDF,0
       MOVWF  TXBUF
       CALL   BSTOP
OUT1   RETLW  0
;*****************************************   
XIANSHI
       MOVLW    08H
       MOVWF    COUNT
LOOP   BTFSC    BUFIN,7
       BSF      PORTC,5
       CALL     DELAY_1S
      
       BCF      PORTC,5
       
       CALL     DELAY_1S
       RLF      BUFIN,1
       DECFSZ   COUNT,1
       GOTO     LOOP
       BCF      PORTC,5 
       RETLW    0
 ;********************************      


;------------------------------------------------------------
;25ms计时子程序
;------------------------------------------------------------          
DELAY_25   
         MOVLW     20H
         MOVWF     COUNT_T0
DELAY    CLRWDT
         MOVLW     0FFH
         MOVWF     COUNT_T1
DELAY1   DECFSZ    COUNT_T1,1
         GOTO      DELAY1
         DECFSZ    COUNT_T0,1
         GOTO      DELAY
         RETLW     0
;------------------------------------------------------------
;250ms计时子程序
;------------------------------------------------------------         
DELAY_250
         MOVLW     0F2H
         MOVWF     COUNT_T0
DELAY2   CLRWDT                        
         MOVLW     0FFH
         MOVWF     COUNT_T1
DELAY21  NOP                           ;内层循环1024us
         DECFSZ    COUNT_T1,1         
         GOTO      DELAY21
         DECFSZ    COUNT_T0,0
         GOTO      DELAY2
         RETLW     0           
;-------------------------------------------------------------
;主程序开始
;-------------------------------------------------------------          
          ORG      100H
INT_INIT 
		
		BANKSEL PORTC
		MOVLW B'11001000'	
		TRIS PORTC
		CLRF PORTC
        CLRF FLAG
		MOVLW 00H
        MOVWF IN_DATA_0
		MOVWF IN_DATA_1
		MOVWF IN_DATA_2
		MOVWF COUNTER
		MOVWF COUNTER0
		MOVWF COUNTER1
		MOVWF COUNTER2
	
		
SIGNAL_SERVICE					;COUNTERX 计数器分配混乱,需要调整
		BTFSS SIGNAL
		GOTO SIGNAL_RET
		CLRF COUNTER0
SIGNAL_SYN_HIGH

		CLRWDT
		BTFSS SIGNAL
		GOTO SIGNAL_SYN_HIGH_TEST		
		INCF COUNTER0,F
		BTFSS STATUS,Z
		GOTO SIGNAL_SYN_HIGH
		GOTO SIGNAL_RET
		
SIGNAL_SYN_HIGH_TEST		;210us
		MOVLW D'30'			;30?这个取值需要重新计算
		SUBWF COUNTER0,W
		BNC SIGNAL_RET
		CLRF COUNTER1

SIGNAL_SYN_LOW				
		GOTO $+1
		GOTO $+1
		GOTO $+1
		GOTO $+1
		GOTO $+1
		GOTO $+1
		CLRWDT
		BTFSC SIGNAL
		GOTO SIGNAL_RET
		DECFSZ COUNTER1,F
		GOTO SIGNAL_SYN_LOW
		
SIGNAL_SYN_LOW_WAIT
		CLRWDT
		BTFSS SIGNAL
		GOTO SIGNAL_SYN_LOW_WAIT		
		MOVLW D'24'
		MOVWF COUNTER2

SIGNAL_PERIOD_START
		CLRF COUNTER0
		CLRF COUNTER3

SIGNAL_PERIOD_LOW_WAIT
		CLRWDT
		GOTO $+1
		BTFSC SIGNAL
		GOTO SIGNAL_PERIOD_HIGH
		INCFSZ COUNTER0,F
		GOTO SIGNAL_PERIOD_LOW_WAIT
		GOTO SIGNAL_RET

SIGNAL_PERIOD_HIGH						;6个时钟周期
		CLRWDT
		BTFSS SIGNAL
		GOTO SIGNAL_PERIOD_VALUE_JUDGE
		INCFSZ COUNTER3,F
		GOTO SIGNAL_PERIOD_HIGH
		GOTO SIGNAL_RET
		
SIGNAL_PERIOD_VALUE_JUDGE		
		MOVLW D'20'						;高电平小于120us 退出
		SUBWF COUNTER3,W
		BNC SIGNAL_RET
		BCF FLAG,0
		MOVLW D'80'						;高电平大于120us 小于480us判断为‘0’
		SUBWF COUNTER3,W				;		大于480us 判断为‘1’
		BNC SIGNAL_PERIOD_VALUE_SAVE
		BSF FLAG,0
		
SIGNAL_PERIOD_VALUE_SAVE
				
		RLF IN_DATA_0,F
		RLF IN_DATA_1,F
		RLF IN_DATA_2,F
		BCF IN_DATA_0,0
		BTFSC FLAG,0
		BSF IN_DATA_0,0
		DECFSZ COUNTER2,F
		GOTO SIGNAL_PERIOD_START
		
		
		
		
		BSF LIGHT                    ;收到信号,闪3下
		CALL DELAY_1S
		BCF LIGHT
		CALL DELAY_1S
		
		BSF LIGHT
		CALL DELAY_1S
		BCF LIGHT
		CALL DELAY_1S
		
		BSF LIGHT
		CALL DELAY_1S
		BCF LIGHT
		CALL DELAY_1S
	    MOVLW    0FH                            
		ANDWF    IN_DATA_0,W
		MOVWF    DATA1            ;屏蔽低4位,保留地址码值
		MOVLW    0F0H
		ANDWF    IN_DATA_0,F      ;屏蔽高4位,保留键码值
;-------------------------------------------------------------------------------------------		  
;对接收到的数据进行处理,若为初始化(学习),则将数据存入EEPROM;否则,给出开锁或者上锁信号
;------------------------------------------------------------------------------------------
SIGNAL_PROCESSING
       BCF      PORTC,0
       BCF      PORTC,1
          
       ;BTFSC    STUDY
       ;GOTO     WRITE
          
       MOVLW  40H
       MOVWF  FSR
       MOVLW  03H         ;3次读
       MOVWF  BY_COUNT
       CLRF   PORTC
       MOVLW  B'10100000'
       MOVWF  SLAVE
       CLRF   ADDR
       CALL   BSTART
       MOVF   SLAVE,0
       MOVWF  TXBUF
       CALL   TX
       MOVF   ADDR,0
       MOVWF  TXBUF
       CALL   TX
       CALL   BSTART
       MOVLW  B'10100001'
       MOVWF  TXBUF
       CALL   TX
RBYTE  CALL   RX
       MOVF   BUFIN,0
       MOVWF  INDF
       INCF   FSR
       DECFSZ BY_COUNT,1
       GOTO   LOWACK
       BSF    EEPROM,DO
       CALL   BITOUT
       CALL   BSTOP
       GOTO   OUT2
       
LOWACK BCF    EEPROM,DO
       CALL   BITOUT
       CALL   XIANSHI
       GOTO   RBYTE
       NOP                               
          
OUT2      MOVLW    B'11001000'
          TRIS     PORTC
          BSF      LIGHT               ;读完闪1次
          CALL     DELAY_1S
          BCF      LIGHT
          GOTO     CHECK_AD
WRITE     CALL     WR_EEPROM 
          BSF      FLAG,1 
          BSF      LIGHT
          CALL     DELAY_250
          BCF      LIGHT               ;进入写EEPROM
          GOTO     EXIT                                
;-----------------------------------------------------------
;比较地址码
;-----------------------------------------------------------               
CHECK_AD  MOVLW    40H                         
          MOVWF    FSR
          MOVF     IN_DATA_0,0
          XORWF    INDF,0
          BTFSS    STATUS,Z
          GOTO     EXIT
          INCF     FSR,1
          MOVF     IN_DATA_1,0
          XORWF    INDF,0
          BTFSS    STATUS,Z
          GOTO     EXIT
          INCF     FSR,1
          MOVF     IN_DATA_2,0
          XORWF    INDF,0
          BTFSS    STATUS,Z
          GOTO     EXIT           ;地址码不对,跳出
;------------------------------------------------------------------
;检查指令
;-------------------------------------------------------------------         
          GOTO     OPEN
DONE      MOVF     DATA1,0               
          XORLW    00H
          BTFSS    STATUS,Z
          GOTO     OPEN
          GOTO     EXIT
OPEN      BSF      PORTC,5
          CALL     DELAY_250
          BCF      PORTC,5
          CALL     DELAY_250
          BSF      PORTC,5
          CALL     DELAY_250
          BCF      PORTC,5
EXIT      
          NOP                 
           
SIGNAL_RET
		GOTO SERVICE_END
SERVICE_END

		
		NOP
		NOP
		BTFSC SIGNAL				;SIGNAL =1外部有信号输入
		GOTO  SIGNAL_SERVICE
		NOP
			
		NOP
		NOP
		NOP
		NOP
		NOP
		
		GOTO SERVICE_END	
        END                                                                                        
                                                       
          
                                           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -