;***********************************************************
;单    位:苏州华芯微电子有限公司                           
;                                                          
;文件名称:	HS23P2721_TC0							       
;摘    要:	TC0定时器例程						   			
;当期版本:	V1.0                                           
;作    者:	Design-Digit
;开始日期:  2022-09-07                                     
;完成日期:                                                 
;                                                          
;先前版本:                                                 
;作    者:                                                 
;创始日期:                                                 
;***********************************************************
;RAM: 96*8bit
;ROM: 2K×16
;STACK: 5-level
;***********************************************************

;/****TC0****功能说明****/
;/**8bit-定时器**/
;/**BUZ模式**/
;/**PWM模式**/

;***********************************************************
;files include
#include "HS23P2721.inc"


;=========================================
;管脚定义
;#define 	LED_RED 	P0.3    ;红灯



;=============================================
;user general reg define
;=============================================
.data
DELAY_US		EQU		00H

;中间 001H~05CH的RAM使用省略

FLAG			EQU     05EH
S_REG			EQU     05FH
;-------------------------------------------      
;    标志位                    
;-------------------------------------------
#define F_KEY_ONCE              FLAG.0



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


;=============================================
;程序开始
;=============================================
.code
	ORG		000H
	JMP		MAIN



	ORG		08H
	JMP		INT_PRO
;=============================================
;中断入口
;=============================================
INT_PRO:
	PUSH
	SWAP	PFLAG			;Bit0:Z-零标志位	
								;0-无进位/有借位
								;1-有进位/无借位
							;Bit1:DC-半进位/半借位（加减法指令）	
								;0-无低 4 位进位/有低 4 位借位
								;1-有低 4 位进位/无低 4 位借位
							;Bit2:C-进位/借位（加减法指令）		
								;0-无进位/有借位
								;1-有进位/无借位
							;Bit4：LVDF24-电压检测位
								;0-电源电压大于 2.4V
								;1-电源电压小于 2.4V
							;Bit5：LVDF36-电压检测位
								;0-电源电压大于 3.6V
								;1-电源电压小于 3.6V
							;Bit6:/PD-复位状态标志位
							;Bit7:/T0-复位状态标志位
								;/T0	/PD    	复位状态
								;0		0		看门狗复位
								;0		1		保留
								;1		0		上电或 LVD
								;1		1		外部复位
							
	MOV		S_REG,A	
	NOP
;=============================================
;中断函数  TC0中断程序
;=============================================
TC0_INT_JUDGE:	
	BTS1	FTC0IF			;FTC0IF:TC0 中断请求标志
	JMP		TC0_INT_END	
	BCLR	FTC0IF			;0-DIS,1-EN

	MOV		A,#0FFH			;---1 1---
	XOR		P5,A			;0-EN , 1-DIS

;---------------------------------------------
TC0_INT_END:	
;---------------------------------------------
INT_END:
;-------中断结束------------------------------
	SWAP	S_REG 
	MOV		PFLAG,A			;Bit0:Z-零标志位	
								;0-无进位/有借位
								;1-有进位/无借位
							;Bit1:DC-半进位/半借位（加减法指令）	
								;0-无低 4 位进位/有低 4 位借位
								;1-有低 4 位进位/无低 4 位借位
							;Bit2:C-进位/借位（加减法指令）		
								;0-无进位/有借位
								;1-有进位/无借位
							;Bit4：LVDF24-电压检测位
								;0-电源电压大于 2.4V
								;1-电源电压小于 2.4V
							;Bit5：LVDF36-电压检测位
								;0-电源电压大于 3.6V
								;1-电源电压小于 3.6V
							;Bit6:/PD-复位状态标志位
							;Bit7:/T0-复位状态标志位
								;/T0	/PD    	复位状态
								;0		0		看门狗复位
								;0		1		保留
								;1		0		上电或 LVD
								;1		1		外部复位							
	POP
	RETI
	
	
;***********************************************************
;函数名：GPIO_Init
;***********************************************************
GPIO_Init:
	;P0:P0端口寄存器
	MOV		A,#00H			;---0 0000
	B0MOV	P0,A			;0-L , 1-H	
	;P0UR:P0端口上拉寄存器
	MOV		A,#00H			;---0 0000
	B0MOV	P0UR,A			;0-DIS, 1-EN		
	;P0M:P0端口模式控制寄存器
	MOV		A,#0FFH			;---1 1111
	B0MOV	P0M,A			;0-IN,1-OUT
	
	
	;P4:P4端口寄存器
	MOV		A,#00H			;---0 0000
	B0MOV	P4,A			;0-L , 1-H	
	;P4UR:P4端口上拉寄存器
	MOV		A,#00H			;---0 0000
	B0MOV	P4UR,A			;0-DIS, 1-EN	
	;P4M:P4端口模式控制寄存器
	MOV		A,#0FFH		;---1 1111
	B0MOV	P4M,A			;0-IN,1-OUT
	
	
	;P5:P5端口寄存器
	MOV		A,#00H			;---0 0---
	B0MOV	P5,A			;0-L , 1-H	
	;P5UR:P5端口上拉寄存器
	MOV		A,#00H			;---0 0---
	B0MOV	P5UR,A			;0-DIS, 1-EN	
	;P5M:P5端口模式控制寄存器
	MOV		A,#0FFH			;---1 1---
	B0MOV	P5M,A			;0-IN,1-OUT
	
	RET
	
	
;***********************************************************
;函数名：MAIN
;***********************************************************	
MAIN:
	CALL	GPIO_Init
	CALL	RAM_CLR
;	CALL	TC0_Init_TC0_Mode_Timer
;	CALL	TC0_Init_TC0_Mode_PWM
	CALL	TC0_Init_TC0_Mode_BUZ
	
MAIN_LOOP:
	;WDTR:看门狗定时器
	MOV		A,#5AH	
	B0MOV	WDTR,A			;清看门狗定时器	
	
	;P0:P0端口寄存器
	MOV		A,#0FFH			;---0 0000
	XOR		P0,A			
	
	CALL	DELAY
MAIN_LOOP_END:
	JMP		MAIN_LOOP	
	
;---------------------------------------------
;Fcpu=4MHz;Ftc0=2MHz;  周期100us
;---------------------------------------------
TC0_Init_TC0_Mode_Timer:
	;TC0C:定时/计数器 0 的 8 位数据
	MOV		A,#56
	B0MOV	TC0C,A
	
	;TC0R:定时/计数器 0 自动装载位
	MOV		A,#56
	B0MOV	TC0R,A
	
	MOV		A,#00H			;---- 0000
	B0MOV	PWMS,A			;Bit0:PWMS0：PWM0输出端口选择
								;0-P54输出PWM0（前提PWMS1=0）
								;1-P41输出PWM0
							;Bit1:PWMS2：PWM2输出端口选择
								;0-P01输出PWM2
								;1-P40输出PWM2(前提PWMS3=0)
							;Bit2&Bit3:PWM3输出端口选择
								;00：P44输出PWM3 
								;01：P40输出PWM3 
								;10：P54输出PWM3 
								;11：P54和P40同时输出PWM3	
	
	;T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器
	MOV		A,#00H			;---0 000-
	B0MOV	T0M,A			;Bit1:TC0GN-TC0 绿色模式功能唤醒控制
								;0-DIS，1-EN
							;Bit2:TC0X8-TC0 内部时钟选择控制位
								;0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							;Bit3:TC1X8-TC1 内部时钟选择控制位
								;0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							;Bit4:TC2X8-TC2 内部时钟选择控制位
								;0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
	
	;TC0M:定时/计数器 0 模式控制位
	MOV		A,#0F4H			;1111 0100
	B0MOV	TC0M,A			;Bit0:PWMEN：PWM 输出控制
								;0-禁止 PWM 输出
								;1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
							;Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
								;0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
								;1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
							;Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
								;0-DIS,1-EN
							;Bit3:TnCKS:TC 时钟信号控制位
								;0-内部时钟（Fcpu 或 Fosc）
								;1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
							;Bit4~Bit6:TPS[2:0]: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 启动控制位
								;0-DIS,1-EN
	
	;TC0IF:TC0 中断请求标志
	BCLR	FTC0IF			;0-DIS,1-EN
	
	;FTC0IEN:TC0 中断控制位
	BSET	FTC0IEN			;0-DIS,1-EN
	
	;FGIE:全局中断控制位
	BSET	FGIE			;0-DIS,1-EN
	
	RET
	
;---------------------------------------------
;P41-PWM
;---------------------------------------------
TC0_Init_TC0_Mode_PWM:	
	;TC0C:定时/计数器 0 的 8 位数据
	MOV		A,#00H
	B0MOV	TC0C,A
	
	;TC0R:定时/计数器 0 自动装载位
	MOV		A,#80H
	B0MOV	TC0R,A
	
	MOV		A,#01H			;---- 0000
	B0MOV	PWMS,A			;Bit0:PWMS0：PWM0输出端口选择
								;0-P54输出PWM0（前提PWMS1=0）
								;1-P41输出PWM0
							;Bit1:PWMS2：PWM2输出端口选择
								;0-P01输出PWM2
								;1-P40输出PWM2(前提PWMS3=0)
							;Bit2&Bit3:PWM3输出端口选择
								;00：P44输出PWM3 
								;01：P40输出PWM3 
								;10：P54输出PWM3 
								;11：P54和P40同时输出PWM3
	
	;T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器
	MOV		A,#00H			;---0 000-	
	B0MOV	T0M,A			;Bit1:TC0GN-TC0 绿色模式功能唤醒控制
								;0-DIS，1-EN
							;Bit2:TC0X8-TC0 内部时钟选择控制位
								;0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							;Bit3:TC1X8-TC1 内部时钟选择控制位
								;0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							;Bit4:TC2X8-TC2 内部时钟选择控制位
								;0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
	
	;TC0M:定时/计数器 0 模式控制位
	MOV		A,#0E1H			;1110 0001
	B0MOV	TC0M,A			;Bit0:PWMEN：PWM 输出控制
								;0-禁止 PWM 输出
								;1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
							;Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
								;0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
								;1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
							;Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
								;0-DIS,1-EN
							;Bit3:TnCKS:TC 时钟信号控制位
								;0-内部时钟（Fcpu 或 Fosc）
								;1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
							;Bit4~Bit6:TPS[2:0]: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 启动控制位
								;0-DIS,1-EN		
	
	;TC0IF:TC0 中断请求标志
	BCLR	FTC0IF			;0-DIS,1-EN
	
	;FTC0IEN:TC0 中断控制位
	BSET	FTC0IEN			;0-DIS,1-EN
	
	;FGIE:全局中断控制位
	BSET	FGIE			;0-DIS,1-EN
	
	RET

;---------------------------------------------
;P01-BUZ
;---------------------------------------------
TC0_Init_TC0_Mode_BUZ:
	;TC0C:定时/计数器 0 的 8 位数据
	MOV		A,#00H
	B0MOV	TC0C,A
	
	;TC0R:定时/计数器 0 自动装载位
	MOV		A,#30H
	B0MOV	TC0R,A
	
	MOV		A,#00H			;---- 0001
	B0MOV	PWMS,A
	
	;T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器
	MOV		A,#00H			;---0 000-	
	B0MOV	T0M,A			;Bit1:TC0GN-TC0 绿色模式功能唤醒控制
								;0-DIS，1-EN
							;Bit2:TC0X8-TC0 内部时钟选择控制位
								;0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							;Bit3:TC1X8-TC1 内部时钟选择控制位
								;0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							;Bit4:TC2X8-TC2 内部时钟选择控制位
								;0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
								;1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
	
	;TC0M:定时/计数器 0 模式控制位
	MOV		A,#0E2H			;1110 0001
	B0MOV	TC0M,A			;Bit0:PWMEN：PWM 输出控制
								;0-禁止 PWM 输出
								;1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
							;Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
								;0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
								;1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
							;Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
								;0-DIS,1-EN
							;Bit3:TnCKS:TC 时钟信号控制位
								;0-内部时钟（Fcpu 或 Fosc）
								;1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
							;Bit4~Bit6:TPS[2:0]: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 启动控制位
								;0-DIS,1-EN		
	
	;TC0IF:TC0 中断请求标志
	BCLR	FTC0IF			;0-DIS,1-EN
	
	;FTC0IEN:TC0 中断控制位
	BSET	FTC0IEN			;0-DIS,1-EN
	
	;FGIE:全局中断控制位
	BSET	FGIE			;0-DIS,1-EN
	
	RET

;***********************************************************
;函数名：RAM_CLR
;***********************************************************
RAM_CLR:
	B0MOV	Y,#0
	B0MOV	Z,#5FH
CLR_RAM:
	CLR		@YZ
	DECMS	Z
	JMP		CLR_RAM
	CLR		@YZ
	RET


;***********************************************************
;函数名：DELAY
;传参：循环体调用次数
;返回值：
;功能：延时10个指令周期
;引脚：
;备注：
;***********************************************************

DELAY:
	MOV		DELAY_US,A
DELAY_LOOP:
	MOV		A,#5AH	
	B0MOV	WDTR,A		;清看门狗定时器
	JMP		$+1
	JMP		$+1
	DECMS	DELAY_US	
	JMP		DELAY_LOOP
	RET	 