'**************************************************************** '* Name : Drencher.pbp * '* Author : holyuser * '* Date : 04.8.2007 г. * '* Version : 1.0 * '* Notes : PIC16LF819 * '**************************************************************** ' ' Свързване на LCD: ' LCD PIC ' DB4 PortB.0 ' DB5 PortB.1 ' DB6 PortB.2 ' DB7 PortB.3 ' RS PortB.5 ' EN PortB.4 ' RW GND ' Vdd +5V ' Vss GND ' Vo 25K тример ' DB0-3 свободни DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 0 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 5 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 4 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 ' DEFINE NO_CLRWDT 1 Define OSC 4 'системни променливи: wsave var byte $20 system wsave1 var byte $a0 system wsave2 var byte $120 system ssave var byte bank0 system psave var byte bank0 system asave var byte bank0 system csave var byte bank0 system 'потребителски променливи: seconds var byte bank0 minutes var byte bank0 hours var byte bank0 mode var byte wakehour var byte wakemin var byte wrktime var byte myflags var byte delay var byte anybutton var byte tmleft var byte bank0 press var myflags.0 j var word 'константи: timeout con 4 data 12,1,30 goto init define INTHAND refresh '************************************************** asm refresh ; Съхраняване на контекста movwf wsave swapf STATUS,W clrf STATUS movwf ssave movf PCLATH,W movwf psave ; Обновяване на часа bsf TMR1H,7 incf _seconds,F movlw 60 xorwf _seconds,W btfss STATUS.Z goto exit clrf _seconds incf _minutes movlw 60 xorwf _minutes,W btfss STATUS.Z goto exit clrf _minutes incf _hours movlw 24 xorwf _hours,W btfsc STATUS.Z clrf _hours exit decf _tmleft bcf PIR1,TMR1IF ; Възстановяване на контекста movf psave,W movwf PCLATH swapf ssave,W movwf STATUS swapf wsave,F swapf wsave,W retfie endasm '************************************************** ' Начално установяване: '************************************************** init: clear OSCCON = %01100000 ' 4 MHz системен такт - INTIO2 porta = 0 : TRISA = %10111111 portb = 0 : TRISB = %11000000 OPTION_REG = %11010100 'период на TMR0 - 8,192 ms T1CON = %00001110 ' База - 32768 Hz от T1OSC CCP1CON = %00000000 ' CCP/PWM - изключен INTCON = %01000000 PIR1 = %00000000 PIE1 = %00000001 ' Разрешено прекъсване от TMR1 ADCON0 = %00000000 ' ADC - изключен ADCON1 = %00000111 seconds = 0 minutes = 0 hours = 12 read 0,wakehour read 1,wakemin read 2,wrktime delay = timeout pause 1000 lcdout $FE,1 ' CLS, HOME lcdout $FE,128," Drench Timer ",_ $FE,192," V 1.0 " pause 2000 TMR1H = $80 ' TMR1 = 32768 TMR1L = 0 T1CON.0 = 1 ' Старт на TMR1 INTCON.7 = 1 ' Всички прекъсвания разрешени TMR0 = 0 goto begin '************************************************** ' Подпрограми: '************************************************** clock: 'показва часовник lcdout $FE,128,dec2 hours,":",dec2 minutes,":",dec2 seconds return wait_: 'изчаква препълване на TMR0 if INTCON.2 = 0 then wait_ INTCON.2 = 0 return modeselect: 'превкл. на режима mode = mode + 1 if mode = 6 then mode = 0 endif return pwrdoun: 'отпадане на захранването TRISA = %11111111 TRISB = %11111111 sleep_: @ sleep @ nop if porta.0 = 0 then sleep_ porta = 0 : TRISA = %10111111 portb = 0 : TRISB = %11000000 for j = 0 to 1000 if porta.0 = 0 then j = 0 : goto pwrdoun endif pause 1 next j portb = %00000011 high portb.4 : low portb.4 pause 5 portb = %00000010 high portb.4 : low portb.4 lcdout $EF,40 : lcdout $FE,8 : lcdout $FE,12 lcdout $FE,6 : lcdout $FE,1 gosub lcdinit tmleft = 0 return lcdinit: 'възст. маската на дисплея lcdout $FE,136," <",dec2 wakehour,":",dec2 wakemin,">",_ $FE,192,"On duty <",dec3 wrktime,">s" return '************************************************** ' Основен цикъл: '************************************************** begin: '**************** нормална работа ***************** gosub lcdinit while mode = 0 gosub clock if (hours = wakehour) and (minutes = wakemin) then if seconds = 0 then high porta.6 tmleft = wrktime while tmleft > 0 gosub clock lcdout $FE,192,"Drench... <",dec3 tmleft,">s" gosub wait_ if porta.1 = 0 then tmleft = 0 endif if porta.0 = 0 then gosub pwrdoun wend low porta.6 lcdout $FE,192,"On duty <",dec3 wrktime endif endif if porta.0 = 0 then pause 100 if porta.0 = 0 then gosub pwrdoun endif anybutton = porta & %00111000 select case anybutton case %00101000 'следващ if delay = 0 then if press = 0 then gosub modeselect press = 1 endif else delay = delay - 1 endif case %00110000 'включи if delay = 0 then if press = 0 then high porta.6 press = 1 endif else delay = delay - 1 endif case %00011000 'изключи if delay = 0 then if press = 0 then low porta.6 press = 1 endif else delay = delay - 1 endif case %00111000 'няма натиснат бутон press = 0 delay = timeout end select gosub wait_ wend '**************** сверяване часове **************** INTCON.7 = 0 'спира часовника lcdout $FE,192,"Adj.hour " while mode = 1 anybutton = porta & %00111000 select case anybutton case %00101000 'следващ if delay = 0 then if press = 0 then gosub modeselect press = 1 endif else delay = delay - 1 endif case %00110000 'увеличи if delay = 0 then if press = 0 then hours = hours + 1 if hours = 24 then hours = 0 endif press = 1 endif else delay = delay - 1 endif case %00011000 'намали if delay = 0 then if press = 0 then hours = hours - 1 if hours = 255 then hours = 23 endif press = 1 endif else delay = delay - 1 endif case %00111000 'няма натиснат бутон press = 0 delay = timeout end select gosub clock gosub wait_ wend '**************** сверяване минути **************** lcdout $FE,192,"Adj.min " while mode = 2 anybutton = porta & %00111000 select case anybutton case %00101000 'следващ if delay = 0 then if press = 0 then gosub modeselect press = 1 endif else delay = delay - 1 endif case %00110000 'увеличи if delay = 0 then if press = 0 then minutes = minutes + 1 if minutes = 60 then minutes = 0 endif press = 1 endif else delay = delay - 1 endif case %00011000 'намали if delay = 0 then if press = 0 then minutes = minutes - 1 if minutes = 255 then minutes = 59 endif press = 1 endif else delay = delay - 1 endif case %00111000 'няма натиснат бутон press = 0 delay = timeout end select gosub clock gosub wait_ wend seconds = 0 INTCON.7 = 1 'пуска часовника '*********** настройка час на включване *********** lcdout $FE,192,"Set Dhour " while mode = 3 anybutton = porta & %00111000 select case anybutton case %00101000 'следващ if delay = 0 then if press = 0 then gosub modeselect press = 1 endif else delay = delay - 1 endif case %00110000 'увеличи if delay = 0 then if press = 0 then wakehour = wakehour + 1 if wakehour = 24 then wakehour = 0 endif press = 1 endif else delay = delay - 1 endif case %00011000 'намали if delay = 0 then if press = 0 then wakehour = wakehour - 1 if wakehour = 255 then wakehour = 23 endif press = 1 endif else delay = delay - 1 endif case %00111000 'няма натиснат бутон press = 0 delay = timeout end select gosub clock lcdout $FE,138,dec2 wakehour gosub wait_ wend INTCON.7 = 0 write 0,wakehour 'запис в EEPROM INTCON.7 = 1 '********* настройка минута на включване ********** lcdout $FE,192,"Set Dmin " while mode = 4 anybutton = porta & %00111000 select case anybutton case %00101000 'следващ if delay = 0 then if press = 0 then gosub modeselect press = 1 endif else delay = delay - 1 endif case %00110000 'увеличи if delay = 0 then if press = 0 then wakemin = wakemin + 1 if wakemin = 60 then wakemin = 0 endif press = 1 endif else delay = delay - 1 endif case %00011000 'намали if delay = 0 then if press = 0 then wakemin = wakemin - 1 if wakemin = 255 then wakemin = 59 endif press = 1 endif else delay = delay - 1 endif case %00111000 'няма натиснат бутон press = 0 delay = timeout end select gosub clock lcdout $FE,141,dec2 wakemin gosub wait_ wend INTCON.7 = 0 write 1,wakemin 'запис в EEPROM INTCON.7 = 1 '****** настройка продължителност на работа ******* lcdout $FE,192,"Set Drench" while mode = 5 anybutton = porta & %00111000 select case anybutton case %00101000 'следващ if delay = 0 then if press = 0 then gosub modeselect press = 1 endif else delay = delay - 1 endif case %00110000 'увеличи if delay = 0 then if press = 0 then wrktime = wrktime + 1 if wrktime > 240 then wrktime = 240 endif press = 1 endif else delay = delay - 1 endif case %00011000 'намали if delay = 0 then if press = 0 then wrktime = wrktime - 1 if wrktime < 5 then wrktime = 5 endif press = 1 endif else delay = delay - 1 endif case %00111000 'няма натиснат бутон press = 0 delay = timeout end select gosub clock lcdout $FE,203,dec3 wrktime gosub wait_ wend INTCON.7 = 0 write 2,wrktime 'запис в EEPROM INTCON.7 = 1 goto begin '************************************************** ' Край, преход към началото на осн. цикъл '************************************************** end