'************************************************* ' audio timer PIC16F876A Ver1.0 '************************************************* DEFINE OSC 12 ADCON1 =%00000110 'ALL BITS digtal mode TRISA =%00000000 TRISC =%00000000 ms var word :ms=0 ss var byte :ss=0 mm var byte :mm=0 hh var byte :hh=0 dyn var byte ss_d var byte mm_d var byte hh_d var byte on_mm var byte :on_mm=30 on_hh var byte :on_hh=12 off_mm var byte :off_mm=30 off_hh var byte :off_hh=12 sleep_counter var word 'sec sleep_counter=0 LED var byte[4] LED_ZERO var byte refr var ms.7 ' 0.04sec kakikae refr_flg var bit key var byte key_old var byte key_old2 var byte key_flg var bit :key_flg=0 LED1 var porta.5 LED2 var porta.4 h_m var key.7 h_up var key.6 h_down var key.5 m_up var key.4 m_down var key.3 timer_b var key.2 sleep_b var key.1 power_b var key.0 timer_LED var porta.0 :timer_LED=0 sleep_LED var porta.1 :sleep_LED=0 power_LED var porta.2 :power_LED=0 'power_sw var porta.3 :power_sw=0 flg_sec var bit :flg_sec=0 flg_h_m var byte :flg_h_m=0 flg_timer var bit :flg_timer=0 flg_sleep var bit :flg_sleep=0 flg_power var bit :flg_power=0 flg_x var bit flg_y var bit flg_z var byte @'76543210 OPTION_REG =%01010001 ' 12.8 /4 /4 /256 ->3125 INTCON =%10100000 ON interrupt goto timerup loop: '------------------------------------------------------------- '******************************* ' key scan '******************************* key=portb if key=key_old then goto jump while key=key_old key=portb wend key_old2=key '******** hh ss *************** if h_m =0 then flg_h_m=flg_h_m+1 if flg_h_m>5 then flg_h_m=0 endif '*********** timer ************ if timer_b=0 then gosub timer_routine '*********** sleep ************ if sleep_b=0 then gosub sleep_routine if power_b=0 then flg_power=NOT flg_power '****************************** 'time adjust '****************************** if flg_h_m=5 then if h_up=0 then hh=hh+1 :ss=0 :ms=0 if hh>=24 then hh=0 if h_down=0 then hh=hh-1 :ss=0 :ms=0 if hh>=24 then hh=23 if m_up=0 then mm=mm+1 :ss=0 :ms=0 if mm>=60 then mm=0 if m_down=0 then mm=mm-1 :ss=0 :ms=0 if mm>=60 then mm=59 endif jump: key_old=key '****************************** ' display routine '****************************** select case flg_h_m case 0,1 LED1=flg_sec LED2=flg_sec case 2 LED1=flg_sec LED2=NOT flg_sec case 3 LED2=flg_sec LED1=1 case 4 LED2=1 LED1=flg_sec case 5 LED1=0 LED2=0 case else end select '******** time disp ****************** ss_d=ss mm_d =mm hh_d =hh gosub disp_data_set '******** sleep *********************** if sleep_counter=0 and flg_sleep=1 then flg_sleep =0 sleep_LED=0 flg_power=0 endif '******** timer *********************** if flg_timer=1 then if (hh=on_hh ) and (mm=on_mm) then flg_power=1 if (hh=off_hh) and (mm=off_mm) then flg_power=0 endif '******** sw on off ******************* if flg_sleep=1 then sleep_LED=1 else sleep_LED=0 endif if flg_timer=1 then timer_LED=1 else timer_LED=0 endif if flg_power=1 then power_LED=1 else power_LED=0 endif goto loop '------------------------------------------------------- '******************************** ' key input subroutine '******************************** key_input: key=portb if key=key_old2 then key_input while key=key_old2 key=portb wend key_old2=key return '******************************** ' sleep routine '******************************** sleep_routine: if flg_sleep=1 then flg_sleep=0 sleep_LED=0 return endif sleep_counter=5400 '90min default value flg_z=flg_h_m 'bake up flg_h_m flg_h_m=1 mm_d=sleep_counter / 60 ss_d=sleep_counter //60 gosub disp_data_set_2 LED1=0 LED2=0 gosub key_input while sleep_b=1 gosub key_input if h_up=0 then sleep_counter=sleep_counter+600 if h_down=0 then sleep_counter=sleep_counter-600 if m_up=0 then sleep_counter=sleep_counter+60 if m_down=0 then sleep_counter=sleep_counter-60 mm_d=sleep_counter / 60 ss_d=sleep_counter //60 gosub disp_data_set_2 wend flg_h_m=flg_z flg_sleep=1 sleep_LED=1 flg_power=1 return '********************************* ' timer routine '********************************* timer_routine: if flg_timer=1 then flg_timer=0 timer_LED=0 return endif flg_z=flg_h_m 'bake up flg_h_m '*** on *** flg_h_m=3 gosub disp_data_set_2 LED1=1 LED2=0 gosub key_input while timer_b=1 gosub key_input if h_up=0 then on_hh=on_hh+1 if on_hh>=24 then on_hh=0 if h_down=0 then on_hh=on_hh-1 if on_hh>=24 then on_hh=23 if m_up=0 then on_mm=on_mm+1 if on_mm>=60 then on_mm=0 if m_down=0 then on_mm=on_mm-1 if on_mm>=60 then on_mm=59 gosub disp_data_set_2 wend '*** off *** flg_h_m=4 gosub disp_data_set_2 LED1=0 LED2=1 gosub key_input while timer_b=1 gosub key_input if h_up=0 then off_hh=off_hh+1 if off_hh>=24 then off_hh=0 if h_down=0 then off_hh=off_hh-1 if off_hh>=24 then off_hh=23 if m_up=0 then off_mm=off_mm+1 if off_mm>=60 then off_mm=0 if m_down=0 then off_mm=off_mm-1 if off_mm>=60 then off_mm=59 gosub disp_data_set_2 wend flg_h_m=flg_z flg_timer=1 return '********************************* ' disp_data_set subroutine ' ss_d mm_d hh_d flg_h_m '********************************* disp_data_set: '****** refresh late is 24Hz ** if refr=refr_flg then refr_flg= NOT refr_flg else return endif disp_data_set_2: if hh<10 then LED_ZERO=%01110000 + 15 ' zero Suppress else LED_ZERO=%01110000 +(hh_d dig 1) endif select case flg_h_m case 0,5 LED[0]=LED_ZERO LED[1]=%10110000 +(hh_d dig 0) LED[2]=%11010000 +(mm_d dig 1) LED[3]=%11100000 +(mm_d dig 0) case 1 LED[0]=%01110000 +(mm_d dig 1) LED[1]=%10110000 +(mm_d dig 0) LED[2]=%11010000 +(ss_d dig 1) LED[3]=%11100000 +(ss_d dig 0) case 2 mm_d=sleep_counter / 60 ss_d=sleep_counter //60 LED[0]=%01110000 +(mm_d dig 1) LED[1]=%10110000 +(mm_d dig 0) LED[2]=%11010000 +(ss_d dig 1) LED[3]=%11100000 +(ss_d dig 0) case 3 LED[0]=%01110000 +(on_hh dig 1) LED[1]=%10110000 +(on_hh dig 0) LED[2]=%11010000 +(on_mm dig 1) LED[3]=%11100000 +(on_mm dig 0) case 4 LED[0]=%01110000 +(off_hh dig 1) LED[1]=%10110000 +(off_hh dig 0) LED[2]=%11010000 +(off_mm dig 1) LED[3]=%11100000 +(off_mm dig 0) case else end select return disable timerup: '********************************* ms=ms+1 if ms < 3125 then exittimer ss=ss+1 ms=0 flg_sec= NOT flg_sec if flg_sleep=1 then sleep_counter=sleep_counter-1 IF SS >= 60 THEN mm=mm+1: ss=0 IF mm >= 60 THEN hh=hh+1: mm=0 IF hh >= 24 THEN hh=0 '********************************* exittimer: if dyn>3 then dyn=0 portc=LED(dyn) dyn=dyn+1 INTCON.2=0 Resume Enable end