📄 main.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 + -