
	.include "KF8TS2516.inc"
	
	;;// 汇编编写说明 实体建立后应该选择文件前面添加（可供C和汇编引用)

	;// .global	 (实体)  

	;;// 汇编编写说明 引用调用前应该选择文件前面添加 （引用)

	;// .extern  （引用)

	;// 汇编的编写可以采用 BANKSEL  xx的语句进行切区占位，由编译器自动优化，不用单独考虑数据所在区域和手动判断切区需求。

;--------------------------------------------------------
; external declarations
;--------------------------------------------------------
	.extern	_init_mcu

	.extern	__KF8_LIBi_channel_flag_ 
	.extern	__KF8_LIBc_channel_
	
	.extern START_CAL_IN_INIT		;// 校准校准信息到芯片
	.extern __R2PCL					;// 查表函数
	.extern _cinit					;// 库变量初始化 编译器自动生成

;//触摸库函数引用声明
	.extern	__KF8TS25_Get_Ver_General_
	;// 参数更换   0：选用 T1H T1L PWM不可用 ； 1：选用T1U，T3L但仅适合E03版本芯片；2：选用T1U，T3L，满足E05及以后版本芯片。
	.extern	__KF8TS25_Lib_Set_General_Parameter
	;//初始化电容触摸
	.extern	__KF8TS25_Init_Touch_General_
	;//电容触摸通道处理
	.extern	__KF8TS25_Touch_Process_General_
	;//简化接收开启函数，仅调试曲线时用
	.extern	__KF8TS25_Touch_TEST_General_
	
;;// 调试函数声明
	.extern	_sentbuf1
	.extern	_sentbuf2
	.extern	_sentbuf3
	.extern	_sentbuf4
	.extern	_TOUCH_DEBUG_SEND_OUT	;// 串口监听调试调用输出_sentbuf1-_sentbuf4
	
	.extern __KF8_LIBi_buff_baseline_
	
	.extern __KF8_LIBi_buff_hit_
	.extern	_TOUCH_DEBUG_TRS_DEAL	;// 曲线上传函数	
;--------------------------------------------------------
; global declarations
;--------------------------------------------------------
	.global	_delay_us
	.global	_delay_ms
	.global	_display
;--------------------------------------------------------
	.global _STK03
	.global _STK02
	.global _STK01
	.global _STK00	

_MAIN_RAM_0	.udata  
_STK03	.res	1
_STK02	.res	1
_STK01	.res	1
_STK00	.res	1

_MAIN_RAM_2	.udata 
kf8_touch_flag	.res	1

_MAIN_RAM_3	.udata 
I0R0	.res	1
I0R1	.res	1
I1R0	.res	1
I1R1	.res	1
I0PSW	.res	1
I0PCH	.res	1
I1PSW	.res	1
I1PCH	.res	1
;--------------------------------------------------------
; 开机入口准备工作
;--------------------------------------------------------
STARTUP	.code 0x0000
	NOP
	PAGESEL	init_imp		;// 初始化代码综合入口
	JMP		init_imp
	
INIT_IMP	.code
init_imp

	PAGESEL		START_CAL_IN_INIT	
	CALL		START_CAL_IN_INIT	;// 校准值调入
	PAGESEL	$	
	
	PAGESEL		_cinit	
	CALL		_cinit		;// 编译所需 做变量初始值处理 idate
	PAGESEL	$	
		
	PAGESEL	_main	
	JMP		_main	
;--------------------------------------------------------
; 中断函数入口 注意压栈  需要注意  PSW BANK PCH R0 R1 更过Rx根据代码和中断代码的使用情况处理
; 1级中断芯片示例如下  不带BANK寄存器  使用 R2 R3 R4 R5保存现场
; 2级中断需要建立额外变量配置Rx寄存器进行中断的现场保护，如V216demo汇编样例
;--------------------------------------------------------
c_interrupt0	.code	0x4
;压栈保护; 出栈还原	,不同的芯片 压栈出栈存在内容和资源差异，即中断中和外部共用资源均需做保护。
	BANKSEL I0R0
	MOV		I0R0,R0
	BANKSEL I0PSW
	MOV		R0,PSW
	MOV		I0PSW,R0
	BANKSEL I0PCH
	MOV		R0,PCH
	MOV		I0PCH,R0
	BANKSEL I0R1
	MOV		I0R1,R1
	MOV     R6,BANK
	PAGESEL	__sdcc_interrupt0
	JMP		__sdcc_interrupt0

c_interrupt1	.code	0x14
;压栈保护; 出栈还原	,不同的芯片 压栈出栈存在内容和资源差异，即中断中和外部共用资源均需做保护。
	BANKSEL I1R0
	MOV		I1R0,R0
	BANKSEL I1PSW
	MOV		R0,PSW
	MOV		I1PSW,R0
	BANKSEL I1PCH
	MOV		R0,PCH
	MOV		I1PCH,R0
	BANKSEL I1R1
	MOV		I1R1,R1
	MOV     R6,BANK
	PAGESEL	__sdcc_interrupt1
	JMP		__sdcc_interrupt1


func.__sdcc_interrupt0 .code
__sdcc_interrupt0
;	if(T3IF)	;// 兼容版本差异，针对多SFR分区芯片，特殊寄存器也需要切区控制
	BANKSEL EIF2
	JB	EIF2, T3IF
	JMP __sdcc_interrupt_out
;	T4CTL=0;T3IF=0;
    BANKSEL T4CTL
	CLR	T4CTL
	BANKSEL EIF2
	CLR	EIF2, T3IF
; //更新按键标志 ，可以做标志，主循环查询处理
	BANKSEL kf8_touch_flag
	SET kf8_touch_flag,0		;// 标志后主程序查询处理	
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;出栈还原	,不同的芯片 压栈出栈存在内容和资源差异，即中断中和外部共用资源均需做保护。
__sdcc_interrupt_out
	BANKSEL I0R1
	MOV	R1, I0R1
	BANKSEL I0PSW
	MOV	R0,I0PSW
	MOV	PSW, R0
	BANKSEL I0PCH
	MOV	R0,I0PCH
	MOV	PCH, R0
	MOV BANK,R6
	BANKSEL I0R0
	MOV	R0, I0R0
	IRET
	
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;低优先级中断
func.__sdcc_interrupt1 .code
__sdcc_interrupt1
;	if(T0IF)	;// 兼容版本差异，针对多SFR分区芯片，特殊寄存器也需要切区控制
	BANKSEL INTCTL
	JB	INTCTL, T0IF
	JMP __sdcc_interrupt_out1
;	T0=0x20;T0IF=0;
    BANKSEL T0
    MOV R0,#0X20
	MOV T0,R0
	BANKSEL INTCTL
	CLR	INTCTL, T0IF
	BANKSEL P1LR
	JB P1LR,1
	SET P1LR,1
	CLR P1LR,1
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;出栈还原	,不同的芯片 压栈出栈存在内容和资源差异，即中断中和外部共用资源均需做保护。
__sdcc_interrupt_out1
    BANKSEL I1R1
	MOV	R1, I1R1
	BANKSEL I1PSW
	MOV	R0,I1PSW
	MOV	PSW, R0
	BANKSEL I1PCH
	MOV	R0,I1PCH
	MOV	PCH, R0
	MOV BANK,R6
	BANKSEL I1R0
	MOV	R0, I1R0
	IRET		
;--------------------------------------------------------
; 主程序main入口
;--------------------------------------------------------
_main
;	init_mcu();			//初始化MCU寄存器
	PAGESEL	_init_mcu
	CALL	_init_mcu
	PAGESEL	$	
;//------------------------------------------
	CWDT 
;	delay_ms(200);		0x00C8=200	//使能等待电源稳定，采样作为基准 
	MOV	R0,# 0x00					;;高位
	BANKSEL	_STK00
	MOV	_STK00, R0
	MOV	R0,# 0xC8					;;低位
	PAGESEL	_delay_ms
	CALL	_delay_ms
	PAGESEL	$	
;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;	CTCTL1 = 0x41;		//电压源和时钟分频设置  0 4 8 C~ 4/8/16/32  xxyy yyyx   0~ Vref  1~ VDD
;	VDAC=0x90;	
	MOV	R0,# 0x41					;;高位
	BANKSEL CTCTL1
	MOV CTCTL1,R0
	BANKSEL VDAC
	MOV	R0,# 0x90
	MOV VDAC,R0
	
;	__KF8S_Lib_Set_General_Parameter(0)
	MOV R0,#0x00
	PAGESEL __KF8TS25_Lib_Set_General_Parameter
	CALL __KF8TS25_Lib_Set_General_Parameter
	PAGESEL $
;	_KF8S_Init_Touch_General_;		//调用电容触摸库函数的初始化
	PAGESEL	__KF8TS25_Init_Touch_General_
	CALL	__KF8TS25_Init_Touch_General_
	PAGESEL	$	
;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_Main_LooP_Code
	CWDT 
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
	BANKSEL kf8_touch_flag
	JB kf8_touch_flag,0
	JMP Touch_Do_End_Flag
	;//------------
	CLR kf8_touch_flag,0
;//	TOUCH_DEBUG_TRS_DEAL();
;	PAGESEL	_TOUCH_DEBUG_TRS_DEAL
;	CALL _TOUCH_DEBUG_TRS_DEAL
;	PAGESEL	$

;//	_KF8S_Touch_Process_General_();			;;// 如果需要休眠 这只能做标志 后主循环查询处理
	PAGESEL	__KF8TS25_Touch_Process_General_
	CALL	__KF8TS25_Touch_Process_General_
	PAGESEL	$
	;;//------------
Touch_Do_End_Flag	
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;	display();					//显示LED灯
	PAGESEL	_display
	CALL	_display
	PAGESEL	$
	
;	delay_ms(1);
	MOV	R0,# 0x00					;;高位
	BANKSEL	_STK00
	MOV	_STK00, R0
	MOV	R0,# 0x01					;;低位
	PAGESEL	_delay_ms
	CALL	_delay_ms
	PAGESEL	$
	
	
	JMP	_Main_LooP_Code
;//------------------------------------------
	CRET	
;--------------------------------------------------------
; 微秒级别延时函数//  USE  R1 R0 传递循环次数
;--------------------------------------------------------
_delay_us	 ;
; void delay_us(uint us_data)
;;	while(us_data--);
_delay_us_loop1
 	DEC  R0
 	JB   PSW,Z   
 	JMP _delay_us_loop1
 	
 	XOR R1,#0x00
 	JNB PSW,2
 	JMP _delay_us_loop_end
 	DEC   R1
 	MOV  R0,#0xFF
 	JMP _delay_us_loop1 	
_delay_us_loop_end 
	CRET	
;--------------------------------------------------------
; 毫秒级别延时函数  use STK00 R0
;--------------------------------------------------------
_delay_ms	;
;; void delay_ms(uint ms_data)  use STK00,R0,最小值1
;	while(ms_data--)
;	j=200;  CWDT
;	while(j--)	

_delay_ms_Deal	  ;j=200;  CWDT
    MOV R1,#0xC8
    CWDT
 	;while(j--)
_delay_ms_sub
    DEC  R1
	JB   PSW,Z
 	JMP  _delay_ms_sub
	; ms_data
 	DEC R0
 	JB  PSW,Z 	
 	JMP _delay_ms_Deal   ;低8位不借位时继续 	
 	
 	MOV R1,#0x00
 	BANKSEL _STK00
 	XOR _STK00,R1
 	JNB PSW,2
 	JMP _delay_ms_loop_end 
 	BANKSEL _STK00
 	DEC _STK00
 	MOV  R0,#0xFF
 	JMP _delay_ms_Deal  ;高位为零计数，否则借位到低
 	
_delay_ms_loop_end 	
	CRET
;--------------------------------------------------------
; 按键结果输出指示函数,根据标志长度，根据需求进行解析代码编写
;--------------------------------------------------------
_display	;Function start 解析按键可以采用保持历史值，比对变化后进行输出刷新
;//----------------------------------------------------	
;if(_KF8_LIBi_channel_flag_&0x0001)		//通道0
	BANKSEL	__KF8_LIBi_channel_flag_
	JB	__KF8_LIBi_channel_flag_, 0
	JMP	__display_DS_0002
;	LED1=1;
	BANKSEL P1LR	
	SET	P1LR, 5
	JMP	__display_DS_0003
__display_DS_0002
;	LED1=0;
	BANKSEL P1LR	
	CLR	P1LR, 5
;//----------------------------------------------------		
__display_DS_0003
;	if(_KF8_LIBi_channel_flag_&0x0002)		//通道1
	BANKSEL	__KF8_LIBi_channel_flag_
	JB	__KF8_LIBi_channel_flag_, 1
	JMP	__display_DS_0005
;	LED2=1;
	BANKSEL P2LR	
	SET	P2LR, 5
	JMP	__display_DS_0006
__display_DS_0005
;	LED2=0;
	BANKSEL P2LR
	CLR	P2LR, 5
;//----------------------------------------------------		
__display_DS_0006
;	if(_KF8_LIBi_channel_flag_&0x0040)		//通道6
	BANKSEL	__KF8_LIBi_channel_flag_
	JB	__KF8_LIBi_channel_flag_, 6
	JMP	__display_DS_0007
;	LED3=1;
	BANKSEL P2LR	
	SET	P2LR, 4
	JMP	__display_DS_0008
__display_DS_0007
;	LED3=0;
	BANKSEL P2LR	
	CLR	P2LR, 4
;//----------------------------------------------------		
__display_DS_0008
;	if(_KF8_LIBi_channel_flag_&0x0080)		//通道7
	BANKSEL	__KF8_LIBi_channel_flag_
	JB	__KF8_LIBi_channel_flag_, 7
	JMP	__display_DS_0009
;	LED4=1;
	BANKSEL P2LR	
	SET	P2LR, 3
	JMP	__display_DS_0010
__display_DS_0009
;	LED4=0;
	BANKSEL P2LR	
	CLR	P2LR, 3
;//----------------------------------------------------			
__display_DS_0010
	;..............................
	CRET	
	.end
