;***********************************************************
;单    位:苏州华芯微电子有限公司                           
;                                                          
;文件名称:	HS26P10_TC0
;摘    要:	TC0定时器例程
;当期版本:  V1.0                                             
;作    者:  Design-Digit                                        
;开始日期:  2022-00-00                                      
;完成日期:                                                 
;                                                          
;先前版本:                                                 
;作    者:                                                 
;创始日期:                                                 
;***********************************************************
;RC:	16MHz 2'
;RAM:	128 * 8
;ROM:	2K *16(OTP)
;STACK:	8-level
;***********************************************************
;TC0:功能说明
;	1.定时器功能
;	2.PWM功能
;	3.BUZ功能
;***********************************************************

#include	"HS26P10.inc"
;=========================================
;管脚定义
#define 	TXD 	P5.3    



;=============================================
;user general reg define
;=============================================
.data

DELAY_US		EQU		10H
MODE_TC0		EQU		01H
MODE_TC1		EQU		02H
MODE_TC2		EQU		03H
MODE_CMP_CNT	EQU		04H

FLAG			EQU     07EH
PFLAG_BUF		EQU		07FH

;-------------------------------------------      
;    标志位                    
;-------------------------------------------
#define F_KEY_ONCE	FLAG.0


;***************************************************
;    常量定义 
;***************************************************
CONST_RESET			EQU		0
CONST_SET			EQU		1


;=============================================
;程序开始
;=============================================
.code	
	ORG		000H
	JMP		MAIN			;跳转至主函数
	

	ORG		08H
	;JMP		INTERRUPT
INTERRUPT:	
	PUSH					;压栈，保存 ACC 和 STATUS
	SWAP	PFLAG			;PFLAG -> A	
	MOV		PFLAG_BUF,A		;A -> PFLAG_BUF

TC2_INT_JUDGE:			;TC2中断 
	BTS1	FTC2IRQ
	JMP		TC1_INT_JUDGE
	
TC2_INT:
	BCLR	FTC2IRQ			;/清中断	
	MOV		A,#00000001B
	XOR		P4,A		

TC1_INT_JUDGE:			;/TC1中断 
	BTS1	FTC1IRQ
	JMP		TC0_INT_JUDGE		
	
TC1_INT:
	BCLR	FTC1IRQ			;/清中断	
	MOV		A,#00000010B
	XOR		P4,A
	
TC0_INT_JUDGE:			;TC0中断
	BTS1	FTC0IRQ
	JMP		INT_BACK
	
TC0_INT:
	BCLR	FTC0IRQ			;/清中断	
	MOV		A,#00000100B
	XOR		P0,A
	;JMP		INT_BACK 
		
;-------------------------------------------
INT_BACK:
;-------------------------------------------
	SWAP	PFLAG_BUF		;/PFLAG_BUF -> A
	MOV		PFLAG,A			;/A -> PFLAG
	POP						;/出栈，恢复 ACC 和 STATUS
	RETI
		

;*******************************************************************************
;函数名：MAIN 
;*******************************************************************************
MAIN:	
	CALL	RAM_CLR			;/清bank0
	CALL	GPIO_init
	
	MOV		A,#2
	MOV		MODE_TC0,A		;/TC0工作模式
	CALL	TC0_Init	
	
WHILE_LOOP:
	MOV		A,#5AH 
	B0MOV	WDTR,A			;/清狗
	MOV		A,#0FFH	
	XOR		P0,A
	NOP
	NOP
	JMP		WHILE_LOOP
	
;*******************************************************************************
;函数名：GPIO_init
;传参：无
;返回值：无
;功能：配置I/O口输出模式
;引脚：P0n p2n p4n p5n
;备注：P04单向输入引脚
;*******************************************************************************
GPIO_init:							
	;/P0~	I/O口控制寄存器
	MOV		A,#0FFH			;/---- 0000
	MOV		P0M,A			;/0 = IN  1 = OUT	
	
	;/P2~	I/O口控制寄存器
	MOV		A,#0FFH			;/--00 0000
	MOV		P2M,A			;/0 = IN  1 = OUT
	
	;/P4~	I/O口控制寄存器
	MOV		A,#0FFH			;/---0 0000
	MOV		P4M,A			;/0 = IN  1 = OUT
	
	;/P5~	I/O口控制寄存器
	MOV		A,#0FFH			;/---0 0---
	MOV		P5M,A			;/0 = IN  1 = OUT
	
	
	;/P0~	I/O口数据寄存器
	MOV		A,#00000000B	;/---0 0000
	MOV		P0,A			;/0 = L  1 = H							
	;/P2~	I/O口数据寄存器
	MOV		A,#00000000B	;/--00 0000
	MOV		P2,A			;/0 = L  1 = H
	;/P4~	I/O口数据寄存器
	MOV		A,#00000000B	;/---0 0000
	MOV		P4,A			;/0 = L  1 = H
	;/P5~	I/O口数据寄存器
	MOV		A,#00000000B	;/---0 0---
	MOV		P5,A			;/0 = L  1 = H
	
	;/P0~	I/O口上拉寄存器
	MOV		A,#00000000B	;/---- 0000
	MOV		P0UR,A			;/0 = DIS  1 = EN							
	;/P2~	I/O口上拉寄存器
	MOV		A,#00000000B	;/--00 0000
	MOV		P2UR,A			;/0 = DIS  1 = EN	
	;/P4~	I/O口上拉寄存器
	MOV		A,#00000000B	;/---0 0000
	MOV		P4UR,A			;/0 = DIS  1 = EN	
	;/P5~	I/O口上拉寄存器
	MOV		A,#00000000B	;/---0 0---
	MOV		P5UR,A			;/0 = DIS  1 = EN	
	
	RET

;*******************************************************************************
;函数名：RAM_CLR
;传参：
;返回值：
;功能：清RAM,0~7f可间接寻址
;引脚：
;*******************************************************************************
RAM_CLR:
	B0MOV 	Y, #0			;/间接寻址bank区
	B0MOV 	Z, #7FH			;/间接寻址指针
CLR_RAM:
	CLR		@YZ				;/间接寻址数据
	DECMS	Z			
	JMP		CLR_RAM
	CLR		@YZ
	RET
	
;*******************************************************************************
;函数名：DELAY
;传参：DELAY_US：循环体的循环次数
;返回值：无
;功能：在循环体中延时10个指令周期
;引脚：无
;*******************************************************************************
DELAY:				
	MOV		DELAY_US,A	
DELAY_LOOP:	
	MOV		A,#5AH 			;1
	B0MOV	WDTR,A			;1	;/清狗
	JMP		$+1				;2
	JMP		$+1				;2
	NOP						;1
	DECMS	DELAY_US		;1/(2)
	JMP		DELAY_LOOP		;2	
	RET						;2			
	
;*******************************************************************************
;函数名：TC0
;传参：MODE_TC0: 定时器模式设置
;返回值：无
;功能：
;引脚：无
;*******************************************************************************
TC0_Init:
	MOV		A,MODE_TC0
	AND		A,#0x03
	ADD		PCL,A
	JMP		TC0_Timer		;/TC0——定时器（8位）
	JMP		TC0_PWM			;/TC0——pwm（8位）
	JMP		TC0_BUZ			;/TC0——蜂鸣器
	JMP		TC0_Timer		;/TC0——定时器（8位）

;---------------------------
;TC0-定时器模式
;---------------------------
TC0_Timer:
	;/TC0定时/计数器 
	MOV		A,#00H
	MOV		TC0C,A	
	
	;/TC0自动重装载寄存器
	MOV		A,#00H
	MOV		TC0R,A	
	
	;/TC0模式控制寄存器
	MOV		A,#0F4H			;1000 0100
	MOV		TC0M,A			; 
							;bit0:PWMEN：PWM 输出控制
							;bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
							;bit2:ALOAD：自动装载控制。仅当 PWMEN = 0 时有效
							;bit3:TCCKS：TC 时钟信号控制位
							;bit4~6:TR：TC 时钟控制位
								;TPS[2:0] 		TCnX8=0 		TCnX8=1 
									;000 		Fcpu / 256		Fosc / 128 
									;001 		Fcpu / 128		Fosc / 64 
									;010 		Fcpu / 64		Fosc / 32 
									;011 		Fcpu / 32		Fosc / 16 
									;100 		Fcpu / 16		Fosc / 8 
									;101 		Fcpu / 8		Fosc / 4 
									;110 		Fcpu / 4		Fosc / 2 
									;111 		Fcpu / 2		Fosc / 1
							;bit7:TR：TC 启动控制位
	
	;/TC0/TC1/TC2加速和TC0唤醒功能寄存器
	MOV		A,#0x00
	MOV		T0M,A			;--00 000-
							;bit1:TC0GN：TC0 绿色模式功能唤醒控制
							;bit2:TC0X8：TC0 内部时钟选择控制位
								;0=Fcpu,TC0RATE=FCPU/2~FCPU/256
								;1=FHOSC,TC0RATE=FCPU/2~FCPU/256
							;bit3:TC1X8：TC1 内部时钟选择控制位
								;0=TC1 内部时钟来至 FCPU，TC1RATE=FCPU/2~FCPU/256 
								;1=TC1 内部时钟来至 FHOSC，TC1RATE=FOSC/1~FOSC/128
							;bit4:TC2X8：TC2 内部时钟选择控制位
								;0=TC2 内部时钟来至 FCPU，TC1RATE=FCPU/2~FCPU/256 
								;1=TC2 内部时钟来至 FHOSC，TC1RATE=FOSC/1~FOSC/128
							;bit5:TC2 计时器不在 PWM 或 BUZ 时是 8 位还是 16 位
								;0=TC2 是 16 位计数器，此时 TC2CH 为高 8 位
								;1=TC2 是 8 位计数器
			
	;/中断标志寄存器
	BCLR	FTC0IRQ			;0000 --00
							;bit0:INT0 外部中断P0.0请求标志
							;bit1:INT1 外部中断P0.1请求标志
							;bit4:TC2IF：TC2 中断请求标志
							;bit5:TC0IF：TC0 中断请求标志
							;bit6:TC1IF：TC1 中断请求标志
							;bit7:ADCIF：ADC 中断请求标志
	
	;/中断控制寄存器
	BSET	FTC0IEN			;0000 --00
							;bit0:INT0IE: INT0 外部中断（P0.0）控制位
							;bit1:INT1IE：INT1 外部中断（P0.1）控制位
							;bit4:TC2IEN：TC2 中断控制位
							;bit5:TC0IEN：TC0 中断控制位
							;bit6:TC1IEN：TC1 中断控制位
							;bit7:ADCIEN：ADC 中断控制位
							
	;/中断全局使能寄存器						
	BSET	FGIE			;0--- -000
							;bit0:STKPB0
							;bit1:STKPB1
							;bit2:STKPB2
							;bit7:GIE：全局中断控制位
	
	RET

;---------------------------
;PWM-P54
;---------------------------
TC0_PWM:
	;/TC0定时/计数器 
	MOV		A,#00H
	MOV		TC0C,A	
	
	;/TC0占空比寄存器
	MOV		A,#3FH
	MOV		TC0R,A	
	
	;/TC0模式控制寄存器
	MOV		A,#0F1H			;1000 0001
	MOV		TC0M,A			;
							;bit0:PWMEN：PWM 输出控制
							;bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
							;bit2:ALOAD：自动装载控制。仅当 PWMEN = 0 时有效
							;bit3:TCCKS：TC 时钟信号控制位
							;bit4~6:TR：TC 时钟控制位
								;TPS[2:0] 		TCnX8=0 		TCnX8=1 
									;000 		Fcpu / 256		Fosc / 128 
									;001 		Fcpu / 128		Fosc / 64 
									;010 		Fcpu / 64		Fosc / 32 
									;011 		Fcpu / 32		Fosc / 16 
									;100 		Fcpu / 16		Fosc / 8 
									;101 		Fcpu / 8		Fosc / 4 
									;110 		Fcpu / 4		Fosc / 2 
									;111 		Fcpu / 2		Fosc / 1
							;bit7:TR：TC 启动控制位
							
	;/TC0/TC1/TC2加速和TC0唤醒功能寄存器
	MOV		A,#0x20
	MOV		T0M,A	
							;bit1:TC0GN：TC0 绿色模式功能唤醒控制
							;bit2:TC0X8：TC0 内部时钟选择控制位
								;0=Fcpu,TC0RATE=FCPU/2~FCPU/256
								;1=FHOSC,TC0RATE=FCPU/2~FCPU/256
							;bit3:TC1X8：TC1 内部时钟选择控制位
								;0=TC1 内部时钟来至 FCPU，TC1RATE=FCPU/2~FCPU/256 
								;1=TC1 内部时钟来至 FHOSC，TC1RATE=FOSC/1~FOSC/128
							;bit4:TC2X8：TC2 内部时钟选择控制位
								;0=TC2 内部时钟来至 FCPU，TC1RATE=FCPU/2~FCPU/256 
								;1=TC2 内部时钟来至 FHOSC，TC1RATE=FOSC/1~FOSC/128
							;bit5:TC2 计时器不在 PWM 或 BUZ 时是 8 位还是 16 位
								;0=TC2 是 16 位计数器，此时 TC2CH 为高 8 位
								;1=TC2 是 8 位计数器
			
	;/中断标志寄存器
	BCLR	FTC0IRQ			;0000 --00
							;bit0:INT0 外部中断P0.0请求标志
							;bit1:INT1 外部中断P0.1请求标志
							;bit4:TC2IF：TC2 中断请求标志
							;bit5:TC0IF：TC0 中断请求标志
							;bit6:TC1IF：TC1 中断请求标志
							;bit7:ADCIF：ADC 中断请求标志
	
	;/中断控制寄存器
	BSET	FTC0IEN			;0000 --00
							;bit0:INT0IE: INT0 外部中断（P0.0）控制位
							;bit1:INT1IE：INT1 外部中断（P0.1）控制位
							;bit4:TC2IEN：TC2 中断控制位
							;bit5:TC0IEN：TC0 中断控制位
							;bit6:TC1IEN：TC1 中断控制位
							;bit7:ADCIEN：ADC 中断控制位
							
	;/中断全局使能寄存器						
	BSET	FGIE			;0--- -000
							;bit0:STKPB0
							;bit1:STKPB1
							;bit2:STKPB2
							;bit7:GIE：全局中断控制位
	
	RET

;---------------------------
;BUZ-p54
;---------------------------
TC0_BUZ:
	;/TC0定时/计数器 
	MOV		A,#00H
	MOV		TC0C,A	
	
	;/TC0自动重装载寄存器
	MOV		A,#3FH
	MOV		TC0R,A	
	
	;/TC0模式控制寄存器
	MOV		A,#0F2H			;1000 0010
	MOV		TC0M,A			;
							;bit0:PWMEN：PWM 输出控制
							;bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
							;bit2:ALOAD：自动装载控制。仅当 PWMEN = 0 时有效
							;bit3:TCCKS：TC 时钟信号控制位
							;bit4~6:TR：TC 时钟控制位
								;TPS[2:0] 		TCnX8=0 		TCnX8=1 
									;000 		Fcpu / 256		Fosc / 128 
									;001 		Fcpu / 128		Fosc / 64 
									;010 		Fcpu / 64		Fosc / 32 
									;011 		Fcpu / 32		Fosc / 16 
									;100 		Fcpu / 16		Fosc / 8 
									;101 		Fcpu / 8		Fosc / 4 
									;110 		Fcpu / 4		Fosc / 2 
									;111 		Fcpu / 2		Fosc / 1
							;bit7:TR：TC 启动控制位
	
	;/TC0/TC1/TC2加速和TC0唤醒功能寄存器
	MOV		A,#0x00
	MOV		T0M,A	
							;bit1:TC0GN：TC0 绿色模式功能唤醒控制
							;bit2:TC0X8：TC0 内部时钟选择控制位
								;0=Fcpu,TC0RATE=FCPU/2~FCPU/256
								;1=FHOSC,TC0RATE=FCPU/2~FCPU/256
							;bit3:TC1X8：TC1 内部时钟选择控制位
								;0=TC1 内部时钟来至 FCPU，TC1RATE=FCPU/2~FCPU/256 
								;1=TC1 内部时钟来至 FHOSC，TC1RATE=FOSC/1~FOSC/128
							;bit4:TC2X8：TC2 内部时钟选择控制位
								;0=TC2 内部时钟来至 FCPU，TC1RATE=FCPU/2~FCPU/256 
								;1=TC2 内部时钟来至 FHOSC，TC1RATE=FOSC/1~FOSC/128
							;bit5:TC2 计时器不在 PWM 或 BUZ 时是 8 位还是 16 位
								;0=TC2 是 16 位计数器，此时 TC2CH 为高 8 位
								;1=TC2 是 8 位计数器
			
	;/中断标志寄存器
	BCLR	FTC0IRQ			;0000 --00
							;bit0:INT0 外部中断P0.0请求标志
							;bit1:INT1 外部中断P0.1请求标志
							;bit4:TC2IF：TC2 中断请求标志
							;bit5:TC0IF：TC0 中断请求标志
							;bit6:TC1IF：TC1 中断请求标志
							;bit7:ADCIF：ADC 中断请求标志
	
	;/中断控制寄存器
	BSET	FTC0IEN			;0000 --00
							;bit0:INT0IE: INT0 外部中断（P0.0）控制位
							;bit1:INT1IE：INT1 外部中断（P0.1）控制位
							;bit4:TC2IEN：TC2 中断控制位
							;bit5:TC0IEN：TC0 中断控制位
							;bit6:TC1IEN：TC1 中断控制位
							;bit7:ADCIEN：ADC 中断控制位
							
	;/中断全局使能寄存器						
	BSET	FGIE			;0--- -000
							;bit0:STKPB0
							;bit1:STKPB1
							;bit2:STKPB2
							;bit7:GIE：全局中断控制位
	
	RET

