;-----------------------------------------------------
;S3F9454,FOSC=3.2MHZ
.include "s3c9454.reg"
.include "\myfile\sam\mysam.inc"
;-----------------------------------------------------
;以下为程序运行所用变量定义
;00H--1FH所有寄存器必须在必要的时候初始化为合适的值
RUNFLAG EQU 00H ;运行标志寄存器
DISPFLAG EQU 01H ;显示标志寄存器
DELAY_RUN EQU 02H ;省电模式加热时间计数器
DELAY_FREE EQU 03H ;省电模式间歇时间计数器
IM_LOOP EQU 04H ;省电模式运行时间计时器
FUNC_LOOP EQU 05H ;各功能运行步计数器
KEY_CODEA EQU 06H ;按键扫描代码A
TEMP_VOL EQU 07H ;定温加热方式热敏温度设置电压
FIRE_SELE EQU 08H ;功率选择代码
KEY_CODEB EQU 09H ;按键扫描代码B
HOURS EQU 0AH ;时间显示小时位
MINUTES EQU 0BH ;时间显示分钟位
SECONDS EQU 0CH ;时间显示秒位
OLD_FIRE EQU 0EH ;老的火力选择值
LOCK_FIRE EQU 0FH ;定火力加热火力参数保存值
LOCK_TEMP EQU 10H ;定温加热温度参数保存值
TEMP_SELE EQU 11H ;定温加热温度选择级别
DELAY_PV EQU 12H ;电源电压异常等候计时器
NOFZ_VOL EQU 13H ;无负载检查电流电压设定值

MIC_HIGH EQU 15H ;音符首地址高位 (在本程序中因所有高位地址均为0FH,所以未用)
MIC_LOW EQU 16H ;音符首地址低位
LED_LOOP EQU 17H ;LED显示循环扫描计数器
FIRE_CVOL EQU 18H ;火力级对应负载电流电压值
KEY_TMRL EQU 19H ;按键扫描定时器低位
KEY_TMRH EQU 1AH ;按键扫描定时器高位

FUNC_LED EQU 1EH ;功能选择LED指示代码
FIRE_LED EQU 1FH ;火力指示LED代码
ERRFLAG EQU 20H ;错误标志寄存器
FLASHFLAG EQU 21H ;数码显示控制标志寄存器
DELAY_3S EQU 22H ;负载检测延时3S计时器
DELAY_2M EQU 23H ;负载检测2分钟延时计时器
CURAD_DT EQU 24H ;电流检测值
HSRAD_DT EQU 27H ;热敏电阻检测电压值
IGBTAD_DT EQU 28H ;IGBT热敏电阻检测值
WAIT_TMR EQU 29H ;预约或定时等候输入定时
WAIT_FIRE EQU 2AH ;等候火力输入定时
DELAY_HOTA EQU 2BH ;暂存器A(用于功能执行时暂存时间数据)
DELAY_HOTB EQU 2CH ;B
DELAY_HOTC EQU 2DH ;C
OLD_TEMP EQU 2EH ;老的温度检测值
NEW_TEMP EQU 2FH ;新的温度检测值
PVAD_DT EQU 30H ;电源电压检测值
TMR_HALFSEDA EQU 31H ;0.5S定时计数器
TMR_HALFSEDB EQU 32H ;0.5S定时计数器
DIGITA EQU 33H ;三位数码管A位显示数码
DIGITB EQU 34H ;三位数码管B位显示数码
DIGITC EQU 35H ;三位数码管C位显示数码

TMRFLAG EQU 37H ;定时器标志寄存器
DIRECT_LED EQU 38H ;三位数码管A位显示代码/指示LED
SEG_B EQU 39H ;三位数码管B位显示代码
SEG_C EQU 3AH ;三位数码管C位显示代码

TEMP_POINT EQU 3DH ;功能执行时控温点
FUNC_CODE EQU 3EH ;

;-----------------------------------------------------------------------
;运行状态控制标志寄存器相关标志位定义
;RUNFLAG.0---KEY_DOWN 按键扫描时无键按下标志,1-有键按下,0-无键按下
;RUNFLAG.1---NO_FZ 检测到无锅标志,1-无锅,0-正常
;RUNFLAG.2---IM_MODE 间歇运行模式标志,1-间断加热,0-正常
;RUNFLAG.3---ASK_STOP,要求停机标志,1-运行中要求停机,0-不作处理
;RUNFLAG.4---NO_AD 禁止负载检查标志,1-禁止,0-允许
; 若IM_MODE=1 and NO_AD=1,则表示处于间歇工作未加热状态
; 若IM_MODE=0,and NO_AD=1,则表示处于停止加热等待状态
;RUNFLAG.5---ASK_MIC,要求播放音乐标志,1-PLAY,0-NO PLAY
;RUNFLAG.6---未用
;RUNFLAG.7---ON_OFF 开机运行标志,1-已开机(或要求开机),0-待机状态
;-----------------------------------------------------
                .defvar =0,ON_OFF,NO_FZ,NO_AD,ASK_MIC
                .defvar =0,ASK_STOP,IM_MODE,KEY_DOWN
KEY_DOWN .setvar 0
NO_FZ .setvar 1
IM_MODE .setvar 2
ASK_STOP .setvar 3
NO_AD .setvar 4
ASK_MIC .setvar 5
ON_OFF .setvar 7
;------------------------------------------------------------------------
;定时控制标志寄存器DISPFLAG各标志位定义
;DISPFLAG.0----DES_FLAG,已设定预约状态标志,1-已设定预约,0-未设置预约
;DISPFLAG.1----TMR_FLAG,已设定定时状态标志,1-已设定定时,0-未设置定时
;DISPFLAG.2----TMR_WAIT 等待输入时间标志(闪烁显示数码管),1-等待,0-未等待
;DISPFLAG.3----FIRE_WAIT 等待改变火力标志(闪烁显示LED),1-等待,0-未等待
;DISPFLAG.4----电源电压异常时等候5S标志,1-异常等候,0-正常
;DISPFLAG.5----DI_TMR_DISP,禁止数码管时间显示标志(只显示AU),1-禁止,0-允许
;DISPFLAG.6----DI_FIRE_DISP,禁止火力LED显示标志,1-禁止,0-允许
;DISPFLAG.7----DI_FIRE_TMR,禁止调节火力及定时标志,1-禁止,0-允许
                .defvar =0,DES_FLAG,TMR_FLAG,TMR_WAIT,FIRE_WAIT
                .defvar =0,PV_WAIT,DI_TMR_DISP,DI_FIRE_DISP,DI_FIRE_TMR
DES_FLAG .setvar 0
TMR_FLAG .setvar 1
TMR_WAIT .setvar 2
FIRE_WAIT .setvar 3
PV_WAIT .setvar 4
DI_TMR_DISP .setvar 5
DI_FIRE_DISP .setvar 6
DI_FIRE_TMR .setvar 7
;--------------------------------------------------------------------------
;定时标志寄存器TMRFLAG各标志位定义
;TMRFLAG.0----0.5S定时标志B,1-已计时0.5S,0-计时未到(该标志专用于运行时负载检测定时)
;TMRFLAG.1----0.5S定时标志3,1-已计时0.5S,0-计时未到(该标志专用于闪烁数码显示定时)
;TMRFLAG.2----0.5S定时标志B,1-已计时0.5S,0-计时未到(该标志专用于运行时定时)
;TMRFLAG.3----1S定时标志A,1-已计时1S,0-计时未到(该标志专用于等候状态按键输入定时控制)
;TMRFLAG.4----1S定时标志B,1-已计时1S,0-计时未到(该标志专用于IM_MODE运行定时)
;TMRFLAG.5----1S定时标志C,1-已计时1S,0-计时未到(该标志用于各种实用功能运行定时控制)
;TMRFLAG.6----1M_FLAG,1分钟定时标志,1-已计时1分钟,0-计时未到
;TMRFLAG.7----保留未用
                .defvar =0,ONE_MIN,ONE_SEDA,ONE_SEDB,ONE_SEDC
                .defvar =0,HALF_SEDA,HALF_SEDB,HALF_SEDC
HALF_SEDA .setvar 0
HALF_SEDB .setvar 1
HALF_SEDC .setvar 2
ONE_SEDA .setvar 3
ONE_SEDB .setvar 4
ONE_SEDC .setvar 5
ONE_MIN .setvar 6
;-------------------------------------------------------------------------
;数码显示控制标志寄存器FLASHFLAG各标志位定义
;FLASHFLAG.0---FLASH_ALL闪烁全部数码管标志,1-闪烁,0-不闪烁
;FLASHFLAG.1---FLASH_B闪烁数码管B位标志,1-闪烁,0-不闪烁
;FLASHFLAG.2---FLASH_C闪烁数码标志,1-闪烁,0-不闪烁
;FLASHFLAG.3---保留未用
;FLASHFLAG.4---保留未用
;FLASHFLAG.5---保留未用
;FLASHFLAG.6---保留未用
;FLASHFLAG.7---保留未用
                .defvar =0,FLASH_ALL,FLASH_A,FLASH_B,FLASH_C
FLASH_ALL .setvar 0
FLASH_A .setvar 1
FLASH_B .setvar 2
FLASH_C .setvar 3
;------------------------------------------------------------------------
;出错故障代码定义
;ERRFLAG=1----PVH_STOP 电源电压过高错误代码
;ERRFLAG=2----PVL_STOP 电源电压过低错误代码
;ERRLFAG=3----HSR_OPEN 炉盘热敏电阻开路错误代码
;ERRFLAG=4----HSR_HOT 炉盘干烧过热错误
;ERRFLAG=5----IGBT_OPEN IGBT热敏开路错误代码
;ERRFLAG=6----IGBT_HOT IGBT热敏过热错误代码
;ERRFLAG=7----保留未用
;-----------------------------------------------------
;各输入输出I/O口功能定义:
;P0.0------按键扫描A线接口,输入
;P0.1------按键扫描B线接口,输入
;P0.2------风扇驱动控制,输出,1-启动风扇,0-关闭风扇
;P0.3------炉盘热敏检测,A/D输入
;P0.4------IGBT热敏检测,A/D输入
;P0.5------电源电压检测,A/D输入
;P0.6------开关机及功率调节,PWM输出
;P0.7------工作电流检测,A/D输入
                .defvar =0,KEY_LINEA,KEY_LINEB,FANS_CTRL,HSR_IN
                .defvar =0,IGBT_IN,PV_IN,ON_OFF_CTRL,CUR_IN
KEY_LINEA .setvar 0
KEY_LINEB .setvar 1
FANS_CTRL .setvar 2
HSR_IN .setvar 3
IGBT_IN .setvar 4
PV_IN .setvar 5
ON_OFF_CTRL .setvar 6
CUR_IN .setvar 7
;-----------------------------------------------
;P1.0------74LS164时钟线驱动,输出
;P1.1------74LS164数据线驱动,输出
;P1.2------未用,输入带上拉
                .defvar =0,CLK_LINE,DATA_LINE
CLK_LINE .setvar 0
DATA_LINE .setvar 1
;----------------------------------------------
;P2.0------蜂鸣器驱动,T0匹配输出
;P2.1------功能LED控制线驱动,输出,1-打开,0-关闭
;P2.2------火力级别指示LED控制线驱动,输出,1-打开,0-关闭
;P2.3------状态指示LED及数码管A位(半位)控制线驱动,输出,1-关闭,0-打开
;P2.4------三位数码管B位控制线驱动,输出,1-关闭,0-打开
;P2.5------三位数码管C位控制线驱动,输出,1-关闭,0-打开
;P2.6------音乐播放时间控制线,1-打开,0-关闭
                .defvar =0,BUZ_CTRL,FUNC_LED_CTRL,FIRE_LED_CTRL,DIRECT_LED_CTRL
                .defvar =0,SEG_B_CTRL,SEG_C_CTRL,MUSIC_CTRL
BUZ_CTRL .setvar 0
FUNC_LED_CTRL .setvar 1
FIRE_LED_CTRL .setvar 2
DIRECT_LED_CTRL .setvar 3
SEG_B_CTRL .setvar 4
SEG_C_CTRL .setvar 5
MUSIC_CTRL .setvar 6
;--------------------------------------------------------
;-------<>
        ORG 0000H ;S3C9454 has only one interrupt vector
        VECTOR 00H,INT_9454
;-----------------------------------------------------------
;first level to sixth level fire current voltage code
FIRE_VOL_CODE:
        DB 70H ;0---300w,V=2.20v
        DB 95H ;1---600w,V=2.80V
        DB 0B0H ;2---1000W,V=3.30V
        DB 0D0H ;3---1300W,V=3.60V
        DB 0E5H ;4---1500W,V=4.00V
        DB 0F5H ;5---1800W
;-------------------------------------------------------------
TEMP_FIRE_CODE:
        DB 08AH
        DB 0A0H
        DB 0B0H
        DB 0D0H
        DB 0E0H
        DB 0F0H
;--------------------------------------------------------------
TEMP_VOL_CODE:
        DB 0A8H ;1---3.30V
        DB 08AH ;2---2.70V
        DB 066H ;3---2.00V
        DB 052H ;4---1.60V
        DB 042H ;5---1.30V
        DB 033H ;6---1.00V
;-------------------------------------------------------------
;fire select direct led code
FIRE_LED_CODE:
        DB 0FBH
        DB 0F7H
        DB 0EFH
        DB 0DFH
        DB 0BFH
        DB 07FH
;-------------------------------------------------------------
;function select display code rom define,contain power direct
;--------------------------
FUNC_LED_CODE:
        DB 01111111B ;ne_nai
        DB 10111111B ;bao_tang code
        DB 11011111B ;shao_kao code
        DB 11101111B ;zheng_zhu code
        DB 11110111B ;huo_guo code
        DB 11111011B ;zhu_fan code
        DB 11111101B ;shao_shui code
        DB 11110111B ;jian_chao code
        DB 11111011B ;lock fire code
        DB 01111111B ;lock temp code
;---------------------------------------------------------
;key scan convert code mem
KEY_CVT_CODEA:
        DB 09H ;LOCK_FIRE
        DB 068H ;JIAN_CHAO
        DB 065H ;HUO_GUO
        DB 0E6H ;ZHU_FAN
        DB 0E7H ;SHAO_SHUI
KEY_CVT_CODEB:
        DB 0AH ;LOCK_TEMP
        DB 063H ;SHAO_KAO
        DB 0E4H ;ZHENG_ZHU
        DB 0E1H ;RE_NAI
        DB 0E2H ;BAO_TANG
;---------------------------------------------------------
;-------芯片SMART系统予定义------------
        ORG 003CH
        DB 00H ;003CH,must be initialized to 0
        DB 00H ;003DH,must be initialized to 0
        DB 0E7H ;003EH,enable LVR(2.3V)
        DB 03H ;003FH,internal RC(3.2MHZ in Vdd=5V)
;-----------------------------------------------------------
;音符频率参数存储区,以中音'1'(523HZ)为起点
;T0_Fosc=2.5US,该参数为二分频值
        ORG 0040H
MUSIC_NOTE:
        ;中音符区
NOTE_LOW:
        DB 0FFH ;代码'01',中音符'1',F=523HZ,超出范围
        DB 0FFH ;代码'02',中音符'2',F=587HZ,超出范围
        DB 0FFH ;代码'03',中音符'3',F=659HZ,超出范围
        DB 0FFH ;代码'04',中音符'4',F=698HZ,超出范围
        DB 0FFH ;代码'05',中音符'5',F=784HZ
        DB 0E3H ;代码'06',中音符'6',F=880HZ
        DB 0CAH ;代码'07',中音符'7',F=987HZ
        ;中高音符区
NOTE_MIDU:
        DB 0BFH ;代码'11',中高音符'1',F=1046HZ
        DB 0AAH ;代码'12',中高音符'2',F=1174HZ
        DB 098H ;代码'13',中高音符'3',F=1318HZ
        DB 08FH ;代码'14',中高音符'4',F=1396HZ
        DB 07FH ;代码'15',中高音符'5',F=1568HZ
        DB 071H ;代码'16',中高音符'6',F=1760HZ
        DB 065H ;代码'17',中高音符'7',F=1975HZ
        ;高音符区
NOTE_HIGH:
        DB 060H ;代码'21',中高音符'1',F=2092HZ
        DB 055H ;代码'22',中高音符'2',F=2348HZ
        DB 04CH ;代码'23',中高音符'3',F=2636HZ
        DB 048H ;代码'24',中高音符'4',F=2792HZ
        DB 040H ;代码'25',中高音符'5',F=3136HZ
        DB 039H ;代码'26',中高音符'6',F=3520HZ
        DB 032H ;代码'27',中高音符'7',F=3950HZ
        ;音符播放时间及间歇时间模式定义
        ;以4MS为单位时间
MUSIC_TIME:
        DB 15H,15H ;代码'1',1/4拍,Ton=84ms,Toff=84ms
        DB 2AH,2AH ;代码'2',1/2拍,Ton=168ms,Toff=168ms
        DB 54H,54H ;代码'3',1拍 ,Ton=336ms,Toff=336ms
        DB 0A8H,054H ;代码'4',1-1/2拍,Ton=672ms,Toff=336ms
        DB 0A8H,0A8H ;代码'5',2拍 ,Ton=672ms,Toff=672ms
        DB 000H,000H
;-----------------------------------------------------------
;上电音乐音符存储区:
NOTE_POWER:
        ;----------------
        DB 68H,19H,19H ;T=520us
        DB 5CH,19H,19H ;T=460us
        DB 48H,19H,19H ;T=360us
        DB 5AH,19H,19H ;T=450us
         
        DB 68H,19H,19H ;T=520us
        DB 5CH,19H,19H ;T=460us
        DB 48H,19H,19H ;T=360us
        DB 5AH,19H,0C8H ;T=450us
        DB 00H
;-----------------------------------------------------------
;开机音符代码存储区:
NOTE_ON:
        DB 68H,19H,19H
        DB 5CH,19H,19H
        DB 48H,19H,19H
        DB 48H,19H,64H
        DB 00H
;------------------------------
;关机音符代码存储区:
NOTE_OFF:
        DB 48H,19H,19H
        DB 48H,19H,19H
        DB 5CH,19H,19H
        DB 68H,19H,64H
        DB 00H ;END CODE
;-----------------------------
;按键'当'音符存储区:
NOTE_DANG:
        DB 68H,32H,0A0H
        DB 00H
;-----------------------------
;增大音符存储区
NOTE_INC:
        DB 68H,19H,19H
        DB 5CH,19H,64H
        DB 00H ;END CODE
;-----------------------------
;减小音符存储区
NOTE_DEC:
        DB 5CH,19H,19H
        DB 68H,19H,64H
        DB 00H ;END CODE
;-----------------------------------------------------------
;错误报警音符存储区
NOTE_ERROR:
        DB 68H,32H,7DH
        DB 68H,32H,7DH
        DB 68H,32H,7DH
        ;DB 68H,7DH,7DH
        DB 00H ;END CODE
;------------------------------------------------------------
;功能完成提示音符存储区
FUNC_FINISHED:
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 68H,32H,0E0H
        DB 00H
;----------------------------------------------------------------
;digit display code rom define
;----------------------------
DIGIT_CVT_CODE:
        DB 00000011B ;'0'code
        DB 10011111B ;'1'code
        DB 00100101B ;'2'code
        DB 00001101B ;'3'code
        DB 10011001B ;'4'code
        DB 01001001B ;'5'code
        DB 01000001B ;'6'code
        DB 00011111B ;'7'code
        DB 00000001B ;'8'code
        DB 00001001B ;'9'code
        DB 00010001B ;'A'code
        DB 10000011B ;'U'code
        DB 00000000B ;display all
        DB 11111101B ;display '-' code
        DB 01100001B ;display 'E' code
        DB 11111111B ;nothing to display
;------------------------------------------------------------
;各功能模块地址向量表
FUNC_LIST:
        VECTOR $,RE_NAI_PROC ;func_code=01h
        VECTOR $,BAO_TANG_PROC ;func_code=02h
        VECTOR $,SHAO_KAO_PROC ;func_code=03h
        VECTOR $,ZHENG_ZHU_PROC ;func_code=04h
        VECTOR $,HUO_GUO_PROC ;func_code=05h
        VECTOR $,ZHU_FAN_PROC ;func_code=06h
        VECTOR $,SHAO_SHUI_PROC ;func_code=07h
        VECTOR $,JIAN_CHAO_PROC ;func_code=08h
        VECTOR $,LOCK_FIRE_PROC ;func_code=09h
        VECTOR $,LOCK_TEMP_PROC ;func_code=0ah
;音乐音符存储向量表:
MUSIC_VECTOR:
        VECTOR $,NOTE_QUANSHUI
        VECTOR $,NOTE_GONGXI
;-----------------------------------------------------------
;function start fire level code
FUNC_FIRE_CODE:
        DB 02H ;ne_nai set 600W
        DB 03H ;bao_tang set 1000W
        DB 03H ;shao_kao set 1000W
        DB 06H ;zheng_zhu set 1800W
        DB 06H ;huo_guo set 1000W
        DB 03H ;zhu_fan set 1800W
        DB 06H ;shao_shui set 1500W
        DB 04H ;jian_chao set 1000W
;-----------------------------------------------------------
;-------<>
        ORG 0100H

RESET: ;-------------------------
        ;follow must set
        DI ;disable interrupt
        LD BTCON,#10100011B ;Watch-dog disable
        LD CLKCON,#00011000B ;selet non-divided CPU clock
        LD SP,#0C0H ;Stack pointer must be set as 0C0H
        ;-------------------------
        LD P0PND,#00H ;P0/INT disable
        LD PWMCON,#01011100B ;enable PWM output
                                                ;PWM_CLK=Fosc/8
        LD P0CONH,#11011111B ;set P0.7 as A/D input
                                                ;set P0.6 as PWM output
                                                ;set P0.5 as A/D input
                                                ;set P0.4 as A/D input
        LD P0CONL,#11100101B ;set P0.3 as A/D input
                                                ;set P0.2 as push-pull output
                                                ;set P0.1 as input with pull-up
                                                ;set P0.0 as input with pull-up
        LD P1CON,#00001010B ;set P1.0 as push-pull output
                                                ;set P1.1 as push-pull output
        LD P2CONH,#01001010B ;set P2.6 as push-pull output
                                                ;set P2.5 as push-pull output
                                                ;set P2.4 as push-pull output
        LD P2CONL,#10101011B ;set P2.3 as push-pull output
                                                ;set P2.2 as push-pull output
                                                ;set P2.1 as push-pull output
                                                ;set P2.0 is T0 match output
        CALL TURN_OFF
        AND P0,#11111011B ;turn off FANS
        AND P2,#10111001B ;turn off MUSIC_CTRL,fire_led,func_led ctrl line
        OR P2,#00111100B ;turn off digit
        ;start initiated all ram
START_INIT:
        LD R0,#00H
        LD R1,#4FH
        CALL CLR_RAM
        CALL DELAY_100MS
        CALL DELAY_100MS
        CALL DELAY_100MS
        CALL DELAY_100MS
        CALL DELAY_100MS
        
        LD T0CON,#01001010B ;set T0 input clock=Fosc/256
        LD T0DATA,#32H ;set T0 interrup every 2ms
        
        CLR RUNFLAG ;clear all flag
        LD KEY_CODEA,#0FFH
        LD KEY_CODEB,#0FFH
      
        ;power on check
        CALL PV_CHECK
        CP ERRFLAG,#00H
        JR NE,MAIN
        CALL IGBT_CHECK
        CP ERRFLAG,#00H
        JR NE,MAIN
        CALL HSR_CHECK

;------------------------------------------------------------
MAIN:
        ;follows register must be initialed
        CALL TURN_OFF
        CLR DISPFLAG
        CLR TMRFLAG
        LD FUNC_CODE,#00H
        LD OLD_FIRE,#0FFH ;reset old_fire=0ffh
        LD LOCK_FIRE,#05H ;set lock fire start=05h
        LD LOCK_TEMP,#02H ;set lock temp start=02h
        LD LED_LOOP,#01H ;reset led loop counter
        CLR DELAY_3S
        CLR DELAY_2M
   
        LD MIC_HIGH,#00H
        LD MIC_LOW,#NOTE_ERROR
        CP ERRFLAG,#00H
        JR NE,RESET_FLAG ;if error,set music=error
        LD MIC_LOW,#NOTE_POWER
        TMBIT RUNFLAG,ASK_STOP ;check ASK_STOP flag
        JR Z,RESET_FLAG ;if ask_stop=0,set music=power_on
        LD MIC_LOW,#NOTE_OFF ;else set music=turn_off
         ;----------------------------------------
RESET_FLAG:
        AND RUNFLAG,#01H ;only save key_down flag
        SETBIT RUNFLAG,ASK_MIC ;set MUSIC flag
        EI
        JP RUN_CODE_CVT
;-------------------------------------------------
MAINLOOP:
        DI
        CALL KEY_SCAN ;key scan proc
        TMBIT RUNFLAG,ASK_STOP ;test ASK_STOP flag
        JR NZ,MAIN ;if ask stop,ready stop
        EI
        TMBIT RUNFLAG,ASK_MIC ;check MUSIC flag
        JR Z,TEST_ON_OFF
        CALL MUSIC ;if MUSIC=1,play music
        TMBIT RUNFLAG,ASK_STOP ;test ASK_STOP flag
        JR NZ,MAIN ;if ask stop,ready stop
TEST_ON_OFF:
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JR Z,RUN_CODE_CVT ;if no turn on,skip follows
              
        TMBIT DISPFLAG,PV_WAIT ;check PV_WAIT flag
        JR NZ,RUNNING_SKIP ;if PV_WAIT=1,so goto skip follows
        
        CALL PV_CHECK
        CP ERRFLAG,#00H
        JR EQ,CHK_HSR
        ;if power voltage error,start wait 5s
        CLR ERRFLAG
        CALL TURN_OFF ;first turn off output
        SETBIT RUNFLAG,NO_FZ
        SETBIT RUNFLAG,NO_AD ;set NO_FZ,NO_AD flag
        CLRBIT RUNFLAG,IM_MODE ;clear IM_MODE flag
        SETBIT DISPFLAG,PV_WAIT ;set PV_WAIT flag
        CLR DELAY_PV ;clear pv wait timer
        JR RUNNING_SKIP ;skip follows
 
CHK_HSR:
        DI
        CALL HSR_CHECK
        CP ERRFLAG,#00H
        JP NE,MAIN
    
        CALL IGBT_CHECK
        CP ERRFLAG,#00H
        JP NE,MAIN
   
        CALL IM_CHECK
        
        CALL FZ_CHECK
        TMBIT RUNFLAG,ASK_STOP ;check ASK_STOP flag
        JP NZ,MAIN ;if ask_stop=1,ready turn off
                        
        CALL FUNC_CTRL
        TMBIT RUNFLAG,ASK_STOP ;check ASK_STOP flag
        JP NZ,MAIN ;if ask_stop=1,ready turn off
    
        CALL PWM_CTRL
        EI
RUNNING_SKIP:
        DI
        ;--------------------------
        TMBIT DISPFLAG,DI_FIRE_TMR ;check DI_FIRE flag
        JR NZ,TMR_CHECK ;if DI_FIRE=1,so no chang fire status
        ;check fire changed status
        CP OLD_FIRE,FIRE_SELE ;check fire level changed?
        JR EQ,TMR_CHECK ;if fire select no changed,back
        ;if fire level has been changed,convert fire display
        LD OLD_FIRE,FIRE_SELE
        CALL CONVERT_FIRE
        EI
        ;--------------------------
TMR_CHECK:
        DI
        CALL TIMER_CHECK
        TMBIT RUNFLAG,ASK_STOP ;check ASK_STOP flag
        JP NZ,MAIN ;if it ask stop,so ready stop run
RUN_CODE_CVT:
        DI
        CALL CONVERT_CODE ;key code and display code convert proc
        EI
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JP NZ,MAINLOOP
        ;check IGBT templete for ctrl fans
        PUSH ERRFLAG
        CALL IGBT_CHECK
        POP ERRFLAG
        CP IGBTAD_DT,#33H ;Vad<1.0v,it is cooler
        JP UGT,MAINLOOP
TURN_OFF_FANS:
        ;if IGBT isn't hoter,so turn off FANS
        CLRBIT P0,FANS_CTRL
        JP MAINLOOP ;if timer comed,turn off
;------------------------------------------------------------
;select function running routine
FUNC_CTRL:
        TMBIT RUNFLAG,NO_FZ ;if NO_FZ=1,no run function check
        JR NZ,FUNC_BACK
        TMBIT TMRFLAG,ONE_SEDC ;1s delay time comed?
        JR Z,FUNC_BACK ;no comed,back
        CLRBIT TMRFLAG,ONE_SEDC ;clear 1S flag
   
        ;相应功能模块地址在<<功能模块向量表中>>中
        LD R0,#00H
        LD R1,FUNC_CODE
        RL R1
        ADD R1,#FUNC_LIST-2
        LDC R14,@RR0 ;取得功能模块高位地址
        INC R1
        LDC R15,@RR0 ;取得功能模块低位地址
        CALL @RR14

FUNC_BACK:
        RET
;---------------------------------------
RE_NAI_PROC:
        TM FUNC_LOOP,#01H
        JR NZ,RE_NAI_FIRST
        TM FUNC_LOOP,#02H
        JR NZ,RE_NAI_SECOND
        TM FUNC_LOOP,#04H
        JR NZ,RE_NAI_THIRD
        JR RE_NAI_FORTH
RE_NAI_FIRST:
        ;LD FIRE_SELE,#02H ;set 800w
        ;CALL CONVERT_FIRE
        LD DELAY_HOTA,#78H
        RL FUNC_LOOP
RE_NAI_SECOND:
        ;first delay time 2m
        DEC DELAY_HOTA
        JR NZ,RE_NAI_BACK
        RL FUNC_LOOP
RE_NAI_THIRD:
        CP HSRAD_DT,#0B8H
        JR UGT,RE_NAI_BACK
       
        CALL TURN_OFF
        CALL FUNC_END_SET
        CLR DELAY_HOTB
RE_NAI_FORTH:
        CP DELAY_HOTB,#0B4H
        JR ULT,NAI_TEMP_CHECK
        ;如果保温30分钟已到,则准备停机
        SETBIT RUNFLAG,ASK_STOP ;set ASK_STOP flag
        JR RE_NAI_BACK
NAI_TEMP_CHECK:
        LD TEMP_VOL,#0B6H
        LD TEMP_POINT,#0C0H
        CALL TEMP_CTRL
        
RE_NAI_BACK:
        RET
;------------------------------------------------------------
SHAO_KAO_PROC:
        TMBIT DISPFLAG,DI_FIRE_DISP
        JR Z,SHAO_KAO_BACK ;if 0,the fire changed by user,back
        
        ;if the fire no changed by user,auto ctrl hot up
        ;LD FIRE_SELE,#03H
        LD TEMP_VOL,#33H ;load templete up point
        LD TEMP_POINT,#35H ;
        CALL TEMP_CTRL ;ctrl templete hot by TEMP_VOL
SHAO_KAO_BACK:
        RET
;------------------------------------------------------------
ZHENG_ZHU_PROC:
        TM FUNC_LOOP,#01H
        JR NZ,ZHENG_ZHU_FIRST
        TM FUNC_LOOP,#02H
        JR NZ,ZHENG_ZHU_SECOND
        TM FUNC_LOOP,#04H
        JR NZ,ZHENG_ZHU_THIRD
        JR ZHENG_ZHU_BACK
ZHENG_ZHU_FIRST:
        ;LD FIRE_SELE,#06H ;set 1500w
        ;CALL CONVERT_FIRE
        LD DELAY_HOTA,#78H
        RL FUNC_LOOP
ZHENG_ZHU_SECOND:
        ;first delay time 2m
        DEC DELAY_HOTA
        JR NZ,ZHENG_ZHU_BACK
        RL FUNC_LOOP
ZHENG_ZHU_THIRD:
        CP HSRAD_DT,#80H
        JR UGT,ZHENG_ZHU_BACK
       
        LD PWMDATA,#5AH
        LD FIRE_SELE,#02H
        LD OLD_FIRE,FIRE_SELE ;set no changed fire
        LD FIRE_CVOL,#0B0H ;set low fire hot
        SETBIT RUNFLAG,IM_MODE
        LD DELAY_RUN,#0AH
        LD DELAY_FREE,#03H
        LD IM_LOOP,DELAY_RUN
        
        CLR DISPFLAG ;clear di_fire_tmr status
        SETBIT DISPFLAG,TMR_FLAG ;
        SETBIT DISPFLAG,TMR_WAIT
        CLR WAIT_TMR
        LD MINUTES,#03H ;set auto tmr 3m
        LD SECONDS,#40H
        CALL FUNC_END_SET
        LD FUNC_LOOP,#10H ;reset func_step,no display '--'
        
ZHENG_ZHU_BACK:
        RET
;------------------------------------------------------------
HUO_GUO_PROC:
        TMBIT DISPFLAG,DI_FIRE_DISP ;check DI_FIRE_DISP flag
        JR Z,HUO_GUO_BACK ;if 0,the fire changed by user,back
        
        INC DELAY_HOTA
        CP DELAY_HOTA,#05H
        JR ULT,HUO_GUO_BACK
        CLR DELAY_HOTA
        ;if the fire no changed by user,auto ctrl hot up
        LD R13,FIRE_SELE
        LD FIRE_SELE,#04H ;if HSRAD_DT<2.50v,set 5 level fire
        CP HSRAD_DT,#80H
        JP ULE,HUO_GUO_BACK
        LD FIRE_SELE,R13
        CP HSRAD_DT,#8AH
        JR ULT,HUO_GUO_BACK
        LD FIRE_SELE,#06H
HUO_GUO_BACK:
        RET
;------------------------------------------------------------
JIAN_CHAO_PROC:
        TMBIT DISPFLAG,DI_FIRE_DISP ;check DI_FIRE_DISP flag
        JR Z,JIAN_CHAO_BACK ;if 0,the fire changed by user,back
        
        ;if the fire no changed by user,auto ctrl hot up
        TM FUNC_LOOP,#01H
        JR NZ,JIAN_CHAO_FIRST
        TM FUNC_LOOP,#02H
        JR NZ,JIAN_CHAO_SECOND
        JR JIAN_CHAO_THIRD
JIAN_CHAO_FIRST:
        ;first delay 2m,use midu fire hot up
        ;LD FIRE_SELE,#03H
        LD DELAY_HOTA,#78H
        RL FUNC_LOOP
JIAN_CHAO_SECOND:
        DEC DELAY_HOTA
        JR NZ,JIAN_CHAO_BACK
        LD FIRE_SELE,#06H
        RL FUNC_LOOP
JIAN_CHAO_THIRD:
        LD FIRE_SELE,#04H
        CP HSRAD_DT,#33H
        JR ULE,JIAN_CHAO_BACK
        LD FIRE_SELE,#04H
        CP HSRAD_DT,#40H
        JR ULT,JIAN_CHAO_BACK
        LD FIRE_SELE,#06H
JIAN_CHAO_BACK:
        RET
;------------------------------------------------------------
LOCK_FIRE_PROC:
        RET
;------------------------------------------------------------
LOCK_TEMP_PROC:
        LD R10,TEMP_VOL ;load templete up point
        SUB R10,#10H ;set down point=up-0.3v
        LD TEMP_POINT,R10
        CALL TEMP_CTRL ;ctrl templete hot by TEMP_VOL
        RET
;------------------------------------------------------------
SHAO_SHUI_PROC:
        TM FUNC_LOOP,#01H
        JR NZ,ZHU_SHUI_FIRST
        TM FUNC_LOOP,#02H
        JR NZ,ZHU_SHUI_SECOND
        TM FUNC_LOOP,#04H
        JR NZ,ZHU_SHUI_THIRD
        JR ZHU_SHUI_FORTH
ZHU_SHUI_FIRST:
        ;LD FIRE_SELE,#06H ;set highest fire level
        ;CALL CONVERT_FIRE
        LD DELAY_HOTA,#78H
        RL FUNC_LOOP
ZHU_SHUI_SECOND:
        ;first delay time 2m
        DEC DELAY_HOTA
        JR NZ,ZHU_SHUI_BACK
        RL FUNC_LOOP
ZHU_SHUI_THIRD:
        CP HSRAD_DT,#80H
        JR UGT,ZHU_SHUI_BACK
       
        LD FIRE_SELE,#02H ;set lower fire
        CALL CONVERT_FIRE
      
        CALL TURN_OFF
        CALL FUNC_END_SET
        CLR DELAY_HOTA
        CLR DELAY_HOTB
        CLRBIT RUNFLAG,IM_MODE
        SETBIT RUNFLAG,NO_AD
ZHU_SHUI_FORTH:
        CP DELAY_HOTB,#0B4H
        JR ULT,TEMP_CHECK
        ;如果保温30分钟已到,则准备停机
        SETBIT RUNFLAG,ASK_STOP ;set ASK_STOP flag
        JR ZHU_SHUI_BACK
TEMP_CHECK:
        LD TEMP_VOL,#85H
        LD TEMP_POINT,#95H
        CALL TEMP_CTRL
ZHU_SHUI_BACK:
        RET
;------------------------------------------------------------
ZHU_FAN_PROC:
        TM FUNC_LOOP,#01H
        JR NZ,ZHU_FAN_FIRST
        TM FUNC_LOOP,#02H
        JR NZ,ZHU_FAN_SECOND
        TM FUNC_LOOP,#04H
        JR NZ,ZHU_FAN_THIRD
        TM FUNC_LOOP,#08H
        JR NZ,ZHU_FAN_FORTH
        TM FUNC_LOOP,#10H
        JR NZ,ZHU_FAN_FIFTH
        TM FUNC_LOOP,#20H
        JR NZ,ZHU_FAN_SIXTH
        JR ZHU_FAN_SEVENTH
ZHU_FAN_FIRST:
        ;LD FIRE_SELE,#03H ;set fire_sele=1000w
        ;CALL CONVERT_FIRE
        LD DELAY_HOTA,#78H
        RL FUNC_LOOP
ZHU_FAN_SECOND:
        ;first delay 2M
        DEC DELAY_HOTA
        JR NZ,ZHU_FAN_BACK
        RL FUNC_LOOP
ZHU_FAN_THIRD:
        CP HSRAD_DT,#0A8H ;hsrad_dt<=3.30v?
        JR UGT,ZHU_FAN_BACK
        CALL TURN_OFF
        SETBIT RUNFLAG,NO_AD ;set NO_AD flag,no hot up
        CLRBIT RUNFLAG,IM_MODE ;clear IM_MODE flag
        LD DELAY_HOTA,#0FFH
        RL FUNC_LOOP
ZHU_FAN_FORTH:
        ;stop hot 4m
        DEC DELAY_HOTA
        JR NZ,ZHU_FAN_BACK
        ;ready hot up,600w
        LD FIRE_SELE,#02H ;set 2 level fire
        CALL CONVERT_FIRE
        RL FUNC_LOOP
ZHU_FAN_FIFTH:
        CP HSRAD_DT,#6BH ;check Vt<2.10V
        JR UGT,ZHU_FAN_BACK ;if templete lower,back
        LD FIRE_SELE,#01H ;set 1 level fire
        CALL CONVERT_FIRE
        RL FUNC_LOOP
ZHU_FAN_SIXTH:
        CP HSRAD_DT,#4CH ;check Vt<1.50v?
        JR UGT,ZHU_FAN_BACK

        CALL TURN_OFF
        CALL FUNC_END_SET
ZHU_FAN_SEVENTH:
        ;煮饭完成后,根据温度控制进行加热
        LD TEMP_VOL,#60H
        LD TEMP_POINT,#6AH
        CALL TEMP_CTRL
ZHU_FAN_BACK:
        RET
;------------------------------------------------------------
BAO_TANG_PROC:
        TM FUNC_LOOP,#01H
        JR NZ,BAO_TANG_FIRST
        TM FUNC_LOOP,#02H
        JR NZ,BAO_TANG_SECOND
        TM FUNC_LOOP,#04H
        JR NZ,BAO_TANG_THIRD
        TM FUNC_LOOP,#08H
        JR NZ,BAO_TANG_FORTH
        JR BAO_TANG_BACK
BAO_TANG_FIRST:
        ;LD FIRE_SELE,#03H ;set fire_sele=1000w
        ;CALL CONVERT_FIRE
        LD DELAY_HOTA,#78H
        RL FUNC_LOOP
BAO_TANG_SECOND:
        ;first delay 2m
        DEC DELAY_HOTA
        JR NZ,BAO_TANG_BACK
        RL FUNC_LOOP
BAO_TANG_THIRD:
        CP HSRAD_DT,#85H ;Vt<2.60v?
        JR UGT,BAO_TANG_BACK
        
        LD MINUTES,#78H ;set 2hours stop
        LD FIRE_SELE,#01H ;set 1 level fire
        CALL CONVERT_FIRE
        RL FUNC_LOOP
BAO_TANG_FORTH:
        CP HSRAD_DT,#66H ;check Vt<2.00V
        JR ULT,BAO_TANG_END ;if templete lower,back
        CP MINUTES,#02H
        JR UGE,BAO_TANG_BACK
        ;如果温度过高或2小时时间已到,则准备停机
BAO_TANG_END:
        CALL TURN_OFF
        CALL FUNC_END_SET
        
BAO_TANG_BACK:
        RET
;------------------------------------------------------------
FUNC_END_SET:
        LD FUNC_LOOP,#80H ;set function finished flag
        SETBIT RUNFLAG,ASK_MIC ;set MUSIC flag
        LD MIC_HIGH,#00H
        LD MIC_LOW,#FUNC_FINISHED
        RET
;------------------------------------------------------------
;run templete ctrl
;HSRAD_DT----run hot-res voltage
;TEMP_VOL----templete ctrl up point(stop hot)
;TEMP_POINT--templete ctrl down point(start hot)
;every 10s check a time
TEMP_CTRL:
        INC DELAY_HOTC
        CP DELAY_HOTC,#0AH
        JR ULT,TEMP_BACK
        CLR DELAY_HOTC
        INC DELAY_HOTB

        CP HSRAD_DT,TEMP_VOL ;Vt        JR ULT,CTRL_STOP_HOT
        TMBIT RUNFLAG,NO_AD ;check NO_AD flag
        JR Z,TEMP_BACK ;if NO_AD=0,already hoting,back
        ;if templete lower,start hot up
        CP HSRAD_DT,TEMP_POINT
        JR ULT,TEMP_BACK
        LD OLD_FIRE,#0FFH ;change fire,ready start hot up
        CLRBIT RUNFLAG,NO_AD ;clear NO_AD flag
        SETBIT RUNFLAG,NO_FZ ;set NO_FZ flag
        JR TEMP_BACK
CTRL_STOP_HOT:
        TMBIT RUNFLAG,NO_AD ;check NO_AD flag
        JR NZ,TEMP_BACK ;if already waiting,back
        CALL TURN_OFF
        CLRBIT RUNFLAG,IM_MODE ;clear IM_MODE flag
        SETBIT RUNFLAG,NO_AD ;set NO_AD flag
      
TEMP_BACK:
        RET
;------------------------------------------------------------
PWM_CTRL:
        TMBIT RUNFLAG,NO_FZ ;if NO_FZ=1,back
        JR NZ,PWM_BACK
        TMBIT RUNFLAG,NO_AD ;if NO_AD=1,back
        JR NZ,PWM_BACK
 
        CP CURAD_DT,FIRE_CVOL
        JR UGT,CTRL_INC
        CP CURAD_DT,FIRE_CVOL
        JR ULT,CTRL_DEC
        JR PWM_BACK
CTRL_DEC:
        CP PWMDATA,#02H
        JR ULT,PWM_BACK
        DEC PWMDATA
        JR PWM_BACK
CTRL_INC:
        CP PWMDATA,#0FCH
        JR UGT,PWM_BACK
        INC PWMDATA
 
PWM_BACK:
        RET
;------------------------------------------------------------
;FZ has or no check subroutine
;input paramt:NOFZ_FLAG=RUNFLAG.1
;output paramt:STOP_FLAG=RUNFLAG.7
FZ_CHECK:
        LD NOFZ_VOL,#38H ;如果未在加热,则设为1.00V
        CP PWMDATA,#0FFH
        JR EQ,CHECK_NOFZ
        ;如果正在加热,则根据当前工作状态决定
        LD NOFZ_VOL,#35H
        CP PWMDATA,#30H
        JR UGT,FZ_TEST
        LD NOFZ_VOL,#3AH
        CP PWMDATA,#20H
        JR UGT,FZ_TEST
        LD NOFZ_VOL,#40H
        CP PWMDATA,#10H
        JR UGT,FZ_TEST
        LD NOFZ_VOL,#60H
        JR FZ_TEST
CHECK_NOFZ:
        TMBIT RUNFLAG,NO_FZ ;check NO_FZ flag
        JR Z,TEST_TIMER
TEST_TIMER:
        CP DELAY_3S,#04H
        JR UGE,FZ_ON
        TMBIT TMRFLAG,HALF_SEDC ;check 0.5S timer flag
        JR Z,FZ_BACK
        CLRBIT TMRFLAG,HALF_SEDC ;clear 0.5S timer flag
        INC DELAY_3S
        JR FZ_BACK
 FZ_ON:
        CALL TURN_ON ;if no turn on,turn on it
 SEND_PULSE:
        EI
        CALL DELAY_10MS
        CALL DELAY_10MS
        CALL DELAY_10MS
        CALL DELAY_10MS

FZ_TEST:
        ;根据当前IGBT温度决定加锅检测点设置
        CP IGBTAD_DT,#033H
        JR ULE,START_FZ
        ADD NOFZ_VOL,#0FH
        CP IGBTAD_DT,#4CH
        JR ULE,START_FZ
        ADD NOFZ_VOL,#0FH
        CP IGBTAD_DT,#066H
        JR ULE,START_FZ
        ADD NOFZ_VOL,#0FH
        CP IGBTAD_DT,#070H
        JR ULE,START_FZ
        ADD NOFZ_VOL,#0FH
START_FZ:
        CALL CURRENT_TEST
        DI
        TMBIT RUNFLAG,NO_FZ ;check NO_FZ flag
        JR NZ,NO_FZ_OFF
        ;if it has fz on the top
        CLR ERRFLAG
        CLR DELAY_2M ;FZ on the top,clear 2minute counter
        TMBIT RUNFLAG,NO_AD ;check NO_AD flag
        JR Z,FZ_BACK
        ;if no_ad=1,no start,still turn off
        CLRBIT TMRFLAG,HALF_SEDC ;clear 1S timer flag
        CLR DELAY_3S
        CALL TURN_OFF
        JR FZ_BACK ;it is ok,go back
NO_FZ_OFF:
        CALL TURN_OFF
        SETBIT RUNFLAG,ASK_STOP ;set ASK_STOP flag=1
        CP DELAY_2M,#1EH ;no fz delay 1m has been comed?
        JR UGE,FZ_BACK ;yes,2m comed,go back,stop
        CLRBIT RUNFLAG,ASK_STOP ;clear ask_stop
        
        CLRBIT TMRFLAG,HALF_SEDC ;clear 0.5S timer flag
        CLR DELAY_3S
        INC DELAY_2M ;inc 2m timer
        
        SETBIT RUNFLAG,ASK_MIC ;set MUSIC flag
        LD MIC_HIGH,#00H
        LD MIC_LOW,#NOTE_DANG ;set music=note_dang
        
FZ_BACK:
              RET
;------------------------------------------------------------------------
;running current test sub
CURRENT_TEST:
        CLR CURAD_DT
        LD R0,#50H ;total test 10ms
  _START:
        DI
        LD ADCON,#01110011B ;P0.7 A/D convert start,F=fosc/8=2.5US
AD_FZ:
        TM ADCON,#08H ;Check convert complete?
        JR Z,AD_FZ
 
        EI
        CP ADDATAH,CURAD_DT
        JR ULE,SKIP_REPL
        LD CURAD_DT,ADDATAH
 SKIP_REPL:
        DEC R0
        JR NZ,_START
 FZ_YN:
        CLRBIT RUNFLAG,NO_FZ ;clear NO_FZ flag
        CP CURAD_DT,NOFZ_VOL
        JR UGT,TEST_BACK ;if v>=1.30v,it has fz,back
        SETBIT RUNFLAG,NO_FZ ;if v<1.30v,it has no fz,set no_fz=1
TEST_BACK:
        RET
;------------------------------------------------------------
;running at economey power IM MODE ctrl routine
;-----------------------------------------------
IM_CHECK:
        TMBIT RUNFLAG,NO_FZ ;if NO_FZ=1,no run IM check
        JR NZ,IM_BACK
        TMBIT RUNFLAG,IM_MODE ;if IM_MODE=0,no running on IM MODE,back
        JR Z,IM_BACK
        TMBIT TMRFLAG,ONE_SEDB ;test one sed flag2
        JR Z,IM_BACK
        CLRBIT TMRFLAG,ONE_SEDB ;clear one sed2 flag2

        TMBIT RUNFLAG,NO_AD ;check NO_AD flag
        JR Z,IM_RUN ;if no_ad=1,goto free check
IM_FREE:
        DEC IM_LOOP
        JR NZ,IM_BACK
        CLRBIT RUNFLAG,NO_AD ;clear NO_AD flag
        SETBIT RUNFLAG,NO_FZ ;set NO_FZ flag
        LD DELAY_3S,#0F0H
        LD IM_LOOP,DELAY_RUN
        JR IM_BACK
IM_RUN:
        DEC IM_LOOP
        JR NZ,IM_BACK
        SETBIT RUNFLAG,NO_AD ;set NO_AD flag
        LD IM_LOOP,DELAY_FREE ;reload counter
        CALL TURN_OFF
IM_BACK:
        RET
;------------------------------------------------------------
;timer check routine
;-------------------------
TIMER_CHECK:
        TMBIT TMRFLAG,ONE_SEDA ;check 1s timer comed?
        JR Z,TMR_CHK_BACK ;no comed,go back
        CLRBIT TMRFLAG,ONE_SEDA ;clear 1s timer flag1
    
        TMBIT DISPFLAG,PV_WAIT ;check PV_WAIT flag
        JR NZ,WAITING_PV
        TMBIT DISPFLAG,TMR_WAIT ;check TMR_WAIT flag
        JR NZ,WAITING_TMR
        TMBIT DISPFLAG,FIRE_WAIT ;check FIRE_WAIT flag
        JR NZ,WAITING_FIRE
        JP CHK_TMR_RUN

        ;power voltage error waiting check
WAITING_PV:
        ;CLRBIT DISPFLAG,TMR_WAIT
        ;CLRBIT DISPFLAG,FIRE_WAIT ;clear TMR_WAIT,FIRE_WAIT flag
        INC DELAY_PV
        CP DELAY_PV,#05H
        JR ULT,TMR_CHK_BACK
        ;if pv wait timer 5s comed
        CALL PV_CHECK
        SETBIT RUNFLAG,ASK_STOP ;set ASK_STOP=1
        CP ERRFLAG,#00H
        JR NE,TMR_CHK_BACK
        ;if pv check ok,start run
        CLRBIT RUNFLAG,ASK_STOP ;clear ASK_STOP=0
        CLRBIT DISPFLAG,PV_WAIT ;clear PV_WAIT flag
        LD OLD_FIRE,#0FFH ;repeat set fire,ready start
        JR TMR_CHK_BACK

        ;timer or fire waiting for input check
WAITING_TMR:
        INC WAIT_TMR
        CP WAIT_TMR,#05H
        JR ULT,TMR_CHK_BACK ;if waiting input 5s no comed,go back
        ;if waiting input 5s has been comed,go into normaly option
        LD SECONDS,#3CH
        CLRBIT DISPFLAG,TMR_WAIT ;clear TMR_WAIT flag
        CP MINUTES,#00H
        JR NE,TMR_CHK_BACK
        CLRBIT DISPFLAG,TMR_FLAG ;if zero,canced tmr
        LD MINUTES,#078H
        JR TMR_CHK_BACK
WAITING_FIRE:
        INC WAIT_FIRE
        CP WAIT_FIRE,#05H
        JR ULT,TMR_CHK_BACK ;if waiting input 5s no comed,go back
        ;if waiting input 5s has been comed,go into normaly option
        CLRBIT DISPFLAG,FIRE_WAIT
        JR TMR_CHK_BACK
        ;check the timer run finished?
CHK_TMR_RUN:
        CP MINUTES,#00H
        JR UGT,TMR_CHK_BACK
        ;if the timer has been finished
TMR_FINISHED:
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JR Z,TMR_CHK_BACK ;if no on,no care,back
        CLRBIT DISPFLAG,TMR_FLAG ;clear tmr flag
        SETBIT RUNFLAG,ASK_STOP ;set ASK_STOP flag,ready turn off
TMR_CHK_BACK:
        RET
;------------------------------------------------------------
;error code,key code,digtit code,display code convert proc
;------------------------------------------------------------
CONVERT_CODE:
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JR NZ,RUN_CVT ;
        ;if no turn on,initiaze all display data
NO_RUN_CVT:
        LD FUNC_LED,#0FFH
        LD FIRE_LED,#0FFH
        LD DIRECT_LED,#0FFH
        LD SEG_B,#0FFH
        LD SEG_C,#0FFH
        
        CP ERRFLAG,#00H
        JP EQ,CVT_CODE_BACK ;if error,no convert digit display
        LD DIGITA,#0FH ;A-segment no display
        LD DIGITB,#0EH ;B-segment display 'E' code
        LD DIGITC,ERRFLAG ;C-segment display errflag code
        SETBIT FLASHFLAG,FLASH_ALL ;set flash SEG display
        CALL DIGIT_CONVERT
        JP CVT_CODE_BACK
;---------------------------
RUN_CVT:
        CLRBIT FLASHFLAG,FLASH_ALL ;set digit no flash
        ;function led display process
        LD R0,#00H
        LD R1,#FUNC_LED_CODE-1
        ADD R1,FUNC_CODE
        LDC R10,@RR0
        LD FUNC_LED,R10
        OR DIRECT_LED,#10001110B ;turn off tmr,jian_chao,fire,temp led
        CP FUNC_CODE,#08H
        JR ULT,CVT_TMR_LED
        LD FUNC_LED,#0FFH ;turn off func_led line
        AND DIRECT_LED,#01110001B ;
        AND R10,#10001110B ;only save three bit
        OR DIRECT_LED,R10 ;turn on function led
CVT_TMR_LED:
        ;check tmr led status
        TMBIT DISPFLAG,TMR_FLAG ;check SET_TMR flag
        JR Z,CVT_FIRE_LED
        AND DIRECT_LED,#11111101B ;if set tmr,turn on tmr_led
CVT_FIRE_LED:
        LD FIRE_LED,#0FFH
        TMBIT DISPFLAG,DI_FIRE_DISP ;check DI_FIRE_DISP flag
        JR NZ,CVT_DIGIT_DISP ;if 1,no display fire_led
        LD R0,#00H
        LD R1,#FIRE_LED_CODE-1
        ADD R1,FIRE_SELE
        LDC R10,@RR0
        LD FIRE_LED,R10
        ;check fire_led flash status
        TMBIT DISPFLAG,FIRE_WAIT ;check fire_wait flag
        JR Z,CVT_DIGIT_DISP
        TMBIT TMRFLAG,HALF_SEDB ;check 0.5s flag
        JR NZ,CVT_DIGIT_DISP
        LD FIRE_LED,#0FFH ;if 0.5s=1,turn off fire led display
CVT_DIGIT_DISP:
        ;three bit digit display process
        CP FUNC_LOOP,#80H ;check function step finished?
        JR NE,TEST_DI_TMR
        ;if the function step finished,flash display '--'
        LD DIGITA,#0FH ;SEG_A no display
        LD DIGITB,#0DH
        LD DIGITC,#0DH ;display '--' ccde
        SETBIT FLASHFLAG,FLASH_ALL ;set all digit flahs
        CALL DIGIT_CONVERT
        JR CVT_CODE_BACK
TEST_DI_TMR:
        TMBIT DISPFLAG,DI_TMR_DISP ;check DI_TMR_DISP flag
        JR Z,TMR_DISPLAY
        LD DIGITA,#0FH ;SEG_A no display
        LD DIGITB,#0AH
        LD DIGITC,#0BH ;display 'AU' ccde
        CALL DIGIT_CONVERT
        JR CVT_CODE_BACK
TMR_DISPLAY:
        TMBIT DISPFLAG,TMR_FLAG ;check TMR flag
        JR Z,DISPLAY_ZERO
        TMBIT DISPFLAG,TMR_WAIT ;check TMR_WAIT flag
        JR Z,CVT_TMR_DISP
        ;if it is waiting input timer
        SETBIT FLASHFLAG,FLASH_ALL ;set all digit flash
CVT_TMR_DISP:
        CALL TMTO_ABCD ;将时间值转换为LED-A,B,C,D段显示数码
        CALL DIGIT_CONVERT ;将显示数码转换为显示代码
        JR CVT_CODE_BACK
DISPLAY_ZERO:
        ;if no set tmr,so only digit c display '0'
        LD DIGITA,#0FH ;SEG_A no display
        LD DIGITB,#0FH ;SEG_B no display
        LD DIGITC,#00H ;SEG_C display '0'
        CALL DIGIT_CONVERT
   
CVT_CODE_BACK:
        RET
;--------------------------------------------------------------
;pressed key scan routine
;-------------------------
KEY_SCAN:
        ;first check it isn't INC_KEY or DEC_KEY
        CP KEY_CODEA,#01H
        JP EQ,DEC_KEY
        CP KEY_CODEB,#01H
        JP EQ,INC_KEY
 
OTHER_KEY:
        ;if INC_KEY or DEC_KEY no pressed,clear KEY_timer
        CLR KEY_TMRL
        CLR KEY_TMRH ;clear key scan timer
     
        CP KEY_CODEA,#0FFH
        JR NE,HAS_KEY
        CP KEY_CODEB,#0FFH
        JR NE,HAS_KEY
        ;if key scan lineA and lineB no key pressed
        CLRBIT RUNFLAG,KEY_DOWN ;clear key_down flag
        JP KEY_BACK
HAS_KEY:
        TMBIT RUNFLAG,KEY_DOWN ;check key_down flag
        JP NZ,KEY_BACK
        SETBIT RUNFLAG,KEY_DOWN ;set key_down flag
        LD R0,#00H
        LD R1,#KEY_CVT_CODEA-2
        CP KEY_CODEA,#0FFH ;if keya_line pressed,load KEY_CVT_CODEA
        JR NE,KEY_A
        LD R1,#KEY_CVT_CODEB-2
        JR KEY_B
KEY_A:
        ;if key scan lineA has key pressed
        CP KEY_CODEA,#07H
        JR UGE,TMR_KEY
        CP KEY_CODEA,#02H
        JR NE,ADD_CODEA
        ;if pressed LOCK_FIRE key,check on_off
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JP Z,KEY_BACK ;if no on,no care
ADD_CODEA:
        ADD R1,KEY_CODEA
        LDC R13,@RR0
        JR FUNC_PROCESS
KEY_B:
        ;if key scan lineB has key pressed
        CP KEY_CODEB,#07H
        JR UGE,ON_OFF_KEY
        CP KEY_CODEB,#02H
        JR NE,ADD_CODEB
        ;if pressed LOCK_TEMP key,check on_off
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JP Z,KEY_BACK ;if no on,no care
ADD_CODEB:
        ADD R1,KEY_CODEB
        LDC R13,@RR0
FUNC_PROCESS:
        LD R14,R13
        AND R14,#0FH ;get function code
        CP R14,FUNC_CODE
        JP EQ,KEY_BACK ;if the func_key repeat,no care
        CALL FUNC_INIT ;run function initialine
        JP KEY_PRESS_BACK
;------------------------------
;if on_off key pressed
ON_OFF_KEY:
        CLR ERRFLAG
        SETBIT RUNFLAG,ASK_STOP ;set ASK_STOP=1
        XORBIT RUNFLAG,ON_OFF ;comp ON_OFF flag
        TMBIT RUNFLAG,ON_OFF
        JP Z,KEY_BACK ;if turn off,set ask_stop=1,back
        CLRBIT RUNFLAG,ASK_STOP ;clear ASK_STOP flag
        CLRBIT RUNFLAG,ON_OFF ;for music,clear on_off
        ;if turn on,start initialize
        LD R13,#09H ;set default=LOCK_FIRE
        CALL FUNC_INIT ;run function initialine
        JP KEY_PRESS_BACK
;------------------------------
;if timer set key pressed
TMR_KEY:
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JP Z,KEY_BACK ;if no turn on,no care
        TMBIT DISPFLAG,DI_FIRE_TMR ;check DI_FIRE_TMR flag
        JP NZ,KEY_BACK ;if 1,no care back
        
        CLRBIT DISPFLAG,FIRE_WAIT ;clear FIRE_WAIT flag
        LD MIC_LOW,#NOTE_DANG ;set music_note=dang
        TMBIT DISPFLAG,TMR_FLAG ;check tmr flag
        JR NZ,CANCEL_TMR ;if already set tmr,cancel it
        
        CLRBIT DISPFLAG,DI_TMR_DISP ;clear DI_TMR_DISP flag
        CLR WAIT_TMR ;clear waiting input timer
        CLR KEY_TMRL
        CLR KEY_TMRH ;clear key scan timer
        CLR MINUTES
        LD SECONDS,#03CH
        SETBIT DISPFLAG,TMR_FLAG ;set tmr,tmr_wait flag
        SETBIT DISPFLAG,TMR_WAIT
        JP KEY_PRESS_BACK
CANCEL_TMR:
        ;if it already set timer,cancel timer at running
        CLRBIT DISPFLAG,TMR_FLAG
        CLRBIT DISPFLAG,TMR_WAIT ;clear tmr and tmr_wait flag
        CP FUNC_CODE,#09H ;if func=lock_fire or lock_temp,display led
        JP UGE,KEY_PRESS_BACK
        SETBIT DISPFLAG,DI_TMR_DISP ;else set DI_TMR_DISP flag(AU)
        JP KEY_PRESS_BACK
;----------------------------------------------
;if dec key pressed
DEC_KEY:
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JR NZ,CHK_DEC_FLAG ;no turn on,no care
        ;if no turn on,check key timer
        LD R1,#MUSIC_VECTOR
        CALL CHK_INC_DEC_TIMER
        JP KEY_BACK
       
CHK_DEC_FLAG:
        TMBIT DISPFLAG,DI_FIRE_TMR ;check DI_FIRE_TMR flag
        JP NZ,KEY_BACK ;if disable,no care
       
        SETBIT TMRFLAG,HALF_SEDB ;for display,set 0.5s flag
        CLR TMR_HALFSEDB ;clear 0.5s counter
        
        TMBIT DISPFLAG,TMR_WAIT ;check TMR_WAIT flag
        JR Z,DEC_FIRE ;if TMR_WAIT=0,go dec fire select
        CLR WAIT_TMR ;clear wait input timer
        LD SECONDS,#03CH
        ;dec the timer minutes
        TMBIT RUNFLAG,KEY_DOWN ;check key_dwon flag
        JR Z,DEC_1M
CHK_DEC_TMR:
        CP KEY_TMRL,#38H
        JR ULT,DEC_KEY_BACK
        INC KEY_TMRH
        CP KEY_TMRH,#14H
        JR ULT,DEC_1M
        LD KEY_TMRH,#14H
        
        CP DIGITC,#05H ;if digit C=5 or 0,dec 5m
        JR EQ,DEC_5M
        CP DIGITC,#00H
        JR NE,DEC_1M
   DEC_5M:
        SUB MINUTES,#04H
   DEC_1M:
        DEC MINUTES
        CLR KEY_TMRL
DEC_KEY_BACK:
        CP MINUTES,#0B4H ;if MINUTEST>180,so it is overlow,
        JR ULE,TEST_DEC_STATUS
        LD MINUTES,#0B4H ;reset it=180
TEST_DEC_STATUS:
        CLR ERRFLAG
        TMBIT RUNFLAG,KEY_DOWN
        JP NZ,KEY_BACK ;if key_down=1,no beep
        SETBIT RUNFLAG,KEY_DOWN ;set key_dwon=1
        LD MIC_LOW,#NOTE_DANG ;set music=dang
        JP KEY_PRESS_BACK
       
DEC_FIRE:
        CLR KEY_TMRL
        CLR KEY_TMRH
        CLR WAIT_FIRE
        TMBIT RUNFLAG,KEY_DOWN
        JP NZ,KEY_BACK
        SETBIT RUNFLAG,KEY_DOWN ;set key_down flag
        
        TMBIT DISPFLAG,DI_FIRE_DISP ;check DI_FIRE_DISP flag
        JR Z,SET_DEC_FIRE
        LD FIRE_SELE,#06H ;if 1,set fire_sele=6
        CLRBIT DISPFLAG,DI_FIRE_DISP ;clear DI_FIRE_DISP flag,display fire led
SET_DEC_FIRE:
        CP FUNC_CODE,#09H
        JR EQ,DEC_LOCK_FIRE
        CP FUNC_CODE,#0AH
        JR EQ,DEC_LOCK_TEMP
DEC_FIRE_SELE:
        CP FIRE_SELE,#01H
        JP ULE,KEY_BACK
        DEC FIRE_SELE
        JR SET_FIRE_WAIT
DEC_LOCK_FIRE:
        CP LOCK_FIRE,#01H
        JP ULE,KEY_BACK
        DEC LOCK_FIRE
        LD FIRE_SELE,LOCK_FIRE
        JR SET_FIRE_WAIT
DEC_LOCK_TEMP:
        CP LOCK_TEMP,#01H
        JP ULE,KEY_BACK
        DEC LOCK_TEMP
        LD FIRE_SELE,LOCK_TEMP
SET_FIRE_WAIT:
        SETBIT DISPFLAG,FIRE_WAIT ;set fire_wait flag
        LD MIC_LOW,#NOTE_DEC
        JP KEY_PRESS_BACK
;--------------------------------------------------
INC_KEY:
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JP NZ,CHK_INC_FLAG ;no turn on,no care
        ;if no turn on,check key timer
        LD R1,#MUSIC_VECTOR+2
        CALL CHK_INC_DEC_TIMER
        JP KEY_BACK
CHK_INC_FLAG:
        TMBIT DISPFLAG,DI_FIRE_TMR ;check DI_FIRE_TMR flag
        JP NZ,KEY_BACK ;if disable,no care
      
        SETBIT TMRFLAG,HALF_SEDB ;for display,set 0.5s flag
        CLR TMR_HALFSEDB ;clear 0.5s counter
        
        TMBIT DISPFLAG,TMR_WAIT ;check TMR_WAIT flag
        JR Z,INC_FIRE ;if TMR_WAIT=0,go check select mode
        CLR WAIT_TMR ;clear wait input timer
        LD SECONDS,#03CH
        ;if it is waiting input timer
        CP MINUTES,#0B4H
        JR ULE,TEST_INC_MINUTES
        CLR MINUTES
        CLR KEY_TMRL
        JR INC_KEY_BACK
TEST_INC_MINUTES:
        TMBIT RUNFLAG,KEY_DOWN ;check key_dwon flag
        JR Z,ADD_1M
CHK_INC_TMR:
        CP KEY_TMRL,#38H
        JR ULT,INC_KEY_BACK
        CLR KEY_TMRL
        INC KEY_TMRH
        CP KEY_TMRH,#14H
        JR ULT,ADD_1M
        LD KEY_TMRH,#14H
        
        CP DIGITC,#05H
        JR EQ,ADD_5M
        CP DIGITC,#00H
        JR NE,ADD_1M
   ADD_5M:
        ADD MINUTES,#05H
        CP MINUTES,#0B4H
        JR ULE,INC_KEY_BACK
        CLR MINUTES
        JR INC_KEY_BACK
  ADD_1M:
        INC MINUTES
        CLR KEY_TMRL
INC_KEY_BACK:
        CLR ERRFLAG
        TMBIT RUNFLAG,KEY_DOWN
        JR NZ,KEY_BACK ;if key_down=1,no beep
        SETBIT RUNFLAG,KEY_DOWN ;set key_dwon=1
        LD MIC_LOW,#NOTE_DANG
        JR KEY_PRESS_BACK
INC_FIRE:
        CLR KEY_TMRL
        CLR KEY_TMRH
        CLR WAIT_FIRE
        TMBIT RUNFLAG,KEY_DOWN
        JR NZ,KEY_BACK
        SETBIT RUNFLAG,KEY_DOWN ;set key_down flag
        
        TMBIT DISPFLAG,DI_FIRE_DISP ;check DI_FIRE_DISP flag
        JR Z,SET_INC_FIRE
        LD FIRE_SELE,#04H ;if 1,set fire_sele=4
        CLRBIT DISPFLAG,DI_FIRE_DISP ;clear DI_FIRE_DISP flag,display fire led

 SET_INC_FIRE:
        CP FUNC_CODE,#0AH ;if func=lock_temp
        JR EQ,INC_LOCK_TEMP
        CP FUNC_CODE,#09H
        JR EQ,INC_LOCK_FIRE
     
        CP FIRE_SELE,#06H
        JR UGE,KEY_BACK
        INC FIRE_SELE
        JR _SET_FIRE_WAIT
INC_LOCK_TEMP:
        CP LOCK_TEMP,#06H
        JR UGE,KEY_BACK
        INC LOCK_TEMP
        LD FIRE_SELE,LOCK_TEMP
        JR _SET_FIRE_WAIT
INC_LOCK_FIRE:
        CP LOCK_FIRE,#06H
        JR UGE,KEY_BACK
        INC LOCK_FIRE
        LD FIRE_SELE,LOCK_FIRE
_SET_FIRE_WAIT:
        SETBIT DISPFLAG,FIRE_WAIT ;set fire_wait flag
        LD MIC_LOW,#NOTE_INC ;set music=inc
        JR KEY_PRESS_BACK
;----------------------------------------------------
KEY_PRESS_BACK:
        SETBIT RUNFLAG,ASK_MIC ;set MUSIC flag
        LD MIC_HIGH,#00H
        CLR ERRFLAG
        TMBIT DISPFLAG,TMR_FLAG ;check TMR flag
        JR NZ,KEY_BACK
        ;if no set tmr,auto reset 2 hours tmr
        LD MINUTES,#078H
KEY_BACK:
        RET
;------------------------------------------------------------
CHK_INC_DEC_TIMER:
        CP KEY_TMRL,#0FAH
        JR ULT,INC_DEC_BACK
        CLR KEY_TMRL
        INC KEY_TMRH
        CP KEY_TMRH,#05H
        JR ULT,INC_DEC_BACK
        SETBIT RUNFLAG,ASK_MIC
        LD R0,#00H
        LDC R10,@RR0
        LD MIC_HIGH,R10
        OR MIC_HIGH,#80H ;set yinfu play flag
        INC R1
        LDC R10,@RR0
        LD MIC_LOW,R10
INC_DEC_BACK:
        RET
;------------------------------------------------------------
;set start initiale fire_temp routine
;R13------into code
FUNC_INIT:
        AND DISPFLAG,#0FH ;clear DI_FIRE_TMR,DI_TMR,DI_FIRE,PV_WAIT flag
        LD R14,R13
        AND R14,#0E0H ;get DI_FIRE_TMR,DI_FIRE_DISP,DI_TMR_DISP flag
        OR DISPFLAG,R14 ;set flag bit
        AND R13,#0FH ;get function code
        LD FUNC_CODE,R13

        LD MIC_LOW,#NOTE_ON ;if off,music_note=on
        TMBIT RUNFLAG,ON_OFF ;check ON_OFF flag
        JR Z,SET_OTHER
        LD MIC_LOW,#NOTE_DANG ;if on,music_note=dang
SET_OTHER:
        SETBIT RUNFLAG,ON_OFF ;set ON_OFF flag
        SETBIT P0,FANS_CTRL ;turn on FANS
        SETBIT RUNFLAG,NO_FZ ;set NO_FZ flag
        CLRBIT RUNFLAG,NO_AD ;clear NO_AD flag
        LD DELAY_3S,#0F0H
        LD FUNC_LOOP,#01H
        LD OLD_FIRE,#0FFH ;set old_fire=0ffh
        SETBIT DISPFLAG,FIRE_WAIT ;set FIRE_WAIT flag
        CLR WAIT_FIRE ;clear wait timer
SET_FIRE_SELE:
        ;load function start fire_sele level
        LD WAIT_TMR,#0AH
        LD FIRE_SELE,LOCK_FIRE
        CP FUNC_CODE,#09H
        JR EQ,FUNC_INIT_BACK
        LD FIRE_SELE,LOCK_TEMP
        CLRBIT RUNFLAG,IM_MODE ;clear IM_MODE
        CP FUNC_CODE,#0AH
        JR UGE,FUNC_INIT_BACK
        CLRBIT DISPFLAG,TMR_WAIT
        CLRBIT DISPFLAG,TMR_FLAG ;clear tmr,tmr_wait flag
OTHER_FUNC:
        LD R0,#00H
        LD R1,#FUNC_FIRE_CODE-1
        ADD R1,FUNC_CODE
        LDC R10,@RR0
        LD FIRE_SELE,R10
        CALL CONVERT_FIRE
FUNC_INIT_BACK:
        RET
;--------------------------------------------------------------------
;initiated RAM(00H-1FH) routine
;R0--start ram address
;R1--end ram address
CLR_RAM:
        CLR @R0
        INC R0
        CP R0,R1
        JR ULE,CLR_RAM
        RET
;--------------------------------------------------------------
;开机设置PWM端口子过程
TURN_ON:
        AND P0CONH,#11011111B
        OR P0CONH,#10H ;set P0.6 is as PWM output
        LD PWMDATA,#50H
        LD PWMCON,#01011100B ;set PWM input clock=Fosc/8=2.5us
                                        ;start PWM count
        RET
;------------------------------------------------------------------------
;关机设置PWM端口子过程
TURN_OFF:
        AND P0CONH,#11101111B
        OR P0CONH,#20H ;set P0.6 is as push-pull output
        LD PWMDATA,#0FFH
        OR P0,#40H ;set P0.6 is high level
        RET
;-------------------------------------------------------------
;DELAY 10MS sub
;DELAY TIME=R0*(18*R1+14)*0.3125us=9.1ms
DELAY_10MS:
        PUSH R0
        PUSH R1
        LD R0,#58H
DELAY_10MSA:
        LD R1,#12H
DELAY_10MSB:
        NOP
        LD BTCON,#02H ;clear watch-dog
        DEC R1
        JR NZ,DELAY_10MSB
        DEC R0
        JR NZ,DELAY_10MSA
        
        POP R1
        POP R0
        RET
;-----------------------------------------------------------
;DELAY 100MS sub
DELAY_100MS:
        PUSH R3
        LD R3,#0AH
_DELAY_100MS:
        CALL DELAY_10MS
        DEC R3
        JR NZ,_DELAY_100MS
        POP R3
        RET

;--------------------------------------------------------------------
;power voltage high check subroutine
;USE_PORT: P0.4 (A/D)
;OUTPUT: ERRFLAG=1--test power voltage highest
; ERRFLAG=2--test power voltage lowest
PV_CHECK:
        LD ADCON,#01010101B ;P0.5 A/D convert start
                                                ;AD_CLK=Fosc/4
        LD R10,#0A5H
        LD R11,#066H
        TMBIT DISPFLAG,PV_WAIT ;check PV_WAIT flag
        JR NZ,AD_PV
        LD R10,#0AAH
        LD R11,#04FH
        CP PWMDATA,#0FFH
        JR NE,AD_PV
        ;if no turn on
        LD R10,#0B0H
        LD R11,#060H
AD_PV:
        TM ADCON,#08H ;Check Convert complete ?
        JR Z,AD_PV
     
        LD ERRFLAG,#01H ;set PV_HIGHEST code
        CP ADDATAH,R10 ;PV>V_HIGHEST?
        JR UGT,PV_BACK
        
        LD ERRFLAG,#02H ;set PV_LOWEST code
        CP ADDATAH,R11
        JR ULT,PV_BACK
        CLR ERRFLAG
      
PV_BACK:
        LD PVAD_DT,ADDATAH ;save result
        RET
;------------------------------------------------------------
;hsr check routine
;USE_PORT: P0.3 (A/D)
;OUTPUT: ERRFLAG=04H, the hsr open circurt error code
; ERRFLAG=05H, the hsr hotest error code
HSR_CHECK:
        LD ADCON,#00110101B ;select P0.3 as A/D
                                        ;AD_CLK=Fosc/4
HSR_AD:
        TM ADCON,#08H
        JR Z,HSR_AD
      
        LD HSRAD_DT,ADDATAH
        LD ERRFLAG,#03H
        CP ADDATAH,#0FDH ;V>4.95V,so it is open circurt
        JR UGT,HSR_BACK
        
        CLR ERRFLAG
        CP ADDATAH,#1EH ;V<0.60V,so it is hotest
        JR UGT,HSR_BACK
        TMBIT RUNFLAG,NO_AD ;if no hot up ,no check hotest
        JR NZ,HSR_BACK
        LD ERRFLAG,#04H
HSR_BACK:
        RET
;------------------------------------------------------------
IGBT_CHECK:
        LD ADCON,#01000101B ;select P0.4 as A/D
                                        ;AD_CLK=Fosc/4
IGBT_AD:
        TM ADCON,#08H
        JR Z,IGBT_AD
     
        LD ERRFLAG,#05H
        CP ADDATAH,#01H ;V<0.02V,so it is open circurt
        JR ULT,IGBT_BACK
     
        CLR ERRFLAG
        CP ADDATAH,#85H ;V<2.60V,so it is hotest
        JR ULT,IGBT_BACK
        LD ERRFLAG,#06H
IGBT_BACK:
        LD IGBTAD_DT,ADDATAH
        RET
;------------------------------------------------------------
;fire select digit code set routine
;-----------------------------------
CONVERT_FIRE:
        CP FUNC_CODE,#0AH ;check func=lock_temp
        JR NE,GO_CVT_FIRE
        ;if func=lock_temp
CVT_TEMP:
        LD R0,#00H
        LD R1,#TEMP_VOL_CODE-1
        ADD R1,LOCK_TEMP
        LDC R10,@RR0 ;load lock temp vol code
        LD TEMP_VOL,R10
        LD R1,#TEMP_FIRE_CODE-1
        ADD R1,LOCK_TEMP
        LDC R10,@RR0
        LD FIRE_CVOL,R10
        JR FIRE_CVT_BACK
        
GO_CVT_FIRE:
        LD R0,#00H
        LD R1,#FIRE_VOL_CODE-1
        ADD R1,FIRE_SELE
        LDC R10,@RR0
        LD FIRE_CVOL,R10
      
        CLRBIT RUNFLAG,IM_MODE ;clear IM_MODE,NO_AD flag
        CLRBIT RUNFLAG,NO_AD
        SETBIT RUNFLAG,NO_FZ ;set NO_FZ flag
        LD DELAY_3S,#0F0H
        CLR ERRFLAG
        CP FIRE_SELE,#02H
        JR UGT,FIRE_CVT_BACK ;if fire level>1,so go back
        ;if fire level is 1,so it run at im mode
        SETBIT RUNFLAG,IM_MODE ;set im mode flag
        LD DELAY_RUN,#05H
        LD DELAY_FREE,#05H
        LD IM_LOOP,#05H
        CP FIRE_SELE,#01H
        JR EQ,FIRE_CVT_BACK
        LD DELAY_RUN,#07H
        LD DELAY_FREE,#03H
        ;LD IM_LOOP,DELAY_RUN
     
FIRE_CVT_BACK:
        RET
;--------------------------------------------------------------------------------
;将时间值转换为LED A,B,C段显示码的子程序
;IN: MINUTES-----时间值
;OUT: DIGITA------百位数字,DIGITB-----十位数字,DIGITC----个位数字
TMTO_ABCD:
        LD DIGITC,MINUTES
        CLR DIGITB
        CLR DIGITA
CVT_GEBIT:
        CP DIGITC,#0AH
        JR ULT,CVT_SHIBIT
        SUB DIGITC,#0AH
        INC DIGITB
        JR CVT_GEBIT
CVT_SHIBIT:
        CP DIGITB,#0AH
        JR ULT,TMTO_ABCD_BACK
        SUB DIGITB,#0AH
        INC DIGITA
        JR CVT_SHIBIT

TMTO_ABCD_BACK:
        RET
;--------------------------------------------------------------------------------
;three digit code convert display
;-------------------------------
DIGIT_CONVERT:
       CP DIGITA,#00H
       JR NE,START_CONVERT
       LD DIGITA,#0FH ;if A-seg is 0,so no display('F')
       CP DIGITB,#00H
       JR NE,START_CONVERT
       ;if tmr_wait=1,and digitb=0,so set digitb '0'
       TMBIT DISPFLAG,TMR_WAIT ;check TMR_WAIT flag
       JR NZ,START_CONVERT
       LD DIGITB,#0FH ;normaly,if B-seg is 0,no display
START_CONVERT:
       LD R0,#00H
       LD R1,#DIGIT_CVT_CODE
       ADD R1,DIGITA
       LDC R10,@RR0 ;get DIGITA display code into R10
       AND DIRECT_LED,#10011111B ;turn on SEG_A display
       AND R10,#01100000B ;only save b6,b5 two bit
       OR DIRECT_LED,R10 ;SEG_A ='1'
       
       LD R1,#DIGIT_CVT_CODE
       ADD R1,DIGITB
       LDC R10,@RR0 ;get DIGITB display code into R10
       LD SEG_B,R10
 
       LD R1,#DIGIT_CVT_CODE
       ADD R1,DIGITC
       LDC R10,@RR0 ;get DIGITC display code into R10
       LD SEG_C,R10
;--------------------------
CHK_DISP_COL:
       TMBIT FLASHFLAG,FLASH_ALL ;check FLASH_ALL flag
       JR Z,CONVERT_DG_BACK
       ;set digit seg all flash display
       TMBIT TMRFLAG,HALF_SEDB ;check 0.5s flagB
       JR NZ,CONVERT_DG_BACK ;if 0.5s_flagB=1,display
       OR DIRECT_LED,#01100000B
       LD SEG_B,#0FFH
       LD SEG_C,#0FFH
;------------------------------------
CONVERT_DG_BACK:
        RET
;------------------------------------------------------------
;音乐播放子程序
;所播放的音符首地址由RAM变量MIC_HIGH(高位),MIC_LOW(低位)传入本程序
;地址中存放的代码依次为:音符代码一个字节(T0DATA值)
; 音符长度一个字节(以4MS为单位)
; 音符播放间歇时间一个字节(以2MS为单位)
;MIC_HIGH.7=1--标准音符播放方式(需查表转换音符及音长)
; MIC_LOW.7=0--自由音符播放方式(直接取得音符及音长)
;音符频率输出: P2.0 (set it is as t0 match output)
;播放时间控制: P2.6 (set it is as push-pull output)
;所用寄存器:
;R0---音符存储区高位地址
;R1---音符存储区低位地址
;R7---音符代码/音符频率
;R13--音符播放时间
;R14--音符播放音歇时间
;R15--暂存按键代码
MUSIC:
        ;-------------------
        ;play port initiale
        DI ;disable all interrup
        PUSH T0CON ;save t0 control parameter
        PUSH T0DATA
        CALL CONVERT_CODE
        CALL LED_SCAN
        LD T0CON,#10001000B ;set T0 input clock=Fosc/8=2.5us
        LD BTCON,#10101010B ;disable watchdog run,clk=Fosc/128=40us
PLAY_START:
        CLRBIT RUNFLAG,ASK_MIC ;clear music flag
        LD R0,MIC_HIGH
        AND R0,#0FH ;得到音符存储区高位地址
        LD R1,MIC_LOW
PLAY_PROC:
        TM MIC_HIGH,#80H ;检查播放方式
        JR NZ,NORM_PLAY
        ;如果选择自由频率播放方式
        LDC R7,@RR0 ;取得音符频率存R7中
        INC R1
        LDC R13,@RR0 ;取得播放时间存R13中
        INC R1
        LDC R14,@RR0 ;取得间歇时间存R14中
        INC R1
        JP START_PLAY
        ;----------------------
        ;标准音符播放方式
NORM_PLAY:
        LDC R9,@RR0 ;取得音符代码存R9中
        CP R9,#00H
        JP EQ,MUSIC_EXIT ;if note=0,so play finished,back
        ;根据代码高位值决定高低音符
        LD R15,R9
        AND R9,#0FH
        LD R14,#NOTE_HIGH-1
        TM R15,#20H
        JR NZ,INC_R1
        LD R14,#NOTE_MIDU-1
        TM R15,#10H
        JR NZ,INC_R1
        LD R14,#NOTE_LOW-1
INC_R1:
        INC R1
        JR NZ,LDC_R11 ;检查是否到了存储区边界
        INC R0 ;如果到了边界,则高位地址增1
LDC_R11:
        LDC R11,@RR0 ;取得音符节拍代码存R11中
        INC R1
        JR NZ,LD_NOTE ;检查是否到了存储区边界
        INC R0 ;如果到了边界,则高位地址增1
LD_NOTE:
        ;---------------
        LD R8,#00H
        ADD R9,R14
        LDC R7,@RR8 ;取得音符实际频率存R7中
        ;---------------
        LD R10,#00H
        RL R11 ;R11=R11*2
        ADD R11,#MUSIC_TIME-1 ;设置音符节拍时间参数地址
        LDC R14,@RR10 ;取得音符间歇时间参数存R14中
        DEC R11
        LDC R13,@RR10 ;取得音符播放时间参数存R13中
START_PLAY:
        ;start play
        CP R7,#00H ;如果音符=00H,播放完毕,返回
        JR EQ,MUSIC_EXIT
        LD T0DATA,R7
        SETBIT P2,MUSIC_CTRL ;open port,start play
        OR BTCON,#02H
WAIT_OFF:
        CP BTCNT,#64H
        JR ULT,WAIT_OFF
        OR BTCON,#02H
        PUSH R13
        PUSH R0
        PUSH R1
        CALL LED_SCAN
        CALL TIMER_PROCESS
        CALL CONVERT_CODE
        CALL KEY_SCAN
        POP R1
        POP R0
        POP R13
                
        TMBIT RUNFLAG,ASK_MIC ;check MUSIC flag
        JP NZ,PLAY_START
        TMBIT RUNFLAG,ASK_STOP ;check ASK_STOP flag
        JR NZ,MUSIC_EXIT ;if 1,stop ,back
        DEC R13
        JR NZ,WAIT_OFF
        CLRBIT P2,MUSIC_CTRL ;close port,stop play
        OR BTCON,#02H
WAIT_ON:
        CP BTCNT,#64H
        JR ULT,WAIT_ON
        OR BTCON,#02H
        PUSH R14
        PUSH R1
        PUSH R0
        CALL LED_SCAN
        CALL TIMER_PROCESS
        CALL CONVERT_CODE
        CALL KEY_SCAN
        POP R0
        POP R1
        POP R14
        TMBIT RUNFLAG,ASK_MIC ;check MUSIC flag
        JP NZ,PLAY_START
        TMBIT RUNFLAG,ASK_STOP ;check ASK_STOP flag
        JR NZ,MUSIC_EXIT ;if 1,stop ,back
        
        DEC R14
        JR NZ,WAIT_ON
        
        JP PLAY_PROC
        ;------------------
MUSIC_EXIT:
        CLRBIT P2,MUSIC_CTRL ;close port,stop play
    
        POP T0DATA
        POP T0CON
        LD BTCON,#02H
        EI
        RET
;------------------------------------------------------------
;send a byte into 74ls164 routine
;INPUT: R0--it is will send data
;OUTPUT: no
;USE-REG: R0---it is will send data
; R1---send bit counter
;SET:P1.0--clock line
; P1.1--data line
;OUT data start from LSB
;-------------------------------------
SENDTO164:
        PUSH R1
        
        CLRBIT P1,CLK_LINE ;set clock line is low
        CLRBIT P1,DATA_LINE ;set data line is low
        LD R1,#08H ;only send 8 bit
  SENDA:
        RRC R0 ;right shift R0,bit0 into C
        SETBIT P1,DATA_LINE ;set data line
        JR C,SENDB ;if C=1,skip
        CLRBIT P1,DATA_LINE ;clear data line
  SENDB:
        SETBIT P1,CLK_LINE ;send one clock pulse
        CLRBIT P1,CLK_LINE
        DEC R1
        JR NZ,SENDA
        
        POP R1
        RET

;------------------------------------------------------------
;led every 2ms scan refresh a time
;RAM: LED_LOOP---led refresh counter
LED_SCAN:
        PUSH R0
      
        RL LED_LOOP
        ;first turn off all led display
        AND P2,#11111001B
        OR P2,#00111000B
             
        TM LED_LOOP,#01H
        JR NZ,SCAN_FUNC_LED
        TM LED_LOOP,#02H
        JR NZ,SCAN_FIRE_LED
        TM LED_LOOP,#04H
        JR NZ,SCAN_DIRECT_LED
        TM LED_LOOP,#08H
        JR NZ,SCAN_SEG_B
        TM LED_LOOP,#10H
        JR NZ,SCAN_SEG_C
        JR SCAN_KEY
SCAN_FUNC_LED:
        LD R0,FUNC_LED
        CALL SENDTO164
        SETBIT P2,FUNC_LED_CTRL ;turn on func led ctrl line
        JR LED_SCAN_BACK
SCAN_FIRE_LED:
        LD R0,FIRE_LED
        CALL SENDTO164
        SETBIT P2,FIRE_LED_CTRL
        JR LED_SCAN_BACK
SCAN_DIRECT_LED:
        LD R0,DIRECT_LED
        CALL SENDTO164
        CLRBIT P2,DIRECT_LED_CTRL
        JR LED_SCAN_BACK
SCAN_SEG_B:
        LD R0,SEG_B
        CALL SENDTO164
        CLRBIT P2,SEG_B_CTRL
        JR LED_SCAN_BACK
SCAN_SEG_C:
        LD R0,SEG_C
        CALL SENDTO164
        CLRBIT P2,SEG_C_CTRL
        JR LED_SCAN_BACK
SCAN_KEY:
        CALL CONVERT_KEY
        LD LED_LOOP,#01H
        JR SCAN_FUNC_LED
LED_SCAN_BACK:
        POP R0
        RET
;------------------------------------------------------------
;key scan convert code routine
;P1.0---74LS164 clock line
;P1.1---74LS164 data line
;P0.0---key scan input lineA
;P0.1---key scan input lineB
;if back KEY_CODEA=0FFH,so lineA no key pressed
;if back KEY_CODEB=0FFH,so lineB no key pressed
CONVERT_KEY:
        PUSH R1
        CLRBIT P1,CLK_LINE ;set clock line is low
        CLRBIT P1,DATA_LINE ;set data line is low
        ;first send 7 clock pluse,set output is all high
        SETBIT P1,DATA_LINE ;set data line is high
        LD R1,#07H
  SET_OUT_HIGH:
        SETBIT P1,CLK_LINE ;send one clock pulse
        CLRBIT P1,CLK_LINE
        DEC R1
        JR NZ,SET_OUT_HIGH
        
        CLRBIT P1,CLK_LINE ;set clock line is low
        CLRBIT P1,DATA_LINE ;set data line is low
        SETBIT P1,CLK_LINE ;first send one clock pulse
        CLRBIT P1,CLK_LINE
        SETBIT P1,DATA_LINE ;set data line is high
     
        LD R1,#07H ;test 7 times
TEST_KEY_LINEA:
        TMBIT P0,KEY_LINEA ;check key scan A status
        JR NZ,TEST_KEY_LINEB
        ;if key scan line A is 0,get code
        LD KEY_CODEA,R1
        JR CONKEY_BACK
TEST_KEY_LINEB:
        TMBIT P0,KEY_LINEB ;check key scan B status
        JR NZ,COUNT_LOOP
        ;if key scan line B is 0,get code
        LD KEY_CODEB,R1
        JR CONKEY_BACK
COUNT_LOOP:
        SETBIT P1,CLK_LINE ;send one clock pulse
        CLRBIT P1,CLK_LINE
        DEC R1
        JR NZ,TEST_KEY_LINEA
        LD KEY_CODEA,#0FFH
        LD KEY_CODEB,#0FFH
CONKEY_BACK:
        POP R1
        RET
;------------------------------------------------------------
;timer time running process
;----------------------------
TIMER_PROCESS:
        INC KEY_TMRL ;inc key scan timer
        INC TMR_HALFSEDA ;inc 0.5s counterA
        INC TMR_HALFSEDB ;inc 0.5s counterB
        CP TMR_HALFSEDB,#07DH
        JR ULT,CHK_HALFSEDA ;if counter 0.5s
        CLR TMR_HALFSEDB
        XORBIT TMRFLAG,HALF_SEDB
CHK_HALFSEDA:
        CP TMR_HALFSEDA,#07DH
        JR ULT,PROCESS_BACK ;if counter 0.5s no comed,back
        CLR TMR_HALFSEDA
        XORBIT TMRFLAG,HALF_SEDA
        XORBIT TMRFLAG,HALF_SEDC ;every 0.5s comp 0.5s flag(A,B,C)
              
        TMBIT TMRFLAG,HALF_SEDA
        JR Z,PROCESS_BACK ;if HALF_SEDA=0,back
        
        SETBIT TMRFLAG,ONE_SEDA
        SETBIT TMRFLAG,ONE_SEDB
        SETBIT TMRFLAG,ONE_SEDC ;set ONE_SECONDA,B,C
       
        CP SECONDS,#00H
        JR NE,DEC_SECONDS
        ;if second dec=00
        CP MINUTES,#00H
        JR EQ,PROCESS_BACK
        DEC MINUTES
        LD SECONDS,#3CH
DEC_SECONDS:
        DEC SECONDS
PROCESS_BACK:
        RET
;------------------------------------------------------------
;interrupt service routine
;TMR0 每2MS 中断一次
INT_9454:
        LD BTCON,#02H ;Clear watch-dog
      
        AND T0CON,#11110110B ;clear t0 interrupt pending
        CALL LED_SCAN ;scan led display
        CALL TIMER_PROCESS ;timer time process
END_INT:
        IRET

;------------------------------------------------------------
        DB 00H
        DB 00H
        DB 00H
        DB 00H
;泉水叮咚响音乐音符存储区
NOTE_QUANSHUI:
        ;---------------
        DB 11H,02H
        DB 15H,02H
        DB 16H,02H
        DB 15H,02H
        ;-----------------
        DB 11H,02H
        DB 15H,02H
        DB 16H,02H
        DB 15H,02H
        ;-----------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 16H,02H
        DB 15H,02H
        ;-----------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 16H,02H
        DB 15H,02H
        ;-----------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 21H,02H
        DB 22H,02H
        ;------------------
        DB 15H,05H
        ;------------------
        DB 21H,02H
        DB 21H,01H
        DB 21H,01H
        DB 22H,02H
        DB 21H,02H
        ;------------------
        DB 16H,02H
        DB 16H,01H
        DB 21H,01H
        DB 16H,02H
        DB 15H,02H
        ;------------------
        DB 15H,02H
        DB 11H,02H
        DB 15H,02H
        DB 13H,02H
        ;------------------
        DB 12H,05H
        ;------------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 13H,02H
        DB 12H,02H
        ;------------------
        DB 11H,02H
        DB 11H,01H
        DB 12H,01H
        DB 13H,02H
        DB 15H,02H
        ;-------------------
        DB 16H,02H
        DB 15H,01H
        DB 16H,01H
        DB 21H,02H
        DB 15H,02H
        ;-------------------
        DB 21H,02H
        DB 16H,03H
        DB 21H,02H
        ;-------------------
        DB 15H,02H
        DB 15H,01H
        DB 16H,01H
        DB 21H,02H
        DB 22H,02H
        ;-------------------
        DB 16H,02H
        DB 16H,01H
        DB 21H,01H
        DB 16H,02H
        DB 15H,02H
        ;-------------------
        DB 15H,02H
        DB 11H,02H
        DB 13H,02H
        DB 12H,02H
        ;-------------------
        DB 11H,05H
        ;-------------------
        DB 21H,02H
        DB 21H,01H
        DB 21H,01H
        DB 16H,02H
        DB 15H,02H
        ;-------------------
        DB 13H,01H
        DB 15H,01H
        DB 13H,01H
        DB 15H,01H
        DB 16H,01H
        DB 15H,01H
        DB 21H,02H
        ;-------------------
        DB 16H,02H
        DB 21H,01H
        DB 16H,01H
        DB 15H,01H
        DB 13H,01H
        DB 15H,01H
        DB 16H,01H
        DB 21H,01H
        ;------------------
        DB 15H,04H
        DB 21H,01H
        DB 16H,01H
        DB 15H,01H
        DB 13H,01H
        DB 12H,01H
        ;-------------------
        DB 11H,03H
        DB 21H,01H
        DB 16H,01H
        DB 21H,01H
        DB 22H,01H
        DB 23H,01H
        ;-------------------
        DB 21H,02H
        DB 21H,02H
        DB 21H,02H
        DB 16H,02H
        ;--------------------
        DB 23H,02H
        DB 22H,01H
        DB 23H,01H
        DB 21H,02H
        DB 16H,01H
        ;--------------------
        DB 15H,01H
        DB 15H,02H
        DB 13H,01H
        DB 15H,02H
        DB 23H,02H
        ;--------------------
        DB 22H,05H
        ;--------------------
        DB 22H,02H
        DB 21H,02H
        DB 21H,02H
        DB 16H,02H
        ;--------------------
        DB 23H,03H
        DB 22H,01H
        DB 21H,03H
        DB 23H,01H
        ;--------------------
        DB 22H,01H
        DB 22H,02H
        DB 21H,01H
        DB 16H,01H
        DB 15H,01H
        DB 16H,02H
        ;--------------------
        DB 15H,05H
        ;--------------------
        DB 21H,02H
        DB 21H,02H
        DB 16H,02H
        ;--------------------
        DB 15H,03H
        DB 21H,01H
        DB 16H,02H
        DB 15H,02H
        ;--------------------
        DB 13H,01H
        DB 13H,02H
        DB 15H,01H
        DB 12H,02H
        DB 11H,02H
        ;--------------------
        DB 15H,02H
        DB 13H,03H
        DB 12H,02H
        ;--------------------
        DB 11H,03H
        DB 12H,01H
        DB 13H,02H
        DB 15H,02H
        ;--------------------
        DB 16H,02H
        DB 16H,01H
        DB 21H,01H
        DB 16H,02H
        DB 15H,01H
        DB 13H,01H
        ;---------------------
        DB 13H,01H
        DB 15H,02H
        DB 23H,01H
        DB 22H,01H
        DB 21H,01H
        DB 22H,02H
        ;---------------------
        DB 21H,03H
        DB 15H,01H
        DB 16H,01H
        DB 17H,01H
        DB 21H,01H
        DB 22H,01H
        ;---------------------
        DB 23H,02H
        DB 23H,01H
        DB 22H,01H
        DB 21H,02H
        DB 23H,02H
        ;--------------------
        DB 22H,01H
        DB 23H,01H
        DB 22H,01H
        DB 21H,01H
        DB 16H,02H
        DB 15H,02H
        ;---------------------
        DB 13H,01H
        DB 15H,01H
        DB 13H,01H
        DB 15H,01H
        DB 16H,01H
        DB 15H,01H
        DB 13H,01H
        DB 12H,01H
        ;----------------------
        DB 11H,02H
        DB 15H,02H
        DB 11H,02H
        DB 15H,02H
        ;----------------------
        DB 13H,01H
        DB 13H,01H
        DB 15H,02H
        DB 16H,02H
        DB 15H,02H
        ;----------------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 16H,02H
        DB 15H,02H
        ;-----------------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 21H,02H
        DB 22H,02H
        ;------------------------
        DB 15H,05H
        ;------------------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 16H,02H
        DB 15H,02H
        ;-----------------------
        DB 13H,02H
        DB 13H,01H
        DB 15H,01H
        DB 16H,02H
        DB 15H,02H
        ;-----------------------
        DB 15H,02H
        DB 11H,02H
        DB 13H,02H
        DB 12H,02H
        ;-----------------------
        DB 11H,05H
        ;-----------------------
        DB 15H,02H
        DB 11H,02H
        DB 13H,02H
        DB 12H,02H
        ;------------------------
        DB 11H,05H
        ;------------------------
        DB 15H,02H
        DB 11H,02H
        DB 13H,02H
        DB 12H,02H
        ;------------------------
        DB 11H,05H
        ;------------------------
        ;DB 22H,05H
        DB 00H
;-------------------------------------------------------------
;恭喜你音乐音符存储区
NOTE_GONGXI:
        DB 06H,02H ;中音'6',1/2节拍
        DB 07H,02H ;中音'7',1/2节拍
        DB 11H,02H ;中高音'1',1/2节拍
        DB 12H,02H ;中高音'2',1/2节拍
        ;--------------
        DB 14H,02H
        DB 13H,02H
        DB 13H,03H ;中高音'3',1拍
        ;--------------
        DB 13H,02H
        DB 16H,02H
        DB 16H,02H
        DB 13H,02H
        ;--------------
        DB 13H,02H
        DB 12H,02H
        DB 12H,03H
        ;--------------
        DB 13H,02H
        DB 14H,02H
        DB 13H,02H
        DB 12H,02H
        ;--------------
        DB 12H,02H
        DB 11H,02H
        DB 11H,03H
        ;--------------
        DB 11H,02H
        DB 07H,02H
        DB 06H,02H
        DB 05H,02H
        ;---------------
        DB 06H,03H
        DB 06H,03H
        ;---------------
        DB 12H,03H
        DB 13H,02H
        DB 11H,03H
        DB 13H,02H
        ;---------------
        DB 07H,03H
        DB 13H,02H
        DB 06H,03H
        DB 13H,02H
        ;---------------
        DB 12H,03H
        DB 13H,02H
        DB 11H,03H
        DB 13H,02H
        ;---------------
        DB 07H,03H
        DB 13H,02H
        DB 06H,03H
        ;---------------
        DB 00H
        
;-------------------------------------------------------------
.END ;Programer is end