;-----------------------------------------------------
;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