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

📄 main.asm

📁 一款用24L01给美的电器做的2.4G无线遥控器
💻 ASM
字号:
;***********************************************
; Function Description: MD Fan Remote Controller Firmware New Edition
; Written by: Zhou Jia
; IC body: KBPC004
; External RC oscilator: 6MHz(R=150K)   
; Interrupt Source: External Interrupt PC0(RF module IRQ),PB[3:1](key pressed interrupt)
;***********************************************
		.include	"SPI.inc"
		.include        "inc.inc"
;-----------constants------------------
;c_ram                  equ        0x1d
c_ram                  =          0x22 	;Don't clear the whole RAM,reserve some bytes for SP
c_ext_int_enable       =        0x1e        
c_ext_int_fall_edge    =        0x00
c_port_input_ctrl     =        0xff
;c_portb_input_ctrl     ==       0xff
c_globle_int_enable    =        0x90
c_sleep_ctrl           =        0x80
c_porta_dir_ctrl       =        0x81
;c_porta_input_ctrl     =        0xff
c_irq_int              =        0x10        
c_all_key_high	       =	0x0e
c_key_on_off           =        0x02
c_key_speed            =        0x04
c_key_timer            =        0x08

c_nRF24L01_not_use     =        0x68
c_fecth_IRQ_source     ==       0x70
c_fecth_flag_rx        =        0x02
c_flag_key_int		=       0x08




c_try_tx_max            =       14

c_max_channel          ==             15
c_fecth_pipe_no        ==            0x0e
c_fetch_command        ==            0xe0
c_com_normal_key       ==            0x00
c_com_ask              ==            0x20
c_com_answer           ==            0x40
c_com_factory_set      ==            0x60
c_com_return	       ==	     0xc0
;-----------Variables------------------
		.area	main_data(data,abs)
		.org     0x02              ;0x00,0x01两个byte为ICE保留
;ICE_Reserved:	.ds	2		
tmp_a:              .ds         1
tmp_cpusts:	.ds	1
tmp_tpl::              .ds      1
access_code::        .ds        3
key_code:		.ds	1

channel_count::		.ds	1
try_ctrl:		.ds	1
command::		.ds	1

IRQ_source::            .ds	1
flag::			.ds	1



;-----------Codes------------------------
		.area	Start_Up(code,abs)
         .org     0x00
         br        Reset
         .org     0x06                ;Timer0
         reti
         .org     0x09                ;External pin 
         br        Ex_Int_Judge
         .org     0x0f                ;Timer1
         reti
;--------------------------------------
         .area     Main_Code(code,abs) 

         .org	0x20			;0x00~0x14是IC保留的程序区
Reset:  
	lda	#2fh			;将堆栈指针指向RAM最后一个字节
	sta	sp

	call     Clear_RAM
        call	 Initialization        
        call     eep_init_check

        ;lda	#0
        ;sta	access_code
        ;sta	access_code+1
        ;lda	#0x22
        ;sta	access_code+2
        ;call	eep_save_data
        
        call     nRF24L01_Configuration	;将发送,接收控制参数写入nRF24L01
        ;---------06-07-22------------------------------------
        ;move the "Compare Access Code" and "Return Access Code" here
        ;if you want to perform these actions,you should push the combo buttons
        ;and then power-on(betteries).
        call    Scankey			
        lda     key_code                
        cmpe    #c_key_on_off|c_key_timer
        brz     Press_Compare_Access_Code
        cmpe    #c_key_on_off|c_key_speed
        brz     Press_Return_Access_Code
        ;---------------------------------------------
        call     Power_Down		;nRF24L01 power down
Sleep_Mode:
	lda	#c_port_input_ctrl	;将porta改为输入是为了防止在睡眠状态中漏电
	sta	pdira
         
        lda      #c_ext_int_enable	;睡眠之前,允许PC0,PB[3:1]中断,以便唤醒
        sta      prtie
         
        lda      modcon
        ora      #c_sleep_ctrl
        sta      modcon
        nop
        nop
        nop

        lda	flag			;判断是否是按键中断
        anda   #c_flag_key_int		;IRQ中断是在中断服务程序中处理的
	brz    Sleep_Mode
 
        lda     prtie                   ;关PB[3:1]中断,避免中断对扫键的影响
        anda    #~c_all_key_high
        sta     prtie
        
        clearbit(flag,f_key_int)
        call    Scankey			
        lda     key_code                
        cmpe    #c_key_on_off                
        brz     Press_One_Key_Handle
        cmpe    #c_key_speed
        brz     Press_One_Key_Handle
        cmpe    #c_key_timer
        brz     Press_One_Key_Handle
        ;cmpe    #c_key_speed|c_key_timer|c_key_on_off
        ;brz     Press_Compare_Access_Code
        ;cmpe    #c_key_on_off|c_key_speed
        ;brz     Press_Return_Access_Code
     	br	Sleep_Mode
     	
;----------------------------------------------
Press_One_Key_Handle:		;如果是单个键按下,将单个按键键值发给控制板
 	lda	#c_porta_dir_ctrl
 	sta	pdira

        call    Power_UP_Tx       
        call	Flush_Tx_FIFO
	;call    Delay_10ms
	;call	Delay_2ms
	
        lda     #0
        sta	try_ctrl 
        
        lda     key_code
        adda    #0
        rorc
        sta     command
       ; call	Write_TX_Payload
        call	Write_Command

        ;call	Delay_5us
        
        call    CE_Pulse
	br	Sleep_Mode
;-------------------------------------------
Press_Compare_Access_Code:	;请求对码的组合键按下,发请求对码命令给writer
	lda	#c_porta_dir_ctrl
 	sta	pdira

	call    Power_UP_Tx
	call	Flush_Tx_FIFO
				;将发送地址和接收地址改为与writer通信地址
        call    Write_tx_addr_writer    					
        lda     #c_com_ask
        sta     command
        call    Write_TX_Payload        
        call    CE_Pulse
        call	Delay_100ms	;等待中断处理完毕
        clearbit(plata,CE)
        call	Write_tx_addr_Fan	;将发送地址和接收地址改回与Fan通信地址
        call	Power_Down        
        br      Sleep_Mode
;-------------------------------------------
Press_Return_Access_Code:	;返回对码值的组合键按下,将接入码发给writer
	lda	#c_porta_dir_ctrl
 	sta	pdira

	call    Power_UP_Tx	               
	call	Flush_Tx_FIFO
        call    Write_tx_addr_writer        
        lda	#c_com_return
        sta	command
        call	Write_TX_Payload        
        call    CE_Pulse
        br      Sleep_Mode
;====================================================        
 
         

;********************************************
;  Function: External pin interrupt ISR
;  Description: 
;        Judge it is a IRQ interrupt or a portb key pressed
;  Interrupt
;        If it is a IRQ interrupt, record the stautus register
;  of nRF24L01 in'IRQ_source'and clear IRQ flags
;        If it is a portb key pressed interrupt,quit directly  
;*******************************************
Ex_Int_Judge:
	sta     tmp_a
        lda	cpusts
        sta	tmp_cpusts
        lda     prtif
        anda    #c_irq_int	;判断是否是IRQ中断
        brnz    IRQ_ISR         
Key_Pressed:
	lda     prtif
	anda	#~c_all_key_high
        sta     prtif
        setbit(flag,f_key_int)
        br	Quit_Ex_Int
          
IRQ_ISR: 
	lda	#c_porta_dir_ctrl
 	sta	pdira
 	nop
 	nop
 	
	lda     prtif
	anda	#~c_irq_int
       	sta     prtif

       	clearbit(plata,CSN)	;读出nRF24L01的status register将其内容放在IRQ_source并清掉中断标志
       	lda     #WRITE_REG+#STATUS
       	sta     byte
       	call    SPI_RW
       	lda	byte
       	sta	IRQ_source
       	lda     #0x70		;为了将IRQ引脚置高,必须将Status寄存器中的中断标志位清掉,
       	sta     byte		;以允许产生下一次IRQ中断(IRQ引脚平时为高,中断产生时置低)
       	call    SPI_RW		;详细说明见G:\资料\美的项目\2006-05-04 MD fan information\2006-05-04 MD fan information\
	setbit(plata,CSN)	;RF\Nordic RF24L01 information Page14
       	

       	;lda	#STATUS
       	;sta	reg_name
       	;call	SPI_Read_Reg
       	;lda	reg_value
       	;sta	IRQ_source

IRQ_INT_Handle:
        lda     IRQ_source
        anda    #c_fecth_IRQ_source
        cmpe    #TX_DS		;发送到?
        brz     IRQ_Tx_DS
	cmpe    #MAX_RT		;未发到?
	brz	IRQ_MAX_RT
        cmpe	#RX_DR		;接收到?
        brz	IRQ_RX_DR
        br	Quit_Ex_Int
;-------------------------------------------
IRQ_TX_DS:

	
        ;lda	#WRITE_REG+#STATUS
        ;sta	reg_name
        ;lda	#TX_DS
        ;sta	reg_value
        ;call	SPI_RW_Reg
        
	lda     command
        anda	#c_fetch_command
        ;cmpe	#c_com_normal_key
        brz	RF_Power_Down	;单个按键的命令发送到,直接将RF模块关掉		
        cmpe	#c_com_return
        brz	Change_Addr_Fan	;返回对码值的命令发送到,将发送、接受地址改回与风扇通信的地址
        cmpe	#c_com_ask
        brnz	Quit_Ex_Int	
        call	Power_UP_Rx	;请求对码的命令发送到,将RF模块配置成接收模式
        setbit(plata,CE)

        
        br	Quit_Ex_Int
        
;-------------------------------------------
IRQ_MAX_RT:

	
        ;lda	#WRITE_REG+#STATUS
        ;sta	reg_name
        ;lda	#MAX_RT
        ;sta	reg_value
        ;call	SPI_RW_Reg
        
        lda     command
        anda	#c_fetch_command
        ;cmpe	#c_com_normal_key
        brnz	Change_Addr_Fan	;与writer通信失败,改回与Fan通信的地址码

        call    Set_Channel	;与FAN通信失败,跳到下一频段
        lda	try_ctrl
        cmpe    #c_try_tx_max	;是否已经在所有频段上扫描一遍?
        brc	RF_Power_Down
        lda     try_ctrl
        inca
        sta     try_ctrl	
        ;call    Set_Channel      
        call    CE_Pulse
        br      Quit_Ex_Int

;=================================================
IRQ_RX_DR:
	
        ;lda	#WRITE_REG+#STATUS
        ;sta	reg_name
        ;lda	#RX_DR
        ;sta	reg_value
        ;call	SPI_RW_Reg
        ;call	Delay_5us
        
	;clearbit(plata,CE)
	call	Read_Rx_Pload	;收到字节,将字节读出
	lda	command
	cmpe	#c_com_answer
	brnz	Change_Addr_Fan
	call    eep_save_data	;save access code to eeprom
Change_Addr_Fan: 	
    	call    Write_tx_addr_Fan
RF_Power_Down:
	
        call    Power_Down 
        
Quit_Ex_Int:         
        lda	tmp_cpusts
        sta	cpusts
        lda	tmp_a
        reti
          
;------------------------------------------------
Clear_RAM:
         lda       #0x00
         sta       dp
Clear_Loop:
         lda       #0x00
         sta       i
         lda       dp
         cmpe      #c_ram
         brz       Clear_End
         incdp
         br        Clear_Loop
Clear_End:
	ret
	
        
;-----------------------------
Initialization:
;Enable External Pin Interrupt
         lda       #c_ext_int_fall_edge               ;外部中断下降沿有效
         sta       prtiedg
         lda       #c_ext_int_enable                  ;允许PC0,PB[3:1]中断
         sta       prtie
         lda       #c_port_input_ctrl                ;设置相应管脚为input
         sta       pdirc
         lda       #c_port_input_ctrl
         sta       pdirb
         lda       #c_globle_int_enable
         sta       mier                             ;允许总中断控制

         lda       #c_porta_dir_ctrl              
         sta       pdira
         lda       #c_nRF24L01_not_use       ;在不需要读写时,对EEPROM的SDA,SCL输出高电平
         sta       plata                     ;对nRF24L01的CE,SCK,MOSI输出低电平,对CSN输出高电平
         ret
;------------------------------------------------
Scankey::
    	call      Delay_10ms
    	call      Delay_10ms
    	lda       portb
    	xora      #0xff
    	anda      #c_all_key_high
    	sta       key_code
    	ret
;-----------------------------------------------
Set_Channel:
	lda     channel_count
        inca
        sta     channel_count
        cmpe    #c_max_channel 
        brnc     Look_Forward
        lda       #0
        sta       channel_count
Look_Forward:         
        call     Look_up_Freq_table
        sta      reg_value
        call     Select_RF_Channel
        ret  
;**********************************
;In/out parameters:
;     In:channel_count
;     Out:RF_channel value in 'ACC'register
;*********************************
Look_up_Freq_table::		
        lda     channel_count
        cmpe    #15
        brnc    Look_up_continue
        lda     #0
        sta     channel_count
Look_up_continue:
        adda	#0
        lda     #<(Freq_Table)
        adda    channel_count
        sta     tmp_tpl
        lda     #>(Freq_Table)
        addc    #0
        sta     tph
        lda     tmp_tpl
        sta     tpl
        ldv
       ; sta     RF_channel
        ret
;*****************************************
Freq_Table:
       db  0x02,0x1b,0x34,0x07,0x20,0x39,0x0c,0x25
           ;2   ;27  ;52  ;7   ;32  ;57; ;12  ;37
       db  0x3e,0x11,0x2a,0x43,0x16,0x2f,0x48
           ;62  ;17  ;42  ;67  ;22  ;47  ;72    
;--------------------------------------

	br	Reset

           .area  Run_away(code,abs)
     
       .org		0x0a00

       br	Reset

       .org		0x0b00

       br	Reset

       .org		0x0c00

       br	Reset

       .org		0x0d00

       br	Reset

       .org		0x0e00

       br	Reset

       .org		0x0f00

       br	Reset
          	
       

⌨️ 快捷键说明

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