;***********************************************************
;单    位:苏州华芯微电子有限公司                           
;                                                          
;文件名称:	HS16F1200_EEPROM *128					       
;摘    要:		
;		                                               
;当期版本:	V1.0                                       
;作    者:  LvBuWei                           		   
;开始日期:  2022.11.11                                  
;完成日期:                        
;******************************************************* 
;
;RAM:	64*8
;ROM:	1K×14
;STACK:	8-level
;EEPROM:128-bytes
;
;*******************************************************
;PIN-DEFINE
;****************************************************  
;	   	 VDD -1		8 - VSS	                     
;	   	 PB5 -2		7 - PB0	                     
;	OUT1 PB4 -3		6 - PB1 KEY1
;	OUT2 PB3 -4		5 - PB2	KEY2                    
;**************************************************** 

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

;***********************************************************
#define		TXD		PORTB,0


;***********************************************************
;user general reg define

Send_Cnt		EQU		041H
Send_Data_Buf	EQU		042H

EE_DAT_BUF		EQU		070H
EE_ADR_BUF		EQU		071H
DELAY_US		EQU		072H
;***********************************************************
;函数入口地址
	ORG		00H
	GOTO	MAIN
	
;中断入口地址
	ORG		04H

	

;***********************************************************
;函数名：MAIN
;***********************************************************
MAIN:
	CALL	GPIO_init
	CALL	BANK0_RAM_CLR

	CALL	EEPROM_CLR_ALL	;EE 全擦
	
	DECR	EE_DAT_BUF,1
	
MAIN_LOOP:

	CLRWDT
;***********************************************************
;对EE进行读写校验：地址00写数据FF；地址01写数据FE；地址与数据互补；
;显示到RAM：0x40~0x6F区间；超过该区间可粗略观测数据是否正常；
;全擦之后，不写数据读出来数据为FF；
;***********************************************************
TestEEPRM:
	CALL	EEPROM_Write_1Byte	
	CALL	EEPROM_Read_1Byte
		
	MOVIA	(0x40 & 0x7F)
	ADDAR	EE_ADR_BUF,0
	MOVAR	FSR
	MOVR	EE_DAT_BUF,0
	MOVAR	INDF
		
	DECR	EE_DAT_BUF,1
	INCR	EE_ADR_BUF,1
	
	;COMR	PB,1	;翻转PA电平
	;MOVIA	200
	;CALL	DELAY	;延时2000个指令周期	
	GOTO	MAIN_LOOP
	
	
;***********************************************************
;EEPROM_Write_1Byte
;***********************************************************
EEPROM_Write_1Byte:
	BSR		RP1	;bank2
	CLRR	EECON	;-000 0000
					;Bit6~Bit5：TIMEE<1:0>:EEPROM 操作时长选择位。
					;Bit4：ERSX16：16Byte 擦操作使能。
					;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
					;Bit2：ERASEEE：ERASE（位擦）操作使能。
					;Bit1：PROGEE：PROG 操作使能。
					;Bit0：READEE：READ 操作使能
	
	MOVR	EE_ADR_BUF,0
	MOVAR	EEADRL
	
	BSR		FERASEEE;Bit2：ERASEEE：ERASE（位擦）操作使能。
	NOP
	BTRSC	FERASEEE
	GOTO	$-1
	
	MOVR	EE_DAT_BUF,0
	MOVAR	EEDATL
	;CLRR	EE_DAT_BUF
	NOP
	BSR		FPROGEE	;Bit1：PROGEE：PROG 操作使能。
	BTRSC	FPROGEE
	GOTO	$-1
	
	BCR		RP1	;bank2	
	RETURN
	
;***********************************************************
;EEPROM_Read_1Byte
;***********************************************************
EEPROM_Read_1Byte:
	BSR		RP1	;bank2
	CLRR	EECON	;-000 0000
					;Bit6~Bit5：TIMEE<1:0>:EEPROM 操作时长选择位。
					;Bit4：ERSX16：16Byte 擦操作使能。
					;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
					;Bit2：ERASEEE：ERASE（位擦）操作使能。
					;Bit1：PROGEE：PROG 操作使能。
					;Bit0：READEE：READ 操作使能
	
	MOVR	EE_ADR_BUF,0
	MOVAR	EEADRL
	
	BSR 	FREADEE	;Bit0：READEE：READ 操作使能
	NOP
	MOVR	EEDATL,0
	MOVAR	EE_DAT_BUF
	BCR		RP1	;bank2	
	RETURN
	
;***********************************************************
;EEPROM_CLR_ALL:全擦
;执行全擦操作时，需先使能 ERSALLEE，再使能 ERASEEE
;***********************************************************
EEPROM_CLR_ALL:
	BSR		RP1	;bank2
	CLRR	EECON	;-000 0000
					;Bit6~Bit5：TIMEE<1:0>:EEPROM 操作时长选择位。
					;Bit4：ERSX16：16Byte 擦操作使能。
					;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
					;Bit2：ERASEEE：ERASE（位擦）操作使能。
					;Bit1：PROGEE：PROG 操作使能。
					;Bit0：READEE：READ 操作使能
	
	CLRR	EEADRL
	NOP
	BSR  	ERSALLEE;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
	BSR		ERASEEE	;Bit2：ERASEEE：ERASE（位擦）操作使能。
	NOP
	BTRSC	ERASEEE
	GOTO	$-1		;wait finish 
	BCR		RP1	;bank2
	RETURN

;***********************************************************
;函数名：GPIO_init
;注意寄存器所在 bank 区域
;***********************************************************
GPIO_init:
	BSR		STATUS,5	;转到bank1
	
	;OPTION_REG(BANK1)
	MOVIA	000H		;0000 0000
	MOVAR	OPTION_REG	;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）	;0-falling edge, 1-rising edge
						;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge
						;Bit5：T0CS：TMR0时钟源选择位					;0-fcpu, 1-ExitClock
						;Bit4：T0SE：TMR0时钟源边沿选择位				;0-falling edge, 1-rising edge
						;Bit3：PSA：预分频分配位						;0-TMR0, 1-WDT
						;Bit2~Bit0：PS2:PS0：预分频比率选择位

	;PCON(BANK1)(芯片控制寄存器)
	MOVIA	0A0H		;101- ----   	
	MOVAR	PCON		;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
						;Bit6：EIS: IOB0/INT引脚定义位			;0-DIS, 1-EN
						;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
							
	;TRISB(BANK1)(I/O口PB控制寄存器)
	MOVIA	00H			;0000 0000 			
	MOVAR	TRISB		;0-OUT, 1-IN
	
	;PBIC0(BANK1)(PA口驱动选择寄存器)		
	MOVIA	00H			;0000 0000
	MOVAR	PBIC0		;0-DIS, 1-EN
	
	;WUCON(BANK1)(PORB输入状态变化中断/唤醒控制寄存器)
	MOVIA	00H			;0000 0000
	MOVAR	WUCON		;0-DIS, 1-EN
	
	BCR		STATUS,5	;转到bank0
		
	;PDCON(BANK0)(内部下拉控制寄存器)
	MOVIA	0FFH		;1111 1111
	MOVAR	PDCON		;0-EN, 1-DIS	
	
	;ODCON(BANK0)(PB漏极开路控制寄存器)
	MOVIA	00H			;0000 0000
	MOVAR	ODCON		;0-DIS, 1-EN
	
	;PHCON(BANK0)(PB 内部上拉控制寄存器)
	MOVIA	0FFH		;1111 1111
	MOVAR	PHCON		;0-EN, 1-DIS
	
	RETURN
	
;***********************************************************
;函数名：BANK0_RAM_CLR
;功能：清bank0
;[40H~7FH]
;***************************************************
BANK0_RAM_CLR:
	MOVIA	0X3F
	MOVAR	040H
	MOVIA	0X7F
	MOVAR	FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRR	INDF
	DECR	FSR,1
	DECRSZ	040H,1
	GOTO	BANK0_RAM_CLR_LOOP	
	RETURN

	
;***********************************************************
;函数名：DELAY
;传参：循环体调用次数
;返回值：
;功能：延时10个指令周期
;引脚：
;备注：
;***********************************************************
DELAY:					
	MOVAR	DELAY_US	
DELAY_LOOP:	
	CLRWDT				;1;/清看门狗
	GOTO	$+1			;2
	GOTO	$+1			;2
	GOTO	$+1			;2
	DECRSZ	DELAY_US,1	;1/(2)
	GOTO	DELAY_LOOP	;2	
	RETURN				;2
	
;***********************************************************
;函数名：Send_Data
;传参：	Send_Data_Buf
;***********************************************************
Send_Data:
	MOVAR	Send_Data_Buf
	MOVIA	08H
	MOVAR	Send_Cnt	;发送 8 bit
	
Send_Data_LOOP:
	BTRSS	Send_Data_Buf,7 ;先发高位
	GOTO	Send_Bit0
	;GOTO	Send_Bit1

Send_Bit1:	
	BSR		TXD	
	MOVIA	150
	CALL	DELAY
	
	BCR		TXD	
	MOVIA	50
	CALL	DELAY
	GOTO	Send_NEXT_Bit
	
Send_Bit0:	
	BSR		TXD	
	MOVIA	50
	CALL	DELAY
	
	BCR		TXD	
	MOVIA	150
	CALL	DELAY
	;GOTO	Send_NEXT_Bit
	
Send_NEXT_Bit:
	RLR		Send_Data_Buf,1
	DECRSZ	Send_Cnt,1
	GOTO	Send_Data_LOOP
	RETURN
	