@ device pic16f877 define osc 4 define adc_bits 8 Include "MODEDEFS.bas" DEFINE ADC_SAMPLEUS 100 DEFINE SHIFT_PAUSEUS 100 ADCON1 = 7 TRISA =$ff trisb =$00 '=======output=======' dat vAR portb.0 clk vAR portb.1 latch vAR portb.2 relay VAR portb.3 '======input=========' enter vAR porta.0 chg VAR porta.1 hour var byte minute var byte second var byte prsc1 var byte i var byte num var word num2 var word num3 var word digit var byte unit var byte ten var byte roy var byte phun var byte flg_int var bit disp var byte num1 var byte ref var byte hour = 0 minute = 0 second = 0 prsc1 = 0 disp = 0 num = 0 ref = 0 num1 = 0 high relay Pause 500 start: OPTION_REG = 0 INTCON = 0 if chg = 0 then start start1: gosub set_time gosub display high relay num1 = ref OPTION_REG = 0 INTCON = 0 disable if chg = 1 then start1 loop: gosub int_off if enter = 1 then loop OPTION_REG = $d5 INTCON = $a0 pause 50 On Interrupt Goto int_on main: Goto main Disable int_on: prsc1 = prsc1 + 1 If prsc1 < 61 Then reset_tm0 prsc1 = 0 second = second + 1 If second >= 60 Then second = 0 minute = minute + 1 If minute >= 100 Then minute = 0 hour = hour + 1 If hour >= 24 Then hour = 0 Endif Endif gosub display Endif num2 = ((num1-1)*100)+59 num3 = (minute*100)+second num = num2-num3 gosub time_work gosub display return int_off: OPTION_REG = 0 INTCON = 0 high relay minute = 0 second = 0 num1 = ref num = 11 gosub display1 disable return time_work: if minute >= num1 then OPTION_REG = 0 INTCON = $00 second = 0 minute = 0 num = 0 high relay gosub display resume start pause 100 else low relay gosub display pause 5 endif return reset_tm0: if chg = 0 then OPTION_REG = $00 INTCON = $00 INTCON.2 = 1 num2 = 0 num3 = 0 num = num2 - num3 ref = 0 num1 = ref pause 50 resume start else INTCON.2 = 0 endif Resume end set_time: if chg = 1 and enter = 0 then pause 150 if ref >= 100 then ref = 0 num = ref gosub display pause 100 else ref = ref + 1 num = ref gosub display pause 100 endif endif return display: digit = num dig 0 lookup digit,[$c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90],unit PAUSEUS 5 digit = num dig 1 lookup digit,[$c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90],ten PAUSEUS 5 digit = num dig 2 lookup digit,[$40,$79,$24,$30,$19,$12,$02,$78,$00,$10],roy pauseus 5 digit = num dig 3 lookup digit,[$c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90],phun pauseus 5 IF num <= 9 then ten = $ff roy = $ff phun =$ff ShiftOut dat,clk,1,[unit,ten,roy,phun] else IF num <= 99 then roy = $ff phun =$ff ShiftOut dat,clk,1,[unit,ten,roy,phun] else IF num <= 999 then phun =$ff ShiftOut dat,clk,1,[unit,ten,roy,phun] else ShiftOut dat,clk,1,[unit,ten,roy,phun] endif endif endif Pauseus 10 Low latch Pauseus 10 high latch Return display1: digit = num dig 0 lookup digit,[$ff,$09],unit PAUSEUS 5 digit = num dig 1 lookup digit,[$ff,$C6],ten PAUSEUS 5 digit = num dig 2 lookup digit,[$ff,$09],roy pauseus 5 digit = num dig 3 lookup digit,[$ff,$09],phun pauseus 5 IF num <= 9 then ten = $ff roy = $ff phun =$ff ShiftOut dat,clk,1,[unit,ten,roy,phun] else IF num <= 99 then roy = $ff phun =$ff ShiftOut dat,clk,1,[unit,ten,roy,phun] else IF num <= 999 then phun =$ff ShiftOut dat,clk,1,[unit,ten,roy,phun] else ShiftOut dat,clk,1,[unit,ten,roy,phun] endif endif endif Pauseus 10 Low latch Pauseus 10 high latch Return