Device 16F627 CONFIG HS_OSC , WDT_OFF , PWRTE_ON , BODEN_ON , LVP_OFF , MCLRE_ON , CP_OFF XTAL = 20 PORTB_PULLUPS = ON DECLARE SDA_PIN PORTA.0 DECLARE SCL_PIN PORTA.1 SYMBOL SENSOR = PORTA.2 SYMBOL BUZZER = PORTA.3 SYMBOL AUX = PORTA.4 SYMBOL DATAOUT = PORTB.0 SYMBOL BLANK = PORTB.1 SYMBOL LOAD = PORTB.2 SYMBOL FILAMENT = PORTB.3 SYMBOL CLOCK = PORTB.4 SYMBOL DOWN_BUTTON = PORTB.5 SYMBOL MENU_BUTTON = PORTB.6 SYMBOL UP_BUTTON = PORTB.7 SECOND VAR BYTE MINUTE VAR BYTE HOUR VAR BYTE DAY VAR BYTE DATE VAR BYTE MONTH VAR BYTE YEAR VAR BYTE TEMP VAR BYTE TEMP1 VAR BYTE TEMP2 VAR WORD TEMP3 VAR BYTE TEMP4 VAR BYTE TEMP5 VAR BYTE TEMP7 VAR BYTE X VAR BYTE Y VAR BYTE BCD_NUM VAR BYTE ADDRESS VAR BYTE DIM SEGMENT [23] AS BYTE DIM POSITION [9] AS WORD DIM TART [9] AS BYTE CMCON = %00000111 ' Set analogue input on PORTA.0 & other in digital TRISA = %00000100 TRISB = %11100000 ' CCP1 (PortC.2 = Output)B.3 PR2 = 130 ' Set PWM Period for approXimately 200KHz 24/15 38KHZ 130/33 CCPR1L = 60 ' Set PWM Duty-Cycly 100%=25(egyenfesz) 80%=20=4+1uS 60%=15=3+2uS 40%=10=2+3uS 20%=5=1+4uS 0%=0V CCP1CON = %00001100 ' Mode select = PWM T2CON = %00000100 ' Timer2 ON + 1:1 prescale SEGMENT[00] = %11101110 '0 SEGMENT[01] = %00100100 '1 SEGMENT[02] = %10111010 '2 SEGMENT[03] = %10110110 '3 SEGMENT[04] = %01110100 '4 SEGMENT[05] = %11010110 '5 SEGMENT[06] = %11011110 '6 SEGMENT[07] = %10100100 '7 SEGMENT[08] = %11111110 '8 SEGMENT[09] = %11110110 '9 SEGMENT[10] = %11101111 '0. SEGMENT[11] = %00100101 '1. SEGMENT[12] = %10111011 '2. SEGMENT[13] = %10110111 '3. SEGMENT[14] = %01110101 '4. SEGMENT[15] = %11010111 '5. SEGMENT[16] = %11011111 '6. SEGMENT[17] = %10100101 '7. SEGMENT[18] = %11111111 '8. SEGMENT[19] = %11110111 '9. SEGMENT[20] = %00010000 '- SEGMENT[21] = %00000001 '. SEGMENT[22] = %00000000 'BLANK 'AFBGECDH POSITION[0] = %0000000000000010 POSITION[1] = %0000000000000100 POSITION[2] = %0000000001000000 POSITION[3] = %0000000010000000 POSITION[4] = %0000000000001000 POSITION[5] = %0000000100000000 POSITION[6] = %0000000000100000 POSITION[7] = %0000001000000000 POSITION[8] = %0000000000010000 'XXXXXX753268410X X = 0 BUSOUT $9E,$AC,[$45] '00000101 osc:00, al:00, 0 , cnv:1, pol:0, 1sh:1 MAIN: GOSUB DS1629 GOSUB TIMEP IF DOWN_BUTTON = 0 THEN GOSUB DATEP IF MENU_BUTTON = 0 THEN GOSUB SETT IF UP_BUTTON = 0 THEN GOSUB DATEP IF SENSOR = 0 THEN GOSUB DATEP GOSUB KIIR GOTO MAIN KIIR: Y = TART[X] 'DE CSAK EGY KARAKTERT LOW LOAD LOW BLANK TEMP1 = 10 LOOP1: TEMP2 = POSITION[X] LOW CLOCK DATAOUT = GETBIT TEMP2 , TEMP1-1 HIGH CLOCK DEC TEMP1 IF TEMP1 <> 0 THEN GOTO LOOP1 TEMP1 = 8 LOOP2: TEMP2 = SEGMENT[Y] LOW CLOCK DATAOUT = GETBIT TEMP2 , TEMP1-1 HIGH CLOCK DEC TEMP1 IF TEMP1 <> 0 THEN GOTO LOOP2 LOW CLOCK DATAOUT = 0 HIGH CLOCK HIGH LOAD GOSUB XXX RETURN BCD_SET:BUSOUT $9E,$C0,[ADDRESS,BCD_NUM] RETURN BCDDEC: BCD_NUM = (((BCD_NUM & $F0) >> $04) * $0A) + (BCD_NUM & $0F) 'BCD2DEC CONVERSION RETURN DECBCD: BCD_NUM = TEMP3 BCD_NUM = ((BCD_NUM / $0A) << $04) + (BCD_NUM // $0A) 'DEC2BCD CONVERSION GOSUB BCD_SET GOSUB BEEP RETURN DS1629: BUSOUT $9E,$C0,[$00] BUSIN $9F,[SECOND,MINUTE,HOUR,DAY,DATE,MONTH,YEAR] BCD_NUM = YEAR 'YEAR IS BCD NUMBER GOSUB BCDDEC 'CONVERT YEAR = BCD_NUM 'YEAR IS DECIMAL NUMBER BCD_NUM = MONTH GOSUB BCDDEC MONTH = BCD_NUM BCD_NUM = DATE GOSUB BCDDEC DATE = BCD_NUM BCD_NUM = HOUR GOSUB BCDDEC HOUR = BCD_NUM BCD_NUM = MINUTE GOSUB BCDDEC MINUTE = BCD_NUM BCD_NUM = SECOND GOSUB BCDDEC SECOND = BCD_NUM IF DAY = 7 AND DATE >= 25 AND DATE <= 31 THEN IF HOUR = 2 AND MINUTE = 0 AND SECOND = 0 THEN IF MONTH = 3 THEN BCD_NUM = 1 GOSUB BCD_SET ENDIF IF MONTH = 10 THEN BCD_NUM = 3 GOSUB BCD_SET ENDIF ENDIF ENDIF RETURN BEEP: PWM BUZZER,127,130 RETURN TIMEP: TART[0] = 22 TART[1] = HOUR / 10 TART[2] = HOUR // 10 TART[3] = 20 TART[4] = MINUTE / 10 TART[5] = MINUTE // 10 TART[6] = 20 TART[7] = SECOND / 10 TART[8] = SECOND // 10 RETURN DATEP: TART[0] = 22 TART[1] = 2 TART[2] = 0 TART[3] = YEAR / 10 TART[4] = (YEAR // 10) + 10 TART[5] = MONTH / 10 TART[6] = (MONTH // 10) + 10 TART[7] = DATE / 10 TART[8] = (DATE // 10) + 10 RETURN DAYP: TART[0] = 22 TART[1] = 22 TART[2] = 22 TART[3] = 22 TART[4] = 22 TART[5] = 22 TART[6] = 22 TART[7] = 22 TART[8] = DAY RETURN SETT: TEMP = 1 GOSUB BEEP SET1: IF TEMP7 = 1 THEN GOSUB TIMEP IF TEMP7 = 2 THEN GOSUB DATEP IF TEMP7 = 3 THEN GOSUB DAYP TART[0] = 21 GOSUB DS1629 GOSUB PARAM GOSUB KIIR IF DOWN_BUTTON = 0 THEN IF TEMP3 > TEMP4 THEN DEC TEMP3 GOSUB DECBCD ENDIF IF UP_BUTTON = 0 THEN IF TEMP3 < TEMP5 THEN INC TEMP3 GOSUB DECBCD ENDIF IF MENU_BUTTON = 0 THEN GOSUB BEEP INC TEMP IF TEMP = 8 THEN GOTO MAIN ENDIF ENDIF GOSUB XXX GOTO SET1 PARAM: SELECT TEMP CASE 1 ADDRESS = $02 TEMP3 = HOUR TEMP4 = 0 TEMP5 = 23 TEMP7 = 1 CASE 2 ADDRESS = $01 TEMP3= MINUTE TEMP4 = 0 TEMP5 = 59 TEMP7 = 1 CASE 3 ADDRESS = $00 TEMP3 = SECOND TEMP4 = 0 TEMP5 = 59 TEMP7 = 1 CASE 4 ADDRESS = $06 TEMP3 = YEAR TEMP4 = 0 TEMP5 = 99 TEMP7 = 2 CASE 5 ADDRESS = $05 TEMP3 = MONTH TEMP4 = 1 TEMP5 = 12 TEMP7 = 2 CASE 6 ADDRESS = $04 TEMP3 = DATE TEMP4 = 1 TEMP5 = 31 TEMP7 = 2 CASE 7 ADDRESS = $03 TEMP3 = DAY TEMP4 = 1 TEMP5 = 7 TEMP7 = 3 ENDSELECT RETURN XXX: INC X 'CSAK MERT 3 BYTE SPOROLÁS IF X >= 9 THEN X = 0 RETURN