$MOD51
;
;===============CONST
;
TIME_PART       EQU      1000; in !!! MICRO !!!-SECONDS
FREQ            EQU      4   ; in !!! MEGA !!!-Hz
TIMER_VALUE     EQU      256*256-(TIME_PART*FREQ/12)
C_TIME_CHECK_KEY EQU     LOW(10000/TIME_PART)
;
BUTTON_UP       EQU     1
BUTTON_DOWN     EQU     2
ANOD1           BIT     P1.7
ANOD2           BIT     P3.7
SEG_PORT        EQU     P1
TRIAC           BIT     P3.2
;
;
;===============RAM LOCATIONS
;
_R0             DATA      0
_R1             DATA     _R0 +1
_R2             DATA     _R0 +2
_R3             DATA     _R0 +3
_R4             DATA     _R0 +4
_R5             DATA     _R0 +5
_R6             DATA     _R0 +6
;
FLAGS           DATA     20h
;
CurrentAnod     DATA     30H
VisibleInd      DATA     CurrentAnod    +1
Indikator_1     DATA     VisibleInd     +1
Indikator_2     DATA     Indikator_1    +1
ACTIVE_KEY      DATA     Indikator_2    +1
CURRENT_TIME    DATA     ACTIVE_KEY     +1
WAIT_KEY        DATA     CURRENT_TIME   +1
OLD_KEY         DATA     WAIT_KEY       +1
TIME_CHECK_KEY  DATA     OLD_KEY        +1
POWER_VAL       DATA     TIME_CHECK_KEY +1
RELOAD_CNTUP    DATA     POWER_VAL      +1
RELOAD_CNTDOWN  DATA     RELOAD_CNTUP   +1
CNTUP           DATA     RELOAD_CNTDOWN +1
CNTDOWN         DATA     CNTUP          +1
TIME1           DATA     CNTDOWN        +1
TIME2           DATA     TIME1          +1
;
;==============BIT DEFINITIONS
;
KEY_FLAG        BIT     FLAGS.0
ANOD            BIT     FLAGS.1
DUTY            BIT     FLAGS.2
REPEAT          BIT     FLAGS.3
;
;===================MACROS======================
;
TIME            MACRO   _TIME
        MOV     A,_TIME
;        ACALL   DELAY_TIME
                ENDM
;
;===================INTERUPTS======================
        ORG     0
        SJMP    START   ;RESET
;
        ORG     0Bh
        AJMP    TIMER_0 ;TIMER0
;
START:  CLR     EA
        MOV     SP,#7
        MOV     TL0,#LOW(TIMER_VALUE)
        MOV     TH0,#HIGH(TIMER_VALUE)
        MOV     TMOD,#1         ;TIMER0 (16 _bit count)
        SETB    TR0
        SETB    ET0
        SETB    EA
        SETB    KEY_FLAG
        MOV     TIME_CHECK_KEY,#C_TIME_CHECK_KEY
        MOV     POWER_VAL,#50
        MOV     RELOAD_CNTUP,#50
        MOV     RELOAD_CNTDOWN,#50
        MOV     CNTUP,#50
        MOV     CNTDOWN,#50
        MOV     INDIKATOR_1,#5
        MOV     INDIKATOR_2,#0
        SETB    ANOD
        CLR     DUTY
        CLR     TRIAC
;----------------------------------------------------------------------------
PROGRAM:
;        AJMP    PROGRAM
        MOV     A,ACTIVE_KEY
        CJNE    A,#BUTTON_UP,IS_B_2
        MOV     ACTIVE_KEY,#0
        INC     POWER_VAL
        MOV     A,POWER_VAL
        CJNE    A,#100,NOT_REL
        MOV     POWER_VAL,#0
NOT_REL:
        MOV     A,POWER_VAL
        MOV     B,#10
        DIV     AB
        MOV     INDIKATOR_1,A
        MOV     A,B
        MOV     INDIKATOR_2,A
        MOV     RELOAD_CNTUP,POWER_VAL
        INC     RELOAD_CNTUP
        MOV     A,#101
        CLR     C
        SUBB    A,RELOAD_CNTUP
        MOV     RELOAD_CNTDOWN,A
        SJMP    PROGRAM
IS_B_2:
        CJNE    A,#BUTTON_DOWN,NOT_B_2
        MOV     ACTIVE_KEY,#0
        DEC     POWER_VAL
        MOV     A,POWER_VAL
        CJNE    A,#255,NOT_REL1
        MOV     POWER_VAL,#99
NOT_REL1:
        MOV     A,POWER_VAL
        MOV     B,#10
        DIV     AB
        MOV     INDIKATOR_1,A
        MOV     A,B
        MOV     INDIKATOR_2,A
        MOV     RELOAD_CNTUP,POWER_VAL
        INC     RELOAD_CNTUP
        MOV     A,#101
        CLR     C
        SUBB    A,RELOAD_CNTUP
        MOV     RELOAD_CNTDOWN,A
NOT_B_2:
        AJMP    PROGRAM
;
;==================================INTERRUPT================================
;
TIMER_0:
        MOV     TL0,#LOW(TIMER_VALUE)
        MOV     TH0,#HIGH(TIMER_VALUE)
        PUSH    Acc
        PUSH    PSW
        PUSH    DPL
        PUSH    DPH
        PUSH    _R0
;
        MOV     A,VisibleInd
        DEC     A
        ADD     A,#Indikator_1
        MOV     R0,A
        MOV     A,@R0
        MOV     DPTR,#ASCII
        MOVC    A,@A+DPTR
        MOV     SEG_PORT,#11111111B
        SETB    ANOD1
        SETB    ANOD2
        MOV     SEG_PORT,A
        JNB     ANOD,IS_2
        CLR     ANOD1
        CLR     ANOD
        SJMP    IS_1
IS_2:   CLR     ANOD2
        SETB    ANOD
IS_1:
        DJNZ    VisibleInd,GO_KEY
        MOV     VisibleInd,#2
GO_KEY:
        DJNZ    TIME_CHECK_KEY,KEY_EXIT         ;\
        MOV     TIME_CHECK_KEY,#C_TIME_CHECK_KEY;  \
        JB      DUTY,_DOWN
        DJNZ    CNTUP,_EX
        MOV     CNTUP,RELOAD_CNTUP
        SETB    DUTY
        SETB    TRIAC
        SJMP    _EX
_DOWN:  DJNZ    CNTDOWN,_EX
        MOV     CNTDOWN,RELOAD_CNTDOWN
        CLR     DUTY
        CLR     TRIAC
_EX:
        DEC     CURRENT_TIME                    ;    \
        MOV     A,P3                            ;      \
        CPL     A                               ;       |
        ANL     A,#00110000b                    ;       |
        JNZ     N1                              ;       |
        CLR     KEY_FLAG                        ;  /
        SJMP    KEY_EXIT                        ;       |
N1:
        SWAP    A
        JB      KEY_FLAG,KEY_EX                 ;       |
        MOV     R0,#3                           ;       |
NO_KEY:                                         ;       |
        RRC     A                               ;       |
        DJNZ    R0,GOTO_CARY                    ;       |
        SJMP    KEY_EXIT                        ;       |
GOTO_CARY:
        JNC     NO_KEY                          ;       |
        SETB    KEY_FLAG                        ;       |
        MOV     ACTIVE_KEY,R0                   ;       |
        MOV     OLD_KEY,R0                      ;       |
        MOV     TIME1,#50
        MOV     TIME2,#5
        CLR     REPEAT
KEY_EX:
        MOV     R0,#3
NO_KEY1:
        RRC     A
        DJNZ    R0,GOTO_CARY1
        SJMP    KEY_EXIT
GOTO_CARY1:
        JNC     NO_KEY1
        MOV     A,R0
        CJNE    A,OLD_KEY,KEY_EXIT
        JNB     REPEAT,DEC_TIME1
        DJNZ    TIME2,KEY_EXIT
        MOV     TIME2,#5
        MOV     ACTIVE_KEY,OLD_KEY
        SJMP    KEY_EXIT
DEC_TIME1:
        DJNZ    TIME1,KEY_EXIT
        SETB    REPEAT
KEY_EXIT:

;
        POP     _R0
        POP     DPH
        POP     DPL
        POP     PSW
        POP     Acc
        RETI
;----------------------------------------------------------------------------
;CONTROL POINTS       BITS   2  1  0
;                            |  |  |
;   -X-    =    ---     =       A
;   X-X    =   |   |    =    F     B
;   -X-    =    ---     =       G
;   X-X    =   |   |    =    E     C
;   -X-    =    ---     =       D
;macros define ONE byte
;bits:     MSB 7 6 5 4 3 2 1 0  LSB
;First  byte - H C G D E F A B
;
CHAR7A   MACRO
A_      SET     (ROW1 AND (1 SHL 1)) SHR 1      ;BITS:  2 1 0
B_      SET     (ROW2 AND (1 SHL 0)) SHR 0      ;       | | |
C_      SET     (ROW4 AND (1 SHL 0)) SHR 0      ;         A
D_      SET     (ROW5 AND (1 SHL 1)) SHR 1      ;       F   B
E_      SET     (ROW4 AND (1 SHL 2)) SHR 2      ;         G
F_      SET     (ROW2 AND (1 SHL 2)) SHR 2      ;       E   C
G_      SET     (ROW3 AND (1 SHL 1)) SHR 1      ;         D
;
        DB   LOW(NOT(( 0 SHL 7) OR (C_ SHL 6) OR (G_ SHL 5) OR (D_ SHL 4) OR (E_ SHL 3) OR (F_ SHL 2) OR (A_ SHL 1) OR (B_ SHL 0)))
        ENDM
ASCII:
;0
ROW1    SET     111b
ROW2    SET     101b
ROW3    SET     101b
ROW4    SET     101b
ROW5    SET     111b
CHAR7A
;1
ROW1    SET     001b
ROW2    SET     001b
ROW3    SET     001b
ROW4    SET     001b
ROW5    SET     001b
CHAR7A
;2
ROW1    SET     111b
ROW2    SET     001b
ROW3    SET     111b
ROW4    SET     100b
ROW5    SET     111b
CHAR7A
;3
ROW1    SET     111b
ROW2    SET     001b
ROW3    SET     111b
ROW4    SET     001b
ROW5    SET     111b
CHAR7A
;4
ROW1    SET     101b
ROW2    SET     101b
ROW3    SET     111b
ROW4    SET     001b
ROW5    SET     001b
CHAR7A
;5
ROW1    SET     111b
ROW2    SET     100b
ROW3    SET     111b
ROW4    SET     001b
ROW5    SET     111b
CHAR7A
;6
ROW1    SET     111b
ROW2    SET     100b
ROW3    SET     111b
ROW4    SET     101b
ROW5    SET     111b
CHAR7A
;7
ROW1    SET     111b
ROW2    SET     001b
ROW3    SET     001b
ROW4    SET     001b
ROW5    SET     001b
CHAR7A
;8
ROW1    SET     111b
ROW2    SET     101b
ROW3    SET     111b
ROW4    SET     101b
ROW5    SET     111b
CHAR7A
;9
ROW1    SET     111b
ROW2    SET     101b
ROW3    SET     111b
ROW4    SET     001b
ROW5    SET     111b
CHAR7A
;
        END