您的位置:首页单片机合泰单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

HT46R23控制的智能电饭锅源程序

[日期:2008-05-07 ] [来源:东哥单片机学习网(www.picavr.com) 作者:佚名] [字体: (投递新闻)
;***************************************
;R_flag_0.0     R_flag_0.1   用于键盘扫描
;R_flag_0.2  R_flag_0.3   R_flag_0.4用于键盘扫描
;R_flag_0.5  上午还是下午,下午为1
;R_flag_0.6  是否有交流电,没有为1
;R_flag_0.7 
;R_flag_1.0  用于交流电检测
;R_flag_1.1  用于秒点跳跃
;R_flag_1.2  是否处于时钟调整,是为1
;R_flag_1.3  左锅开关标志,开为1
;R_flag_1.4  左锅定时器是否处于调整期,是为1
;R_flag_1.5  是否快速煮饭,是为1
;R_flag_1.6  右锅定时器是否处于调整期,是为1
;R_flag_1.7  左定时器是上午不是下午
;R_flag_2.0  右定时器是上午不是下午
;R_flag_2.1  右锅开关标志,开为1
;R_flag_2.2  煲汤标志
;R_flag_2.3  油炸标志
;R_flag_2.4  左定时器是否有效,是为1
;R_flag_2.5  右定时器是否有效,是为1
;R_flag_2.6  用于煮饭
;R_flag_2.7
;R_flag_3.0  左锅保温标志,保温为1
;R_flag_3.1  右锅保温标志,保温为1
;R_flag_3.2  是否为焖饭过程,是为1
;R_flag_3.3  煮粥最后阶段标志,是为1
;R_flag_3.4  煲汤最后阶段标志,是为1
;R_flag_3.5  左锅顶部加热器过温,是为1
;R_flag_3.6  右锅顶部加热器过温,是为1
;R_flag_3.7  是否允许进入睡眠状态
;****************************************
#INCLUDE HT46R23.INC
DATA .SECTION 'data'
  R_lcd_data_0  DB   00h
  R_lcd_data_1  DB   00h
  R_lcd_data_2  DB   00h
  R_lcd_data_3  DB   00h
  R_flag_0   DB   00h
  R_flag_1   DB   00h
  R_flag_2   DB   00h
  R_flag_3   DB   00h
  R_key_bak_0   DB   00h
  R_key_bak_1   DB   00h
  R_key_time_0  DB   00h
  R_key_time_1  DB   00h
  R_a_bak    DB   00h
  R_status_bak  DB   00h
  R_time_0   DB   00h
  R_time_1   DB   00h
  R_time_2   DB   00h
  R_time_3   DB   00h
  R_time_4   DB   00h
  R_buzzer_time  DB   00h
  R_buzzer_time_0  DB   00h
  R_hour    DB   00h
  R_minute   DB   00h
  R_timer_hour_l  DB   00h
  R_timer_minute_l DB   00h
  R_timer_hour_r  DB   00h
  R_timer_minute_r DB   00h
  R_ad_data_0   DB   00h
  R_ad_data_1   DB   00h
  R_temp_0   DB   00h
  R_temp_1   DB   00h
  R_temp_2   DB   00h
  R_temp_3   DB   00h
  R_temp_4   DB   00h
  R_temp_5   DB   00h
  R_temp_6   DB   00h
  R_temp_7   DB   00h
  R_select_l   DB   00h
  R_pa_bak   DB   00h
  R_analog_select  DB   00h
  R_ad0_data_0  DB   00h
  R_ad0_data_1  DB   00h
  R_ad1_data_0  DB   00h
  R_ad1_data_1  DB   00h
  R_ad2_data_0  DB   00h
  R_ad2_data_1  DB   00h
  R_ad3_data_0  DB   00h
  R_ad3_data_1  DB   00h
  R_curr_low   DB   00h
  R_curr_high   DB   00h
  R_zhufan_time_0  DB   00h
  R_zhufan_time_1  DB   00h
  R_zhuzhou_time  DB   00h  
  R_baotang_time  DB   00h
  R_protest_time  DB   00h
  R_driver_l_time  DB   00h
  R_driver_r_time  DB   00h
  R_loop    DB   00h
  R_loop_0   DB   00h
  R_start_time  DB   00h
CODE .SECTION at 0 'code'
  ORG  00h
  JMP  L_start
  ORG  08h
  JMP  L_timer
  
L_start:
;*****************
;全部通用寄存器清零
;*****************
  CLR   WDT
  MOV   A,     40h
  MOV   MP0,    A
  MOV   A,     0c0h
L_clear:
  CLR   IAR0
  INC   MP0
  SDZ   Acc
  JMP   L_clear
;AD转换设置
  CLR   ACSR
  MOV   A,     0a0h
  MOV   ADCR,    A
  CLR   ADCR.7
;**********************
;寄存器初始化
;定时器中断为125微秒一次
;**********************
  CLR   PAC
  CLR   PA
  MOV   A,     8fh
  MOV   PBC,    A
  CLR   PCC
  CLR   PDC
  SET   PC.4
  SET   PD.1
  CLR   PB
  MOV   A,     83h
  MOV   TMRL,    A
  MOV   A,     0ffh
  MOV   TMRH,    A
  MOV   A,     92h
  MOV   TMRC,    A
  MOV   A,     05h
  MOV   INTC0,    A
  CLR   INTC1
  MOV   A,     08h
  MOV   R_time_0,   A
  MOV   A,     0fah
  MOV   R_time_1,   A
  MOV   A,     02h
  MOV   R_time_2,   A
  MOV   A,     78h
  MOV   R_time_3,   A
  MOV   A,     12h
  MOV   R_hour,    A
  MOV   R_timer_hour_l,  A
  MOV   R_timer_hour_r,  A
  MOV   A,     01h
  MOV   R_select_l,   A
  MOV   R_analog_select, A
  SET   R_flag_2.2
  CLR   R_flag_2.3
  CALL  Sub_lcd_ini
  SET   PDC.0
  NOP
  NOP
  NOP
  MOV   A,     PD
  CLR   PDC.0
  SNZ   Acc.0
  CALL  Sub_test
  MOV   A,     0ch
  MOV   R_start_time,  A
L_main:
  CLR   WDT
  SZ   R_loop_0
  JMP   $+6
  MOV   A,     50h
  MOV   R_loop_0,   A
  CALL  Sub_key_loose
  CALL  Sub_key_scan_0
  CALL  Sub_key_scan_1
  CALL  Sub_led_display
  SZ   R_loop
  JMP   $+5
  MOV   A,     14h
  MOV   R_loop,    A
  CALL  Sub_lcd_enable
  CALL  Sub_lcd_display
  CALL  Sub_ad_convert
  CALL  Sub_protest
  CALL  Sub_timer_already
  CALL  Sub_driver_l
  CALL  Sub_driver_r
  SZ   R_start_time
  JMP   L_main
  CALL  Sub_sleep
  JMP   L_main

;定时中断服务子程序
L_timer:
  MOV   R_a_bak,   A
  MOV   A,     Status
  MOV   R_status_bak,  A
;125微秒 
  SZ   PB.7
  JMP   L_curr_high
  SZ   R_flag_1.0
  JMP   $+3
  INC   R_curr_low
  JMP   L_curr_judge
  CLR   R_flag_1.0
  CLR   R_curr_low
  JMP   L_curr_ret
L_curr_high:
  SZ   R_flag_1.0
  JMP   $+4
  SET   R_flag_1.0
  CLR   R_curr_high
  JMP   L_curr_ret
  INC   R_curr_high
L_curr_judge:
  MOV   A,     R_curr_high
  SUB   A,     0a0h
  SNZ   Status.0
  JMP   $+3
  SET   R_flag_0.6
  JMP   L_curr_ret
  MOV   A,     R_curr_low
  SUB   A,     0a0h
  SNZ   Status.0
  JMP   $+2
  SET   R_flag_0.6
L_curr_ret:
  SZ   R_buzzer_time
  JMP   $+2
  JMP   $+3
  MOV   A,     40h
  XORM  A,     PB
  SZ   R_loop_0
  DEC   R_loop_0
  SDZ   R_time_0
  JMP   L_reti
;1毫秒
  MOV   A,     08h
  MOV   R_time_0,   A
  SZ   R_key_time_0
  DEC   R_key_time_0
  SZ   R_key_time_1
  DEC   R_key_time_1
  SZ   R_buzzer_time
  DEC   R_buzzer_time  
  SZ   R_loop
  DEC   R_loop
  
  SDZ   R_time_1
  JMP   L_reti
;250毫秒
  MOV   A,     0fah
  MOV   R_time_1,   A
  SZ   R_start_time
  DEC   R_start_time
  SZ   R_temp_5
  DEC   R_temp_5
  SZ   R_protest_time
  DEC   R_protest_time
  SZ   R_driver_l_time
  DEC   R_driver_l_time  
  SZ   R_driver_r_time
  DEC   R_driver_r_time
  SDZ   R_time_2
  JMP   L_reti
;500毫秒
  MOV   A,     02h
  MOV   R_time_2,   A
  
  SZ   R_buzzer_time_0
  JMP   $+2
  JMP   $+6
  DEC   R_buzzer_time_0
  SNZ   R_buzzer_time_0.0
  JMP   $+3
  MOV   A,     0ffh
  MOV   R_buzzer_time,  A
  
  MOV   A,     02h
  XORM  A,     R_flag_1
  SNZ   R_flag_1.4
  JMP   $+3
  MOV   A,     04h
  XORM  A,     R_pa_bak
  SNZ   R_flag_1.6
  JMP   $+3
  MOV   A,     10h
  XORM  A,     R_pa_bak
  SDZ   R_time_3
  JMP   L_reti
;1分
  MOV   A,     78h
  MOV   R_time_3,   A
  SZ   R_zhufan_time_0
  DEC   R_zhufan_time_0
  SZ   R_zhufan_time_1
  DEC   R_zhufan_time_1
  SZ   R_zhuzhou_time
  DEC   R_zhuzhou_time
  SZ   R_baotang_time
  DEC   R_baotang_time
  INC   R_minute
  MOV   A,     R_minute
  AND   A,     0fh
  SUB   A,     0ah
  SZ   Acc
  JMP   L_reti
  MOV   A,     10h
  ADDM  A,     R_minute
  MOV   A,     0f0h
  ANDM  A,     R_minute
  MOV   A,     R_minute
  SUB   A,     60h
  SZ   Acc
  JMP   L_reti
  CLR   R_minute
  INC   R_hour
  MOV   A,     R_hour
  SUB   A,     0ah
  SZ   Acc
  JMP   L_hour_0
  MOV   A,     10h
  MOV   R_hour,    A
  JMP   L_reti
L_hour_0:
  MOV   A,     R_hour
  SUB   A,     12h
  SZ   Acc
  JMP   L_hour_1
  MOV   A,     20h
  XORM  A,     R_flag_0
L_hour_1:
  MOV   A,     R_hour
  SUB   A,     13h
  SZ   Acc
  JMP   L_reti
  MOV   A,     01h
  MOV   R_hour,    A
  JMP   L_reti
  
  
L_reti:
  MOV   A,     R_status_bak
  MOV   Status,    A
  MOV   A,     R_a_bak
  RETI
  
  
  
;***********************************************
;R_flag_0.1是否是正处于去抖动延时时间中,是则为1
;R_flag_0.0是否有按键处于按下状态,是为1
;R_key_bak_0保存去抖动前的按键状态
;R_key_time_0去抖动时间
;***********************************************
Sub_key_scan_0 PROC
  SZ   R_flag_0.3
  RET
  CLR   PA.7
  CLR   PA.5
  SET   PA.6
  SZ    R_flag_0.1
     JMP   L_key0_1
     MOV   A,     0e0h
  ANDM  A,     PAC
  MOV   A,     1fh
  ORM   A,     PA
  MOV    A,     1FH
     ORM   A,     PAC
L_key0_2:
     SDZ   Acc
     JMP   L_key0_2
     MOV   A,     PA
     OR   A,     0e0h
     MOV   R_key_bak_0,  A
L_key0_3:
     MOV    A,     14H
     MOV   R_key_time_0,   A
     SET   R_flag_0.1
     JMP   L_key0_ret
L_key0_1:
     SZ    R_key_time_0
     JMP   L_key0_ret
     CLR   R_flag_0.1
     MOV   A,     0e0h
  ANDM  A,     PAC
  MOV   A,     1fh
  ORM   A,     PA
  MOV   A,     1FH
     ORM   A,     PAC
L_Key0_4:
     SDZ   Acc
     JMP   L_key0_4
     MOV   A,     PA
     OR   A,     0e0h
     SUB   A,     R_key_bak_0
     SZ    Acc
     JMP   L_key0_ret
     CPLA   R_key_bak_0
     SZ    ACC
     JMP   L_key0_5
     CLR   R_flag_0.0
     JMP   L_key0_ret
L_key0_5: 
  SZ   R_flag_0.4
  JMP   L_key0_ret
  MOV   A,     0c8h
  MOV   R_buzzer_time,  A
     SET   R_flag_0.0
     SZ    R_key_bak_0.0
     JMP   L_key0_6
     SNZ   R_flag_1.3
     JMP   $+3
     CLR   R_buzzer_time
     JMP   L_key0_ret
   CLR   R_flag_2.4
     MOV   A,     20h
  XORM  A,     R_flag_1     
  SNZ   R_flag_1.5
  JMP   L_key0_ret
  MOV   A,     01h
     MOV   R_select_l,   A
     JMP   L_key0_ret
L_key0_6:
     SZ    R_KEY_BAK_0.1
     JMP   L_key0_7
     SNZ   R_flag_1.3
     JMP   $+3
     CLR   R_buzzer_time
     JMP   L_key0_ret
     CLR   R_flag_2.4
     CLR   R_flag_1.5
     CLR   R_flag_2.6
     RL   R_select_l
     SNZ   R_select_l.3
     JMP   L_key0_ret
     MOV   A,     01h
     MOV   R_select_l,   A
     JMP   L_key0_ret
L_key0_7:
     SZ    R_key_bak_0.2
     JMP   L_key0_8
     MOV   A,     10h
     XORM  A,     R_flag_1
  SNZ   R_flag_1.2
  JMP   $+4
  CLR   R_flag_1.4
  CLR   R_buzzer_time
  JMP   L_key0_ret
  SNZ   R_flag_1.3
  JMP   $+4
  CLR   R_flag_1.4
  CLR   R_buzzer_time
  JMP   L_key0_ret
  SNZ   R_flag_1.6
  JMP   $+4
  CLR   R_flag_1.4     
  CLR   R_buzzer_time
  JMP   L_key0_ret
  SNZ   R_flag_1.4
  CALL  Sub_timer_l_on
     JMP   L_key0_ret
L_key0_8:
     SZ    R_key_bak_0.3
     JMP   L_key0_9
     MOV   A,     08h
     XORM  A,     R_flag_1
     SNZ   R_flag_1.3
     CLR   R_flag_3.0
     SZ   R_flag_1.3  
     CLR   R_flag_2.4
     JMP    L_key0_ret
L_key0_9:
     SZ    R_key_bak_0.4
     JMP   L_key0_ret
  MOV   A,     04h
  XORM  A,     R_flag_1     
  SNZ   R_flag_1.4
  JMP   $+4
  CLR   R_flag_1.2
  CLR   R_buzzer_time
  JMP   L_key0_ret
  SNZ   R_flag_1.6
  JMP   $+3
  CLR   R_flag_1.2
  CLR   R_buzzer_time
L_key0_ret:
  RET
Sub_key_scan_0 ENDP  
;***********************************************
;R_flag_0.3是否是正处于去抖动延时时间中,是则为1
;R_flag_0.2是否有按键处于按下状态,是为1
;R_key_bak_1保存去抖动前的按键状态
;R_key_time_1去抖动时间
;***********************************************
Sub_key_scan_1 PROC
  SZ   R_flag_0.1
  RET
  CLR   PA.7
  CLR   PA.6
  SET   PA.5
  SZ    R_flag_0.3
     JMP   L_key1_1
     MOV   A,     0e0h
  ANDM  A,     PAC
  MOV   A,     1fh
  ORM   A,     PA
  MOV    A,     1FH
     ORM   A,     PAC
L_key1_2:
     SDZ   Acc
     JMP   L_key1_2
     MOV   A,     PA
     OR   A,     0e0h
     MOV   R_key_bak_1,  A
L_key1_3:
     MOV    A,     14H
     MOV   R_key_time_1,   A
     SET   R_flag_0.3
     JMP   L_key1_ret
L_key1_1:
     SZ    R_key_time_1
     JMP   L_key1_ret
     CLR   R_flag_0.3
     MOV   A,     0e0h
  ANDM  A,     PAC
  MOV   A,     1fh
  ORM   A,     PA
  MOV   A,     1FH
     ORM   A,     PAC
L_Key1_4:
     SDZ   Acc
     JMP   L_key1_4
     MOV   A,     PA
     OR   A,     0e0h
     SUB   A,     R_key_bak_1
     SZ    Acc
     JMP   L_key1_ret
     CPLA   R_key_bak_1
     SZ    ACC
     JMP   L_key1_5
     CLR   R_flag_0.2
     JMP   L_key1_ret
L_key1_5: 
  SZ   R_flag_0.4
  JMP   L_key1_ret
     SET   R_flag_0.2
     MOV   A,     0c8h
     MOV   R_buzzer_time,  A
     SZ    R_key_bak_1.0
     JMP   L_key1_6
     SZ   R_flag_1.4
     JMP   L_key1_5_0
     SZ   R_flag_1.6
     JMP   L_key1_5_1
     SZ   R_flag_1.2
     JMP   L_key1_5_2
     CLR   R_buzzer_time
     JMP   L_key1_ret
L_key1_5_2:
     MOV   A,     78h
  MOV   R_time_3,   A
     INC   R_minute
  MOV   A,     R_minute
  AND   A,     0fh
  SUB   A,     0ah
  SZ   Acc
  JMP   L_key1_ret
  MOV   A,     10h
  ADDM  A,     R_minute
  MOV   A,     0f0h
  ANDM  A,     R_minute
  MOV   A,     R_minute
  SUB   A,     60h
  SZ   Acc
  JMP   L_key1_ret
  CLR   R_minute
     JMP   L_key1_ret
L_key1_5_0:
  MOV   A,     05h
  ADDM  A,     R_timer_minute_l
  MOV   A,     R_timer_minute_l
  AND   A,     0fh
  SUB   A,     0ah
  SNZ   Status.0
  JMP   $+3
  MOV   A,     06h
  ADDM  A,     R_timer_minute_l
  MOV   A,     R_timer_minute_l
  SUB   A,     60h
  SNZ   Status.0
  JMP   L_key1_ret
  CLR   R_timer_minute_l
  JMP   L_key1_ret
L_key1_5_1:
  MOV   A,     05h
  ADDM  A,     R_timer_minute_r
  MOV   A,     R_timer_minute_r
  AND   A,     0fh
  SUB   A,     0ah
  SNZ   Status.0
  JMP   $+3
  MOV   A,     06h
  ADDM  A,     R_timer_minute_r
  MOV   A,     R_timer_minute_r
  SUB   A,     60h
  SNZ   Status.0
  JMP   L_key1_ret
  CLR   R_timer_minute_r
  JMP   L_key1_ret
L_key1_6:
     SZ    R_KEY_BAK_1.1
     JMP   L_key1_7
  MOV   A,     40h
  XORM  A,     R_flag_1
  SNZ   R_flag_1.2
  JMP   $+4
  CLR   R_flag_1.6
  CLR   R_buzzer_time
  JMP   L_key1_ret
  SNZ   R_flag_2.1
  JMP   $+4
  CLR   R_flag_1.6
  CLR   R_buzzer_time
  JMP   L_key1_ret
  SNZ   R_flag_1.4
  JMP   $+4
  CLR   R_buzzer_time
  CLR   R_flag_1.6
  JMP   L_key1_ret
  SNZ   R_flag_1.6
  CALL  Sub_timer_r_on
  JMP   L_key1_ret
L_key1_7:
     SZ    R_key_bak_1.2
     JMP   L_key1_8
  SZ   R_flag_1.4
     JMP   L_key1_7_0
     SZ   R_flag_1.6
     JMP   L_key1_7_1
     SZ   R_flag_1.2
     JMP   $+3
     CLR   R_buzzer_time
     JMP   L_key1_ret
     INC   R_hour
  MOV   A,     R_hour
  SUB   A,     0ah
  SZ   Acc
  JMP   L_hour_2
  MOV   A,     10h
  MOV   R_hour,    A
  JMP   L_key1_ret
L_hour_2:
  MOV   A,     R_hour
  SUB   A,     12h
  SZ   Acc
  JMP   L_hour_3
  MOV   A,     20h
  XORM  A,     R_flag_0
L_hour_3:
  MOV   A,     R_hour
  SUB   A,     13h
  SZ   Acc
  JMP   L_key1_ret
  MOV   A,     01h
  MOV   R_hour,    A
  JMP   L_key1_ret
L_key1_7_0:
  INC   R_timer_hour_l
  MOV   A,     R_timer_hour_l
  SUB   A,     0ah
  SZ   Acc
  JMP   L_hour_4
  MOV   A,     10h
  MOV   R_timer_hour_l,  A
  JMP   L_key1_ret
L_hour_4:
  MOV   A,     R_timer_hour_l
  SUB   A,     12h
  SZ   Acc
  JMP   L_hour_5
  MOV   A,     80h
  XORM  A,     R_flag_1
L_hour_5:
  MOV   A,     R_timer_hour_l
  SUB   A,     13h
  SZ   Acc
  JMP   L_key1_ret
  MOV   A,     01h
  MOV   R_timer_hour_l,    A
  JMP   L_key1_ret
L_key1_7_1:  
  INC   R_timer_hour_r
  MOV   A,     R_timer_hour_r
  SUB   A,     0ah
  SZ   Acc
  JMP   L_hour_6
  MOV   A,     10h
  MOV   R_timer_hour_r,  A
  JMP   L_key1_ret
L_hour_6:
  MOV   A,     R_timer_hour_r
  SUB   A,     12h
  SZ   Acc
  JMP   L_hour_7
  MOV   A,     01h
  XORM  A,     R_flag_2
L_hour_7:
  MOV   A,     R_timer_hour_r
  SUB   A,     13h
  SZ   Acc
  JMP   L_key1_ret
  MOV   A,     01h
  MOV   R_timer_hour_r,    A
  JMP   L_key1_ret
L_key1_8:
     SZ    R_key_bak_1.3
     JMP   L_key1_9
  MOV   A,     02h
  XORM  A,     R_flag_2
  SNZ   R_flag_2.1
  CLR   R_flag_3.1
  SZ   R_flag_2.1
  CLR   R_flag_2.5
     JMP    L_key1_ret
L_key1_9:
     SZ    R_key_bak_1.4
     JMP   L_key1_ret
     SNZ   R_flag_2.1
     JMP   $+3
     CLR   R_buzzer_time
     JMP   L_key1_ret
     CLR   R_flag_2.5
  MOV   A,     0ch
  XORM  A,     R_flag_2
  CLR   R_flag_2.7
L_key1_ret:
     RET
Sub_key_scan_1 ENDP
Sub_key_loose PROC
  SET   R_flag_0.4
  SZ   R_flag_0.0
  RET
  SNZ   R_flag_0.2
  CLR   R_flag_0.4
  RET
Sub_key_loose ENDP
;LCD DRIVER写程序
Sub_lcd_write PROC
  CLR   PD.1
L_lcd_0:
  SZ   R_temp_1.7
  SET   PD.0
  SNZ   R_temp_1.7
  CLR   PD.0
  NOP
  CLR   PC.4
  RLC   R_temp_0
  RLC   R_temp_1
  NOP
  NOP
  NOP
  SET   PC.4
  SDZ   R_temp_2
  JMP   L_lcd_0 
  NOP
  SET   PD.1
  SET   PD.0
  RET
Sub_lcd_write ENDP
;LCD DRIVER(ET7002)初始化程序
Sub_lcd_ini  PROC
;system on
  MOV   A,     80h
  MOV   R_temp_1,   A
  MOV   A,     20h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;LCD on
  MOV   A,     80h
  MOV   R_temp_1,   A
  MOV   A,     60h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;WDT disable
  MOV   A,     80h
  MOV   R_temp_1,   A
  MOV   A,     0a0H
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;TIME enable
  MOV   A,     80h
  MOV   R_temp_1,   A
  MOV   A,     0c0h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;XTAL 32768
  MOV   A,     82h
  MOV   R_temp_1,   A
  MOV   A,     80h
  MOV   R_temp_0,   A
  MOV   A,     0Ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;BIAS 1/3
  MOV   A,     85h
  MOV   R_temp_1,   A
  MOV   A,     20h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;IRQ disable
  MOV   A,     90h
  MOV   R_temp_1,   A
  MOV   A,     00h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;IRQ 4Hz
  MOV   A,     94h
  MOV   R_temp_1,   A
  MOV   A,     40h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
  RET
Sub_lcd_ini  ENDP
;LCD显示子程序
Sub_lcd_display  PROC
  MOV   A,     08h
  MOV   R_temp_3,   A
  MOV   A,     0a0h
  MOV   R_temp_4,   A
  CLR   R_temp_5.7
L_lcd_dis_0:
  MOV   A,     R_temp_4
  MOV   R_temp_1,   A
  SZ   R_temp_5.7
  SET   R_temp_0.7
  SNZ   R_temp_5.7
  CLR   R_temp_0.7
  SZ   R_lcd_data_3.0
  SET   R_temp_0.6
  SNZ   R_lcd_data_3.0
  CLR   R_temp_0.6
  SZ   R_lcd_data_2.0
  SET   R_temp_0.5
  SNZ   R_lcd_data_2.0
  CLR   R_temp_0.5
  SZ   R_lcd_data_1.0
  SET   R_temp_0.4
  SNZ   R_lcd_data_1.0
  CLR   R_temp_0.4
  SZ   R_lcd_data_0.0
  SET   R_temp_0.3
  SNZ   R_lcd_data_0.0
  CLR   R_temp_0.3
  MOV   A,     0dh
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
  SZ   R_temp_5.7
  JMP   $+3
  SET   R_temp_5.7
  JMP   $+3
  CLR   R_temp_5.7
  INC   R_temp_4
  RR   R_lcd_data_0
  RR   R_lcd_data_1
  RR   R_lcd_data_2
  RR   R_lcd_data_3
  SDZ   R_temp_3
  JMP   L_lcd_dis_0
  RET
Sub_lcd_display  ENDP
Sub_lcd_enable  PROC
  CLR   R_lcd_data_0
  CLR   R_lcd_data_1
  CLR   R_lcd_data_2
  CLR   R_lcd_data_3
  SZ   R_flag_1.1
  SET   R_lcd_data_3.4
  SET   R_lcd_data_3.2
  CLR   R_lcd_data_3.3
  SNZ   R_flag_0.5
  JMP   $+3
  CLR   R_lcd_data_3.2
  SET   R_lcd_data_3.3
  SNZ   R_flag_1.2
  JMP   L_disp_0
  SNZ   R_flag_1.1
  JMP   L_disp_3
L_disp_0:
  MOV   A,     R_minute
  OR   A,     0f0h
  MOV   TBLP,    A
  TABRDL  R_lcd_data_0
  MOV   A,     R_minute
  SWAPA  Acc
  AND   A,     0fh
  ADD   A,     0fah
  MOV   TBLP,    A
  TABRDL  R_lcd_data_1
  MOV   A,     R_hour
  OR   A,     0f0h
  MOV   TBLP,    A
  TABRDL  R_lcd_data_2
  MOV   A,     R_hour
  SWAPA  Acc
  AND   A,     0fh
  CLR   R_lcd_data_3.5
  SZ   Acc.0
  SET   R_lcd_data_3.5
L_disp_3:
  SNZ   R_flag_1.4
  JMP   L_disp_4
  MOV   A,     R_timer_minute_l
  OR   A,     0f0h
  MOV   TBLP,    A
  TABRDL  R_lcd_data_0
  MOV   A,     R_timer_minute_l
  SWAPA  Acc
  AND   A,     0fh
  ADD   A,     0fah
  MOV   TBLP,    A
  TABRDL  R_lcd_data_1
  MOV   A,     R_timer_hour_l
  OR   A,     0f0h
  MOV   TBLP,    A
  TABRDL  R_lcd_data_2
  MOV   A,     R_timer_hour_l
  SWAPA  Acc
  AND   A,     0fh
  CLR   R_lcd_data_3.5
  SZ   Acc.0
  SET   R_lcd_data_3.5
  SET   R_lcd_data_3.2
  CLR   R_lcd_data_3.3
  MOV   A,     0ch
  SZ   R_flag_1.7
  XORM  A,     R_lcd_data_3
  SET   R_lcd_data_3.4
L_disp_4:
  SNZ   R_flag_1.6
  JMP   L_disp_5
  MOV   A,     R_timer_minute_r
  OR   A,     0f0h
  MOV   TBLP,    A
  TABRDL  R_lcd_data_0
  MOV   A,     R_timer_minute_r
  SWAPA  Acc
  AND   A,     0fh
  ADD   A,     0fah
  MOV   TBLP,    A
  TABRDL  R_lcd_data_1
  MOV   A,     R_timer_hour_r
  OR   A,     0f0h
  MOV   TBLP,    A
  TABRDL  R_lcd_data_2
  MOV   A,     R_timer_hour_r
  SWAPA  Acc
  AND   A,     0fh
  CLR   R_lcd_data_3.5
  SZ   Acc.0
  SET   R_lcd_data_3.5
  SET   R_lcd_data_3.2
  CLR   R_lcd_data_3.3
  MOV   A,     0ch
  SZ   R_flag_2.0
  XORM  A,     R_lcd_data_3
  SET   R_lcd_data_3.4
L_disp_5:
  SZ   R_select_l.0
  SET   R_lcd_data_0.0
  SZ   R_select_l.1
  SET   R_lcd_data_1.0
  SZ   R_select_l.2
  SET   R_lcd_data_2.0
  SZ   R_flag_2.2
  SET   R_lcd_data_3.0
  SZ   R_flag_2.3
  SET   R_lcd_data_3.1
  SET   R_lcd_data_3.7
  SET   R_lcd_data_1.1  
  RET
Sub_lcd_enable  ENDP
;LED显示子程序
Sub_led_display  PROC
  CLR   PAC
  MOV   A,     14h
  ANDM  A,     R_pa_bak
  SZ   R_flag_1.5
  SET   R_PA_bak.0
  
  SZ   R_flag_1.3
  SET   R_pa_bak.1
  
  SZ   R_flag_2.1
  SET   R_pa_bak.6
  SZ   R_flag_1.4
  JMP   L_led_0  
  SNZ   R_flag_2.4    
  CLR   R_pa_bak.2
  SZ   R_flag_2.4
  SET   R_pa_bak.2
  
L_led_0:
  SZ   R_flag_1.6
  JMP   L_led_1  
  SNZ   R_flag_2.5
  CLR   R_pa_bak.4
  SZ   R_flag_2.5
  SET   R_pa_bak.4
  
L_led_1:
  SZ   R_flag_3.0
  SET   R_pa_bak.3
  
  SZ   R_flag_3.1
  SET   R_pa_bak.5
  
  MOV   A,     R_pa_bak
  MOV   PA,     A   
  SET   PA.7
  RET
Sub_led_display  ENDP
;判断左锅定时器是否有效子程序
Sub_timer_l_on  PROC
  CLR   R_flag_2.4
  SZ   R_flag_1.5
  RET
  SZ   R_select_l.2
  RET
  CALL  Sub_timer
  CALL  Sub_timer_l  
  
  MOV   A,     R_temp_3
  SUBM  A,     R_temp_1
  MOV   A,     R_temp_2
  SBCM  A,     R_temp_0
  SZ   Status.2
  JMP   $+3
  SET   R_flag_2.4
  RET
  SNZ   R_select_l.0
  JMP   L_timer_on_l_3
  MOV   A,     R_temp_1
  SUB   A,     2dh
  SZ   Status.0
  SET   R_flag_2.4
  RET
L_timer_on_l_3:
  MOV   A,     R_temp_1
  SUB   A,     5ah
  SZ   Status.0
  SET   R_flag_2.4
  RET
Sub_timer_l_on  ENDP
;判断右锅定时器是否有效子程序
Sub_timer_r_on  PROC
  CLR   R_flag_2.5
  SZ   R_flag_2.3
  RET
  CALL  Sub_timer
  CALL  Sub_timer_r
  
  MOV   A,     R_temp_3
  SUBM  A,     R_temp_1
  MOV   A,     R_temp_2
  SBCM  A,     R_temp_0
  SZ   Status.2
  JMP   $+3
  SET   R_flag_2.5
  RET
  MOV   A,     R_temp_1
  SUB   A,     78h
  SZ   Status.0
  SET   R_flag_2.5
  RET
Sub_timer_r_on  ENDP    
;计算当前时间到零点时的分钟数
Sub_timer   PROC
  MOV   A,     R_hour
  MOV   R_temp_4,   A
  MOV   A,     R_minute
  MOV   R_temp_1,   A
  MOV   R_temp_0,   A
  SNZ   R_temp_4.4
  JMP   $+4
  CLR   R_temp_4.4
  MOV   A,     0ah
  ADDM  A,     R_temp_4
  
  SWAP  R_temp_0
  MOV   A,     0fh
  ANDM  A,     R_temp_0
  SZ   Status.2
  JMP   L_timer_on_3
  ANDM  A,     R_temp_1
L_timer_on_2:  
  MOV   A,     0ah
  ADDM  A,     R_temp_1
  SDZ   R_temp_0
  JMP   L_timer_on_2
  CLR   R_temp_0
L_timer_on_3:
  MOV   A,     R_hour
  SUB   A,     12h
  SNZ   Status.2
  JMP   L_timer_on_0
  SNZ   R_flag_0.5
  RET
  JMP   L_timer_on_1
L_timer_on_0:
  MOV   A,     3ch
  ADDM  A,     R_temp_1
  CLR   Acc
  ADCM  A,     R_temp_0
  SDZ   R_temp_4
  JMP   L_timer_on_0
L_timer_on_1:  
  SNZ   R_flag_0.5
  JMP   $+5
  MOV   A,     0d0h
  ADDM  A,     R_temp_1
  MOV   A,     02h
  ADCM  A,     R_temp_0
  RET
Sub_timer   ENDP
;计算左定时器时间到零点时的分钟数
Sub_timer_l   PROC
  MOV   A,     R_timer_hour_l
  MOV   R_temp_4,   A
  MOV   A,     R_timer_minute_l
  MOV   R_temp_3,   A
  MOV   R_temp_2,   A
  SNZ   R_temp_4.4
  JMP   $+4
  CLR   R_temp_4.4
  MOV   A,     0ah
  ADDM  A,     R_temp_4
  
  SWAP  R_temp_2
  MOV   A,     0fh
  ANDM  A,     R_temp_2
  SZ   Status.2
  JMP   L_timer_on_l_5
  ANDM  A,     R_temp_3
L_timer_on_l_4:  
  MOV   A,     0ah
  ADDM  A,     R_temp_3
  SDZ   R_temp_2
  JMP   L_timer_on_l_4
  CLR   R_temp_2
L_timer_on_l_5:
  MOV   A,     R_timer_hour_l
  SUB   A,     12h
  SNZ   Status.2
  JMP   L_timer_on_l_0
  SNZ   R_flag_1.7
  JMP   L_timer_on_l_2
  JMP   L_timer_on_l_1
L_timer_on_l_0:
  MOV   A,     3ch
  ADDM  A,     R_temp_3
  CLR   Acc
  ADCM  A,     R_temp_2
  SDZ   R_temp_4
  JMP   L_timer_on_l_0
L_timer_on_l_1:
  SNZ   R_flag_1.7
  JMP   $+5
  MOV   A,     0d0h
  ADDM  A,     R_temp_3
  MOV   A,     02h
  ADCM  A,     R_temp_2
L_timer_on_l_2:
  MOV   A,     R_temp_3
  SUB   A,     R_temp_1
  MOV   A,     R_temp_2
  SBC   A,     R_temp_0
  SZ   Status.0
  JMP   $+5
  MOV   A,     0a0h
  ADDM  A,     R_temp_3
  MOV   A,     05h
  ADCM  A,     R_temp_2
  RET
Sub_timer_l   ENDP
;计算右定时器时间到零点时的分钟数
Sub_timer_r   PROC
  MOV   A,     R_timer_hour_r
  MOV   R_temp_4,   A
  MOV   A,     R_timer_minute_r
  MOV   R_temp_3,   A
  MOV   R_temp_2,   A
  SNZ   R_temp_4.4
  JMP   $+4
  CLR   R_temp_4.4
  MOV   A,     0ah
  ADDM  A,     R_temp_4
  
  SWAP  R_temp_2
  MOV   A,     0fh
  ANDM  A,     R_temp_2
  SZ   Status.2
  JMP   L_timer_on_r_4
  ANDM  A,     R_temp_3
L_timer_on_r_3:  
  MOV   A,     0ah
  ADDM  A,     R_temp_3
  SDZ   R_temp_2
  JMP   L_timer_on_r_3
  CLR   R_temp_2
L_timer_on_r_4:
  MOV   A,     R_timer_hour_r
  SUB   A,     12h
  SNZ   Status.2
  JMP   L_timer_on_r_0
  SNZ   R_flag_2.0
  JMP   L_timer_on_r_2
  JMP   L_timer_on_r_1
L_timer_on_r_0:
  MOV   A,     3ch
  ADDM  A,     R_temp_3
  CLR   Acc
  ADCM  A,     R_temp_2
  SDZ   R_temp_4
  JMP   L_timer_on_r_0
L_timer_on_r_1:
  SNZ   R_flag_2.0
  JMP   $+5
  MOV   A,     0d0h
  ADDM  A,     R_temp_3
  MOV   A,     02h
  ADCM  A,     R_temp_2
L_timer_on_r_2:
  MOV   A,     R_temp_3
  SUB   A,     R_temp_1
  MOV   A,     R_temp_2
  SBC   A,     R_temp_0
  SZ   Status.0
  JMP   $+5
  MOV   A,     0a0h
  ADDM  A,     R_temp_3
  MOV   A,     05h
  ADCM  A,     R_temp_2
  RET
Sub_timer_r   ENDP
;判断定时时间是否已到
Sub_timer_already PROC
  SZ   R_flag_1.2
  RET
  SZ   R_flag_1.4
  JMP   L_timer_already_0
  SZ   R_flag_1.3
  JMP   L_timer_already_0
  SNZ   R_flag_2.4
  JMP   L_timer_already_0
  CALL  Sub_timer
  CALL  Sub_timer_l
  MOV   A,     R_temp_3
  SUBM  A,     R_temp_1
  MOV   A,     R_temp_2
  SBCM  A,     R_temp_0
  SZ   R_temp_0
  JMP   L_timer_already_0
  SZ   R_select_l.0
  MOV   A,     2dh
  SZ   R_select_l.1
  MOV   A,     5ah
  SUB   A,     R_temp_1
  SNZ   Status.2
  JMP   L_timer_already_0
  SET   R_flag_1.3
  CLR   R_flag_2.4
L_timer_already_0:
  SZ   R_flag_1.6
  RET
  SZ   R_flag_2.1
  RET
  SNZ   R_flag_2.5
  RET
  CALL  Sub_timer
  CALL  Sub_timer_r
  MOV   A,     R_temp_3
  SUBM  A,     R_temp_1
  MOV   A,     R_temp_2
  SBCM  A,     R_temp_0
  SZ   R_temp_0
  RET
  MOV   A,     78h
  SUB   A,     R_temp_1
  SNZ   Status.2
  RET
  SET   R_flag_2.1
  CLR   R_flag_2.5
  RET
Sub_timer_already ENDP
;A/D转换子程序
Sub_ad_convert  PROC
  SZ   ADCR.6
  RET
  MOV   A,     ADRH
  MOV   R_temp_1,   A
  MOV   A,     ADRL
  MOV   R_temp_0,   A
  MOV   A,     06h
L_ad_0:
  RRC   R_temp_1
  RRC   R_temp_0
  SDZ   Acc
  JMP   L_ad_0
  MOV   A,     03h
  ANDM  A,     R_temp_1
  SNZ   R_analog_select.0
  JMP   L_ad_1
  MOV   A,     R_temp_1
  MOV   R_ad0_data_1,  A
  MOV   A,     R_temp_0
  MOV   R_ad0_data_0,  A
  JMP   L_ad_4
L_ad_1:
  SNZ   R_analog_select.1
  JMP   L_ad_2
  MOV   A,     R_temp_1
  MOV   R_ad1_data_1,  A
  MOV   A,     R_temp_0
  MOV   R_ad1_data_0,  A
  JMP   L_ad_4
L_ad_2:
  SNZ   R_analog_select.2
  JMP   L_ad_3
  MOV   A,     R_temp_1
  MOV   R_ad2_data_1,  A
  MOV   A,     R_temp_0
  MOV   R_ad2_data_0,  A
  JMP   L_ad_4  
L_ad_3:
  SNZ   R_analog_select.3
  JMP   L_ad_4
  MOV   A,     R_temp_1
  MOV   R_ad3_data_1,  A
  MOV   A,     R_temp_0
  MOV   R_ad3_data_0,  A
L_ad_4:
  SET   ADCR.7
  RL   R_analog_select
  SNZ   R_analog_select.4
  JMP   $+3
  CLR   R_analog_select
  INC   R_analog_select
  INC   ADCR
  SNZ   ADCR.2
  JMP   $+3
  MOV   A,     0f8h
  ANDM  A,     ADCR
  CLR   ADCR.7
  RET
Sub_ad_convert  ENDP
;睡眠子程序
Sub_sleep   PROC
  SNZ   R_flag_0.6
  RET
  CLR   R_lcd_data_0
  CLR   R_lcd_data_1
  CLR   R_lcd_data_2
  CLR   R_lcd_data_3
  CALL  Sub_lcd_display
L_sleep_0:
  CLR   WDT
  MOV   A,     R_time_1
  SUB   A,     7eh
  SNZ   Status.2
  JMP   L_sleep_0
  MOV   A,     0fah
  MOV   R_time_1,   A
  CLR   R_curr_high
  CLR   R_curr_low
  CLR   INTC0.0
  CLR   TMRC.4
  CLR   R_flag_1.2
  CLR   R_flag_1.4
  CLR   R_flag_1.6
;CLR TIMER
  MOV   A,     81h
  MOV   R_temp_1,   A
  MOV   A,     80h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;LCD Off
  MOV   A,     80h
  MOV   R_temp_1,   A
  MOV   A,     40h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;IRQ enable
  MOV   A,     91h
  MOV   R_temp_1,   A
  MOV   A,     00h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;处理IO口
  CLR   PC
  SET   PC.4
  SET   PD
  CLR   ADCR.5
  CLR   PBC
  CLR   PB
  SET   PB.6
  SET   PAC
;  SET   PAC.6
;  SET   PAC.7
;  MOV   A,     3fh
;  ORM   A,     PA
L_sleep_1:
  HALT
  SDZ   R_time_2
  JMP   L_time_ret_0
;500毫秒
  MOV   A,     02h
  MOV   R_time_2,   A
  MOV   A,     02h
  XORM  A,     R_flag_1
  SDZ   R_time_3
  JMP   L_time_ret
;1分
  MOV   A,     78h
  MOV   R_time_3,   A
  INC   R_minute
  MOV   A,     R_minute
  AND   A,     0fh
  SUB   A,     0ah
  SZ   Acc
  JMP   L_time_ret
  MOV   A,     10h
  ADDM  A,     R_minute
  MOV   A,     0f0h
  ANDM  A,     R_minute
  MOV   A,     R_minute
  SUB   A,     60h
  SZ   Acc
  JMP   L_time_ret
  CLR   R_minute
  INC   R_hour
  MOV   A,     R_hour
  SUB   A,     0ah
  SZ   Acc
  JMP   L_sleep_hour_0
  MOV   A,     10h
  MOV   R_hour,    A
  JMP   L_time_ret
L_sleep_hour_0:
  MOV   A,     R_hour
  SUB   A,     12h
  SZ   Acc
  JMP   L_sleep_hour_1
  MOV   A,     20h
  XORM  A,     R_flag_0
L_sleep_hour_1:
  MOV   A,     R_hour
  SUB   A,     13h
  SZ   Acc
  JMP   L_time_ret
  MOV   A,     01h
  MOV   R_hour,    A
L_time_ret:
;  CALL  Sub_lcd_enable
;  CLR   R_lcd_data_0.0
;  CLR   R_lcd_data_1.0
;  CLR   R_lcd_data_1.1
;  CLR   R_lcd_data_2.0
;  CLR   R_lcd_data_3.0
;  CLR   R_lcd_data_3.1
;  CLR   R_lcd_data_3.7
;  CALL  Sub_lcd_display
;  SET   PD
;  SET   PC.4
  CALL  Sub_timer_already
L_time_ret_0:
  MOV   A,     PA
  SZ   Acc.6
  JMP   L_sleep_1
L_wake:
  MOV   A,     0ch
  MOV   R_start_time,  A
  CLR   PAC.7
  CLR   PAC.6
  CLR   R_flag_0.6
  SET   PC
  SET   PBC.7
  SET   INTC0.0
  SET   TMRC.4
  SET   ADCR.5
;IRQ disable
  MOV   A,     90h
  MOV   R_temp_1,   A
  MOV   A,     00h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
;LCD On
  MOV   A,     80h
  MOV   R_temp_1,   A
  MOV   A,     60h
  MOV   R_temp_0,   A
  MOV   A,     0ch
  MOV   R_temp_2,   A
  CALL  Sub_lcd_write
  RET
Sub_sleep   ENDP
;左锅驱动加热器子程序
Sub_driver_l  PROC
  SZ   R_driver_l_time
  RET
  MOV   A,     04h
  MOV   R_driver_l_time, A
  SZ   R_flag_1.3
  JMP   $+9
  CLR   PB.5
  SET   PC.0
  SET   PC.1
  CLR   R_flag_3.0
  CLR   R_flag_3.2
  CLR   R_flag_3.3
  CLR   R_flag_2.6
  RET
  SNZ   R_flag_3.5
  CLR   PC.1
  SZ   R_flag_3.5
  SET   PC.1
  SNZ   R_flag_3.0
  JMP   L_driver_l_0
  MOV   A,     3dh
   SUB   A,     R_ad0_data_0
  MOV   A,     02h
  SBC   A,     R_ad0_data_1
  SNZ   Status.0
  JMP   $+4
  CLR   PC.0
  SET   PB.5
  RET
  MOV   A,     40h
   SUB   A,     R_ad0_data_0
  MOV   A,     02h
  SBC   A,     R_ad0_data_1
  SZ   Status.0
  RET
  SET   PC.0
  CLR   PB.5
  RET
L_driver_l_0:
  SZ   R_select_l.0
  JMP   L_zhufan
  SZ   R_select_l.1
  JM