| Home Pic in Greek Παραδείγματα χρήσης Pic Χρονόμετρο Αντίστροφης Μέτρησης Λίστα εντολών προγράμματος |
Χρονόμετρο - Λίστα εντολών προγράμματος
Χρονόμετρο - Λίστα εντολών προγράμματος Source code file of Countdown timer Αποθήκευση αρχείου στον σκληρό δίσκο R
    001
    002
    003
    004
    005
    006
    007
    008
    009
    010
    011
    012
    013
    014
    015
    016
    017
    018
    019
    020
    021
    022
    023
    024
    025
    026
    027
    028
    029
    030
    031
    032
    033
    034
    035
    036
    037
    038
    039
    040
    041
    042
    043
    044
    045
    046
    047
    048
    049
    050
    051
    052
    053
    054
    055
    056
    057
    058
    059
    060
    061
    062
    063
    064
    065
    066
    067
    068
    069
    070
    071
    072
    073
    074
    075
    076
    077
    078
    079
    080
    081
    082
    083
    084
    085
    086
    087
    088
    089
    090
    091
    092
    093
    094
    095
    096
    097
    098
    099
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    ;********************************************************
    ;
    ;             The Countdown timer processing
    ;
    ;                                 Author : Seiichi Inoue
    ;********************************************************

            list            p=pic16f84a
            include         p16f84a.inc
            __config _hs_osc & _wdt_off & _pwrte_on & _cp_off

    ;****************  Label Definition  ********************
    c10m    equ     h'0c'           ;Counter adr (10th min)
    c01m    equ     h'0d'           ;Counter adr ( 1st min)
    c10s    equ     h'0e'           ;Counter adr (10th sec)
    c01s    equ     h'0f'           ;Counter adr ( 1st sec)

    seg7_0  equ     b'01000000'     ;-gfedcba Pattern 0
    seg7_1  equ     b'01111001'     ;         Pattern 1
    seg7_2  equ     b'00100100'     ;         Pattern 2
    seg7_3  equ     b'00110000'     ;         Pattern 3
    seg7_4  equ     b'00011001'     ;         Pattern 4
    seg7_5  equ     b'00010010'     ;         Pattern 5
    seg7_6  equ     b'00000010'     ;         Pattern 6
    seg7_7  equ     b'01111000'     ;         Pattern 7
    seg7_8  equ     b'00000000'     ;         Pattern 8
    seg7_9  equ     b'00010000'     ;         Pattern 9

    seg70   equ     h'10'           ;Pattern 0 set adr
    seg71   equ     h'11'           ;Pattern 1 set adr
    seg72   equ     h'12'           ;Pattern 2 set adr
    seg73   equ     h'13'           ;Pattern 3 set adr
    seg74   equ     h'14'           ;Pattern 4 set adr
    seg75   equ     h'15'           ;Pattern 5 set adr
    seg76   equ     h'16'           ;Pattern 6 set adr
    seg77   equ     h'17'           ;Pattern 7 set adr
    seg78   equ     h'18'           ;Pattern 8 set adr
    seg79   equ     h'19'           ;Pattern 9 set adr

    tm_cnt  equ     h'1a'           ;Time adjust counter adr
    time_f  equ     h'1b'           ;Time out flag adr
    bcd_in  equ     h'1c'           ;BCD input area adr

    w_save  equ     h'1d'           ;W Register save adr
    s_save  equ     h'1e'           ;STATUS Register save adr

    cnt500u equ     h'1f'           ;500usec counter adr
    cnt1m   equ     h'20'           ;1msec counter adr

    ra0     equ     0               ;RA0 of PORTA
    ra1     equ     1               ;RA1 of PORTA
    ra2     equ     2               ;RA2 of PORTA
    ra3     equ     3               ;RA3 of PORTA
    ra4     equ     4               ;RA4 of PORTA

    rb6     equ     6               ;RB6 of PORTB

    ;**************  Debugging mode setting  ****************
    ;For debugging mode, ";" of next line should be removed.
    ;#define  _debug

    ;****************  Program Start  ***********************
            org     0               ;Reset Vector
            goto    init
            org     4               ;Interrupt Vector
            goto    int

    ;****************  Initial Process  *********************
            org     5
    init    bsf     status,rp0      ;Change to Bank1
            movlw   b'00010000'     ;RA4:IN,RA3-0:OUT
            movwf   trisa           ;Set PORTA
            movlw   b'00000111'     ;RBPU/TOCS/PSA=0,PS=111
            movwf   option_reg      ;Set OPTION_REG
            bcf     status,rp0      ;Change to Bank0
            movlw   b'00001000'     ;Set Relay OFF
            movwf   porta           ;Set PORTA
            movlw   seg7_0          ;Set 7segment pattern 0
            movwf   seg70           ;Save pattern 0
            movlw   seg7_1          ;Set 7segment pattern 1
            movwf   seg71           ;Save pattern 1
            movlw   seg7_2          ;Set 7segment pattern 2
            movwf   seg72           ;Save pattern 2
            movlw   seg7_3          ;Set 7segment pattern 3
            movwf   seg73           ;Save pattern 3
            movlw   seg7_4          ;Set 7segment pattern 4
            movwf   seg74           ;Save pattern 4
            movlw   seg7_5          ;Set 7segment pattern 5
            movwf   seg75           ;Save pattern 5
            movlw   seg7_6          ;Set 7segment pattern 6
            movwf   seg76           ;Save pattern 6
            movlw   seg7_7          ;Set 7segment pattern 7
            movwf   seg77           ;Save pattern 7
            movlw   seg7_8          ;Set 7segment pattern 8
            movwf   seg78           ;Save pattern 8
            movlw   seg7_9          ;Set 7segment pattern 9
            movwf   seg79           ;Save pattern 9
            clrf    c10s            ;Clear 10th sec counter
            clrf    c01s            ;Clear  1st sec counter
            bsf     time_f,0        ;Set time out flag OFF

    ;*************  Timer stand-by Process  *****************
    stand_by
            bsf     status,rp0      ;Change to Bank1
            movlw   h'ff'           ;RB7-0:IN
            movwf   trisb           ;Set PORTB to input mode
            bcf     status,rp0      ;Change to Bank0
            bcf     porta,ra0       ;RA0 = 0 (10th min BCD)
            bcf     porta,ra1       ;RA1 = 0
            bcf     porta,ra2       ;RA2 = 0
    #ifdef _debug
            movlw   h'fe'           ;(Debugging step)
    #else
            call    t1m             ;Wait 1msec
            movf    portb,w         ;Read 10th of min BCD
    #endif
            xorlw   h'ff'           ;Reverse 0/1
            andlw   h'0f'           ;Pick-up digit
            movwf   c10m            ;Save 10th of the minute
            bsf     porta,ra0       ;RA0 = 1 (1st min BCD)
    #ifdef _debug
            movlw   h'ff'           ;(Debugging step)
    #else
            call    t1m             ;Wait 1msec
            movf    portb,w         ;Read 1st of min BCD
    #endif
            xorlw   h'ff'           ;Reverse 0/1
            andlw   h'0f'           ;Pick-up digit
            movwf   c01m            ;Save 1st of the minute
            call    led_cont        ;Call LED Countrol sub
            movf    c10m,w          ;Read 10th of minute
            btfss   status,z        ;10th of min is 0 ?
            goto    sw_check        ;Jump to start sw check
            movf    c01m,w          ;Read 1st of minute
            btfsc   status,z        ;1st of min is 0 ?
            goto    stand_by        ;Time is 00:00
    sw_check
            bsf     status,rp0      ;Change to Bank1
            bsf     trisb,rb6       ;Set RB6 to input mode
            bcf     status,rp0      ;Change to Bank0
            bcf     porta,ra0       ;RA0 = 0 (Start switch)
            bsf     porta,ra1       ;RA1 = 1
            bcf     porta,ra2       ;RA2 = 0
    #ifndef _debug
            call    t1m             ;Wait 1msec
            btfsc   portb,rb6       ;Timer start ?
            goto    stand_by        ;No. Stand-by.
    #endif

    ;**************  Timer start Process  *******************
    start
            bcf     porta,ra3       ;Set Relay ON
    #ifdef _debug
            movlw   d'255'          ;(Debugging step)
    #else
            movlw   d'43'           ;Set Hard timer value
    #endif
            movwf   tmr0            ;Set TMR0
    #ifdef _debug
            movlw   d'2'            ;(Debugging step)
    #else
            movlw   d'46'           ;Set Soft count value
    #endif
            movwf   tm_cnt          ;Save time adjust
            movlw   h'a0'           ;GIE=1,TOIE=1
            movwf   intcon          ;Interruption enable
    loop
            call    led_cont        ;Call LED Countrol sub
            movf    time_f,w        ;Read time out flag
            btfsc   status,z        ;Time out ?
            goto    time_out        ;Yes. Jump to time out

    #ifndef _debug
            btfsc   porta,ra4       ;Stop switch ON ?
    #endif
            goto    loop            ;No. Retry

    time_out
            clrf    intcon          ;Interruptin disable
            goto    init            ;Jump to Initial Process

    ;**************  LED Control Subroutine  ****************
    led_cont
            bsf     status,rp0      ;Change to Bank1
            clrf    trisb           ;Set PORTB to output mode
            bcf     status,rp0      ;Change to Bank0
            bcf     porta,ra0       ;RA0 = 0 (7seg 10th min)
            bcf     porta,ra1       ;RA1 = 0
            bsf     porta,ra2       ;RA2 = 1
            movf    c10m,w          ;Read 10th of min count
            movwf   bcd_in          ;Set count
            call    bcd_7seg        ;LED control
            bsf     porta,ra0       ;RA0 = 1 (7seg 1st min)
            movf    c01m,w          ;Read 1st of min count
            movwf   bcd_in          ;Set count
            call    bcd_7seg        ;LED control
            bcf     porta,ra0       ;RA0 = 0 (7seg 10th sec)
            bsf     porta,ra1       ;RA1 = 1
            movf    c10s,w          ;Read 10th of sec count
            movwf   bcd_in          ;Set count
            call    bcd_7seg        ;LED control
            bsf     porta,ra0       ;RA0 = 1 (7seg 1st sec)
            movf    c01s,w          ;Read 1st of sec count
            movwf   bcd_in          ;Set count
            call    bcd_7seg        ;LED control
            return

    ;*******  Change BCD to 7segment data Subroutine  *******
    bcd_7seg
            movlw   seg70           ;Set 7seg pattern head
            addwf   bcd_in,w        ;Pattern table address
            movwf   fsr             ;Set table address
            movf    indf,w          ;Read 7seg pattern
            movwf   portb           ;Set pattern to PORTB
    #ifndef _debug
            call    t1m             ;Wait 1msec
    #endif
            return

    ;*************  1msec Timer Subroutine  *****************
    t1m     movlw   2               ;(1)       Set loop cnt1
            movwf   cnt1m           ;(1)       Save loop cnt1
    tm1lp1  movlw   d'249'          ;(1)*2     Set loop cnt2
            movwf   cnt500u         ;(1)*2     Save loop cnt2
    tm1lp2  nop                     ;(1)*249*2 Time adjust
            nop                     ;(1)*249*2 Time adjust
            decfsz  cnt500u,f       ;(1)*249*2 cnt500u-1=0 ?
            goto    tm1lp2          ;(2)*248*2 No, continue
            decfsz  cnt1m,f         ;(1)*2     cnt1m-1=0 ?
            goto    tm1lp1          ;(2)       No. Continue
            return                  ;(2)       Yes. Cnt end
                                    ;Total 2501*0.4usec=1msec

    ;************  Begin Interruption Process  **************
    int
            movwf   w_save          ;Save W register
            movf    status,w        ;Read STATUS reg
            movwf   s_save          ;Save STATUS reg
            bcf     status,rp0      ;Change to Bank0
            btfsc   intcon,t0if     ;Time out interruption ?
            goto    timer_int       ;Jump to Timer process

    ;************  END of Interruption Process **************
    int_end
            movf    s_save,w        ;Read saved STATUS reg
            movwf   status          ;Recover STATUS reg
            swapf   w_save,f        ;Read saved W register
            swapf   w_save,w        ;Recover W register
            retfie

    ;***********  Time-out interruption Process  ************
    timer_int
            bcf     intcon,t0if     ;Clear timer int flag
    #ifdef _debug
            movlw   d'255'          ;(Debugging step)
    #else
            movlw   d'43'           ;Set Hard timer value
    #endif
            movwf   tmr0            ;Set TMR0
            decfsz  tm_cnt,f        ;Time over ?
            goto    int_end         ;No. Retry
    #ifdef _debug
            movlw   d'2'            ;(Debugging step)
    #else
            movlw   d'46'           ;Set Soft count value
    #endif
            movwf   tm_cnt          ;Save time adjust

    ;*************  Timer Countdown Process  ***************
            decfsz  c01s,w          ;1st of sec is 0 from 1 ?
            goto    countdown       ;No. Jump to countdown

    ;-----------------  Time-out check  ---------------------
            movf    c10s,w          ;Read 10th of sec counter
            btfss   status,z        ;10th of sec is 0 ?
            goto    countdown       ;Jump to countdown
            movf    c01m,w          ;Read 1st of min counter
            btfss   status,z        ;1st of min is 0 ?
            goto    countdown       ;Jump to countdown
            movf    c10m,w          ;Read 10th of min counter
            btfss   status,z        ;10th of min is 0 ?
            goto    countdown       ;Jump to countdown

    time_out1
            clrf    time_f          ;Set time-out flag ON
            goto    int_end         ;Return

    ;----------------  Timer countdown  ---------------------
    countdown
            movf    c01s,w          ;Read 1st of sec counter
            btfss   status,z        ;1st of sec is 0 ?
            goto    cd_c01s         ;Jump to 1st sec cntdown
            movlw   9               ;Set 9
            movwf   c01s            ;Save 9 to 1st of sec
            movf    c10s,w          ;Read 10th of sec counter
            btfss   status,z        ;10th of sec is 0 ?
            goto    cd_c10s         ;Jump to 10th min cntdown
            movlw   5               ;Set 5
            movwf   c10s            ;Save 5 to 10th of sec
            movf    c01m,w          ;Read 1st of min counter
            btfss   status,z        ;1st of min is 0 ?
            goto    cd_c01m         ;Jump to 1st min cntdown
            movlw   9               ;Set 9
            movwf   c01m            ;Save 9 to 1st of min
            movf    c10m,w          ;Read 10th of min counter
            btfss   status,z        ;10th of min is 0 ?
            goto    cd_c10m         ;Jump to 10th min cntdown
            goto    time_out1       ;Counter is 00:00 already

    cd_c01s
            decf    c01s,f          ;Count down 1st of sec
            goto    int_end         ;Return

    cd_c10s
            decf    c10s,f          ;Count down 10th of sec
            goto    int_end         ;Return

    cd_c01m
            decf    c01m,f          ;Count down 1st of min
            goto    int_end         ;Return

    cd_c10m
            decf    c10m,f          ;Count down 10th of min
            goto    int_end         ;Return

    ;********************************************************
    ;          END of Countdown timer processing
    ;********************************************************

            end
Listing file of Countdown timer
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  1

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

                          00001 ;********************************************************
                          00002 ;
                          00003 ;             The Countdown timer processing
                          00004 ;
                          00005 ;                                 Author : Seiichi Inoue
                          00006 ;********************************************************
                          00007
                          00008         LIST            P=PIC16F84A
                          00009         INCLUDE         P16F84A.INC
                          00001         LIST
                          00002 ; P16F84A.INC  Standard Header File, Version 2.00(modify)
                          00134         LIST
    2007   3FF2           00010         __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
                          00011
                          00012 ;****************  Label Definition  ********************
      0000000C            00013 C10M    EQU     H'0c'           ;Counter adr (10th min)
      0000000D            00014 C01M    EQU     H'0d'           ;Counter adr ( 1st min)
      0000000E            00015 C10S    EQU     H'0e'           ;Counter adr (10th sec)
      0000000F            00016 C01S    EQU     H'0f'           ;Counter adr ( 1st sec)
                          00017
      00000040            00018 SEG7_0  EQU     B'01000000'     ;-gfedcba Pattern 0
      00000079            00019 SEG7_1  EQU     B'01111001'     ;         Pattern 1
      00000024            00020 SEG7_2  EQU     B'00100100'     ;         Pattern 2
      00000030            00021 SEG7_3  EQU     B'00110000'     ;         Pattern 3
      00000019            00022 SEG7_4  EQU     B'00011001'     ;         Pattern 4
      00000012            00023 SEG7_5  EQU     B'00010010'     ;         Pattern 5
      00000002            00024 SEG7_6  EQU     B'00000010'     ;         Pattern 6
      00000078            00025 SEG7_7  EQU     B'01111000'     ;         Pattern 7
      00000000            00026 SEG7_8  EQU     B'00000000'     ;         Pattern 8
      00000010            00027 SEG7_9  EQU     B'00010000'     ;         Pattern 9
                          00028
      00000010            00029 SEG70   EQU     H'10'           ;Pattern 0 set adr
      00000011            00030 SEG71   EQU     H'11'           ;Pattern 1 set adr
      00000012            00031 SEG72   EQU     H'12'           ;Pattern 2 set adr
      00000013            00032 SEG73   EQU     H'13'           ;Pattern 3 set adr
      00000014            00033 SEG74   EQU     H'14'           ;Pattern 4 set adr
      00000015            00034 SEG75   EQU     H'15'           ;Pattern 5 set adr
      00000016            00035 SEG76   EQU     H'16'           ;Pattern 6 set adr
      00000017            00036 SEG77   EQU     H'17'           ;Pattern 7 set adr
      00000018            00037 SEG78   EQU     H'18'           ;Pattern 8 set adr
      00000019            00038 SEG79   EQU     H'19'           ;Pattern 9 set adr
                          00039
      0000001A            00040 TM_CNT  EQU     H'1a'           ;Time adjust counter adr
      0000001B            00041 TIME_F  EQU     H'1b'           ;Time out flag adr
      0000001C            00042 BCD_IN  EQU     H'1c'           ;BCD input area adr
                          00043
      0000001D            00044 W_SAVE  EQU     H'1d'           ;W Register save adr
      0000001E            00045 S_SAVE  EQU     H'1e'           ;STATUS Register save adr
                          00046
      0000001F            00047 CNT500U EQU     H'1f'           ;500usec counter adr
      00000020            00048 CNT1M   EQU     H'20'           ;1msec counter adr
                          00049
      00000000            00050 RA0     EQU     0               ;RA0 of PORTA
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  2

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

      00000001            00051 RA1     EQU     1               ;RA1 of PORTA
      00000002            00052 RA2     EQU     2               ;RA2 of PORTA
      00000003            00053 RA3     EQU     3               ;RA3 of PORTA
      00000004            00054 RA4     EQU     4               ;RA4 of PORTA
                          00055
      00000006            00056 RB6     EQU     6               ;RB6 of PORTB
                          00057
                          00058 ;**************  Debugging mode setting  ****************
                          00059 ;For debugging mode, ";" of next line should be removed.
                          00060 ;#define  _debug
                          00061
                          00062 ;****************  Program Start  ***********************
    0000                  00063         ORG     0               ;Reset Vector
    0000   2805           00064         GOTO    INIT
    0004                  00065         ORG     4               ;Interrupt Vector
    0004   287E           00066         GOTO    INT
                          00067
                          00068 ;****************  Initial Process  *********************
    0005                  00069         ORG     5
    0005   1683           00070 INIT    BSF     STATUS,RP0      ;Change to Bank1
    0006   3010           00071         MOVLW   B'00010000'     ;RA4:IN,RA3-0:OUT
    0007   0085           00072         MOVWF   TRISA           ;Set PORTA
    0008   3007           00073         MOVLW   B'00000111'     ;RBPU/TOCS/PSA=0,PS=111
    0009   0081           00074         MOVWF   OPTION_REG      ;Set OPTION_REG
    000A   1283           00075         BCF     STATUS,RP0      ;Change to Bank0
    000B   3008           00076         MOVLW   B'00001000'     ;Set Relay OFF
    000C   0085           00077         MOVWF   PORTA           ;Set PORTA
    000D   3040           00078         MOVLW   SEG7_0          ;Set 7segment pattern 0
    000E   0090           00079         MOVWF   SEG70           ;Save pattern 0
    000F   3079           00080         MOVLW   SEG7_1          ;Set 7segment pattern 1
    0010   0091           00081         MOVWF   SEG71           ;Save pattern 1
    0011   3024           00082         MOVLW   SEG7_2          ;Set 7segment pattern 2
    0012   0092           00083         MOVWF   SEG72           ;Save pattern 2
    0013   3030           00084         MOVLW   SEG7_3          ;Set 7segment pattern 3
    0014   0093           00085         MOVWF   SEG73           ;Save pattern 3
    0015   3019           00086         MOVLW   SEG7_4          ;Set 7segment pattern 4
    0016   0094           00087         MOVWF   SEG74           ;Save pattern 4
    0017   3012           00088         MOVLW   SEG7_5          ;Set 7segment pattern 5
    0018   0095           00089         MOVWF   SEG75           ;Save pattern 5
    0019   3002           00090         MOVLW   SEG7_6          ;Set 7segment pattern 6
    001A   0096           00091         MOVWF   SEG76           ;Save pattern 6
    001B   3078           00092         MOVLW   SEG7_7          ;Set 7segment pattern 7
    001C   0097           00093         MOVWF   SEG77           ;Save pattern 7
    001D   3000           00094         MOVLW   SEG7_8          ;Set 7segment pattern 8
    001E   0098           00095         MOVWF   SEG78           ;Save pattern 8
    001F   3010           00096         MOVLW   SEG7_9          ;Set 7segment pattern 9
    0020   0099           00097         MOVWF   SEG79           ;Save pattern 9
    0021   018E           00098         CLRF    C10S            ;Clear 10th sec counter
    0022   018F           00099         CLRF    C01S            ;Clear  1st sec counter
    0023   141B           00100         BSF     TIME_F,0        ;Set time out flag OFF
                          00101
                          00102 ;*************  Timer stand-by Process  *****************
    0024                  00103 STAND_BY
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  3

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

    0024   1683           00104         BSF     STATUS,RP0      ;Change to Bank1
    0025   30FF           00105         MOVLW   H'ff'           ;RB7-0:IN
    0026   0086           00106         MOVWF   TRISB           ;Set PORTB to input mode
    0027   1283           00107         BCF     STATUS,RP0      ;Change to Bank0
    0028   1005           00108         BCF     PORTA,RA0       ;RA0 = 0 (10th min BCD)
    0029   1085           00109         BCF     PORTA,RA1       ;RA1 = 0
    002A   1105           00110         BCF     PORTA,RA2       ;RA2 = 0
                          00111 #IFDEF _DEBUG
                          00112         MOVLW   H'fe'           ;(Debugging step)
                          00113 #ELSE
    002B   2073           00114         CALL    T1M             ;Wait 1msec
    002C   0806           00115         MOVF    PORTB,W         ;Read 10th of min BCD
                          00116 #ENDIF
    002D   3AFF           00117         XORLW   H'ff'           ;Reverse 0/1
    002E   390F           00118         ANDLW   H'0f'           ;Pick-up digit
    002F   008C           00119         MOVWF   C10M            ;Save 10th of the minute
    0030   1405           00120         BSF     PORTA,RA0       ;RA0 = 1 (1st min BCD)
                          00121 #IFDEF _DEBUG
                          00122         MOVLW   H'ff'           ;(Debugging step)
                          00123 #ELSE
    0031   2073           00124         CALL    T1M             ;Wait 1msec
    0032   0806           00125         MOVF    PORTB,W         ;Read 1st of min BCD
                          00126 #ENDIF
    0033   3AFF           00127         XORLW   H'ff'           ;Reverse 0/1
    0034   390F           00128         ANDLW   H'0f'           ;Pick-up digit
    0035   008D           00129         MOVWF   C01M            ;Save 1st of the minute
    0036   2055           00130         CALL    LED_CONT        ;Call LED Countrol sub
    0037   080C           00131         MOVF    C10M,W          ;Read 10th of minute
    0038   1D03           00132         BTFSS   STATUS,Z        ;10th of min is 0 ?
    0039   283D           00133         GOTO    SW_CHECK        ;Jump to start sw check
    003A   080D           00134         MOVF    C01M,W          ;Read 1st of minute
    003B   1903           00135         BTFSC   STATUS,Z        ;1st of min is 0 ?
    003C   2824           00136         GOTO    STAND_BY        ;Time is 00:00
    003D                  00137 SW_CHECK
    003D   1683           00138         BSF     STATUS,RP0      ;Change to Bank1
    003E   1706           00139         BSF     TRISB,RB6       ;Set RB6 to input mode
    003F   1283           00140         BCF     STATUS,RP0      ;Change to Bank0
    0040   1005           00141         BCF     PORTA,RA0       ;RA0 = 0 (Start switch)
    0041   1485           00142         BSF     PORTA,RA1       ;RA1 = 1
    0042   1105           00143         BCF     PORTA,RA2       ;RA2 = 0
                          00144 #IFNDEF _DEBUG
    0043   2073           00145         CALL    T1M             ;Wait 1msec
    0044   1B06           00146         BTFSC   PORTB,RB6       ;Timer start ?
    0045   2824           00147         GOTO    STAND_BY        ;No. Stand-by.
                          00148 #ENDIF
                          00149
                          00150 ;**************  Timer start Process  *******************
    0046                  00151 START
    0046   1185           00152         BCF     PORTA,RA3       ;Set Relay ON
                          00153 #IFDEF _DEBUG
                          00154         MOVLW   D'255'          ;(Debugging step)
                          00155 #ELSE
    0047   302B           00156         MOVLW   D'43'           ;Set Hard timer value
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  4

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

                          00157 #ENDIF
    0048   0081           00158         MOVWF   TMR0            ;Set TMR0
                          00159 #IFDEF _DEBUG
                          00160         MOVLW   D'2'            ;(Debugging step)
                          00161 #ELSE
    0049   302E           00162         MOVLW   D'46'           ;Set Soft count value
                          00163 #ENDIF
    004A   009A           00164         MOVWF   TM_CNT          ;Save time adjust
    004B   30A0           00165         MOVLW   H'a0'           ;GIE=1,TOIE=1
    004C   008B           00166         MOVWF   INTCON          ;Interruption enable
    004D                  00167 LOOP
    004D   2055           00168         CALL    LED_CONT        ;Call LED Countrol sub
    004E   081B           00169         MOVF    TIME_F,W        ;Read time out flag
    004F   1903           00170         BTFSC   STATUS,Z        ;Time out ?
    0050   2853           00171         GOTO    TIME_OUT        ;Yes. Jump to time out
                          00172
                          00173 #IFNDEF _DEBUG
    0051   1A05           00174         BTFSC   PORTA,RA4       ;Stop switch ON ?
                          00175 #ENDIF
    0052   284D           00176         GOTO    LOOP            ;No. Retry
                          00177
    0053                  00178 TIME_OUT
    0053   018B           00179         CLRF    INTCON          ;Interruptin disable
    0054   2805           00180         GOTO    INIT            ;Jump to Initial Process
                          00181
                          00182 ;**************  LED Control Subroutine  ****************
    0055                  00183 LED_CONT
    0055   1683           00184         BSF     STATUS,RP0      ;Change to Bank1
    0056   0186           00185         CLRF    TRISB           ;Set PORTB to output mode
    0057   1283           00186         BCF     STATUS,RP0      ;Change to Bank0
    0058   1005           00187         BCF     PORTA,RA0       ;RA0 = 0 (7seg 10th min)
    0059   1085           00188         BCF     PORTA,RA1       ;RA1 = 0
    005A   1505           00189         BSF     PORTA,RA2       ;RA2 = 1
    005B   080C           00190         MOVF    C10M,W          ;Read 10th of min count
    005C   009C           00191         MOVWF   BCD_IN          ;Set count
    005D   206C           00192         CALL    BCD_7SEG        ;LED control
    005E   1405           00193         BSF     PORTA,RA0       ;RA0 = 1 (7seg 1st min)
    005F   080D           00194         MOVF    C01M,W          ;Read 1st of min count
    0060   009C           00195         MOVWF   BCD_IN          ;Set count
    0061   206C           00196         CALL    BCD_7SEG        ;LED control
    0062   1005           00197         BCF     PORTA,RA0       ;RA0 = 0 (7seg 10th sec)
    0063   1485           00198         BSF     PORTA,RA1       ;RA1 = 1
    0064   080E           00199         MOVF    C10S,W          ;Read 10th of sec count
    0065   009C           00200         MOVWF   BCD_IN          ;Set count
    0066   206C           00201         CALL    BCD_7SEG        ;LED control
    0067   1405           00202         BSF     PORTA,RA0       ;RA0 = 1 (7seg 1st sec)
    0068   080F           00203         MOVF    C01S,W          ;Read 1st of sec count
    0069   009C           00204         MOVWF   BCD_IN          ;Set count
    006A   206C           00205         CALL    BCD_7SEG        ;LED control
    006B   0008           00206         RETURN
                          00207
                          00208 ;*******  Change BCD to 7segment data Subroutine  *******
    006C                  00209 BCD_7SEG
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  5

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

    006C   3010           00210         MOVLW   SEG70           ;Set 7seg pattern head
    006D   071C           00211         ADDWF   BCD_IN,W        ;Pattern table address
    006E   0084           00212         MOVWF   FSR             ;Set table address
    006F   0800           00213         MOVF    INDF,W          ;Read 7seg pattern
    0070   0086           00214         MOVWF   PORTB           ;Set pattern to PORTB
                          00215 #IFNDEF _DEBUG
    0071   2073           00216         CALL    T1M             ;Wait 1msec
                          00217 #ENDIF
    0072   0008           00218         RETURN
                          00219
                          00220 ;*************  1msec Timer Subroutine  *****************
    0073   3002           00221 T1M     MOVLW   2               ;(1)       Set loop cnt1
    0074   00A0           00222         MOVWF   CNT1M           ;(1)       Save loop cnt1
    0075   30F9           00223 TM1LP1  MOVLW   D'249'          ;(1)*2     Set loop cnt2
    0076   009F           00224         MOVWF   CNT500U         ;(1)*2     Save loop cnt2
    0077   0000           00225 TM1LP2  NOP                     ;(1)*249*2 Time adjust
    0078   0000           00226         NOP                     ;(1)*249*2 Time adjust
    0079   0B9F           00227         DECFSZ  CNT500U,F       ;(1)*249*2 cnt500u-1=0 ?
    007A   2877           00228         GOTO    TM1LP2          ;(2)*248*2 No, continue
    007B   0BA0           00229         DECFSZ  CNT1M,F         ;(1)*2     cnt1m-1=0 ?
    007C   2875           00230         GOTO    TM1LP1          ;(2)       No. Continue
    007D   0008           00231         RETURN                  ;(2)       Yes. Cnt end
                          00232                                 ;Total 2501*0.4usec=1msec
                          00233
                          00234 ;************  Begin Interruption Process  **************
    007E                  00235 INT
    007E   009D           00236         MOVWF   W_SAVE          ;Save W register
    007F   0803           00237         MOVF    STATUS,W        ;Read STATUS reg
    0080   009E           00238         MOVWF   S_SAVE          ;Save STATUS reg
    0081   1283           00239         BCF     STATUS,RP0      ;Change to Bank0
    0082   190B           00240         BTFSC   INTCON,T0IF     ;Time out interruption ?
    0083   2889           00241         GOTO    TIMER_INT       ;Jump to Timer process
                          00242
                          00243 ;************  END of Interruption Process **************
    0084                  00244 INT_END
    0084   081E           00245         MOVF    S_SAVE,W        ;Read saved STATUS reg
    0085   0083           00246         MOVWF   STATUS          ;Recover STATUS reg
    0086   0E9D           00247         SWAPF   W_SAVE,F        ;Read saved W register
    0087   0E1D           00248         SWAPF   W_SAVE,W        ;Recover W register
    0088   0009           00249         RETFIE
                          00250
                          00251 ;***********  Time-out interruption Process  ************
    0089                  00252 TIMER_INT
    0089   110B           00253         BCF     INTCON,T0IF     ;Clear timer int flag
                          00254 #IFDEF _DEBUG
                          00255         MOVLW   D'255'          ;(Debugging step)
                          00256 #ELSE
    008A   302B           00257         MOVLW   D'43'           ;Set Hard timer value
                          00258 #ENDIF
    008B   0081           00259         MOVWF   TMR0            ;Set TMR0
    008C   0B9A           00260         DECFSZ  TM_CNT,F        ;Time over ?
    008D   2884           00261         GOTO    INT_END         ;No. Retry
                          00262 #IFDEF _DEBUG
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  6

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

                          00263         MOVLW   D'2'            ;(Debugging step)
                          00264 #ELSE
    008E   302E           00265         MOVLW   D'46'           ;Set Soft count value
                          00266 #ENDIF
    008F   009A           00267         MOVWF   TM_CNT          ;Save time adjust
                          00268
                          00269 ;*************  Timer Countdown Process  ***************
    0090   0B0F           00270         DECFSZ  C01S,W          ;1st of sec is 0 from 1 ?
    0091   289D           00271         GOTO    COUNTDOWN       ;No. Jump to countdown
                          00272
                          00273 ;-----------------  Time-out check  ---------------------
    0092   080E           00274         MOVF    C10S,W          ;Read 10th of sec counter
    0093   1D03           00275         BTFSS   STATUS,Z        ;10th of sec is 0 ?
    0094   289D           00276         GOTO    COUNTDOWN       ;Jump to countdown
    0095   080D           00277         MOVF    C01M,W          ;Read 1st of min counter
    0096   1D03           00278         BTFSS   STATUS,Z        ;1st of min is 0 ?
    0097   289D           00279         GOTO    COUNTDOWN       ;Jump to countdown
    0098   080C           00280         MOVF    C10M,W          ;Read 10th of min counter
    0099   1D03           00281         BTFSS   STATUS,Z        ;10th of min is 0 ?
    009A   289D           00282         GOTO    COUNTDOWN       ;Jump to countdown
                          00283
    009B                  00284 TIME_OUT1
    009B   019B           00285         CLRF    TIME_F          ;Set time-out flag ON
    009C   2884           00286         GOTO    INT_END         ;Return
                          00287
                          00288 ;----------------  Timer countdown  ---------------------
    009D                  00289 COUNTDOWN
    009D   080F           00290         MOVF    C01S,W          ;Read 1st of sec counter
    009E   1D03           00291         BTFSS   STATUS,Z        ;1st of sec is 0 ?
    009F   28B0           00292         GOTO    CD_C01S         ;Jump to 1st sec cntdown
    00A0   3009           00293         MOVLW   9               ;Set 9
    00A1   008F           00294         MOVWF   C01S            ;Save 9 to 1st of sec
    00A2   080E           00295         MOVF    C10S,W          ;Read 10th of sec counter
    00A3   1D03           00296         BTFSS   STATUS,Z        ;10th of sec is 0 ?
    00A4   28B2           00297         GOTO    CD_C10S         ;Jump to 10th min cntdown
    00A5   3005           00298         MOVLW   5               ;Set 5
    00A6   008E           00299         MOVWF   C10S            ;Save 5 to 10th of sec
    00A7   080D           00300         MOVF    C01M,W          ;Read 1st of min counter
    00A8   1D03           00301         BTFSS   STATUS,Z        ;1st of min is 0 ?
    00A9   28B4           00302         GOTO    CD_C01M         ;Jump to 1st min cntdown
    00AA   3009           00303         MOVLW   9               ;Set 9
    00AB   008D           00304         MOVWF   C01M            ;Save 9 to 1st of min
    00AC   080C           00305         MOVF    C10M,W          ;Read 10th of min counter
    00AD   1D03           00306         BTFSS   STATUS,Z        ;10th of min is 0 ?
    00AE   28B6           00307         GOTO    CD_C10M         ;Jump to 10th min cntdown
    00AF   289B           00308         GOTO    TIME_OUT1       ;Counter is 00:00 already
                          00309
    00B0                  00310 CD_C01S
    00B0   038F           00311         DECF    C01S,F          ;Count down 1st of sec
    00B1   2884           00312         GOTO    INT_END         ;Return
                          00313
    00B2                  00314 CD_C10S
    00B2   038E           00315         DECF    C10S,F          ;Count down 10th of sec
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  7

    LOC  OBJECT CODE     LINE SOURCE TEXT
      VALUE

    00B3   2884           00316         GOTO    INT_END         ;Return
                          00317
    00B4                  00318 CD_C01M
    00B4   038D           00319         DECF    C01M,F          ;Count down 1st of min
    00B5   2884           00320         GOTO    INT_END         ;Return
                          00321
    00B6                  00322 CD_C10M
    00B6   038C           00323         DECF    C10M,F          ;Count down 10th of min
    00B7   2884           00324         GOTO    INT_END         ;Return
                          00325
                          00326 ;********************************************************
                          00327 ;          END of Countdown timer processing
                          00328 ;********************************************************
                          00329
                          00330         END
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  8

    SYMBOL TABLE
      LABEL                             VALUE

    BCD_7SEG                          0000006C
    BCD_IN                            0000001C
    C                                 00000000
    C01M                              0000000D
    C01S                              0000000F
    C10M                              0000000C
    C10S                              0000000E
    CD_C01M                           000000B4
    CD_C01S                           000000B0
    CD_C10M                           000000B6
    CD_C10S                           000000B2
    CNT1M                             00000020
    CNT500U                           0000001F
    COUNTDOWN                         0000009D
    DC                                00000001
    EEADR                             00000009
    EECON1                            00000008
    EECON2                            00000009
    EEDATA                            00000008
    EEIE                              00000006
    EEIF                              00000004
    F                                 00000001
    FSR                               00000004
    GIE                               00000007
    INDF                              00000000
    INIT                              00000005
    INT                               0000007E
    INTCON                            0000000B
    INTE                              00000004
    INTEDG                            00000006
    INTF                              00000001
    INT_END                           00000084
    IRP                               00000007
    LED_CONT                          00000055
    LOOP                              0000004D
    NOT_PD                            00000003
    NOT_RBPU                          00000007
    NOT_TO                            00000004
    OPTION_REG                        00000001
    PCL                               00000002
    PCLATH                            0000000A
    PORTA                             00000005
    PORTB                             00000006
    PS0                               00000000
    PS1                               00000001
    PS2                               00000002
    PSA                               00000003
    RA0                               00000000
    RA1                               00000001
    RA2                               00000002
    RA3                               00000003
    RA4                               00000004
    RB6                               00000006
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE  9

    SYMBOL TABLE
      LABEL                             VALUE

    RBIE                              00000003
    RBIF                              00000000
    RD                                00000000
    RP0                               00000005
    RP1                               00000006
    SEG70                             00000010
    SEG71                             00000011
    SEG72                             00000012
    SEG73                             00000013
    SEG74                             00000014
    SEG75                             00000015
    SEG76                             00000016
    SEG77                             00000017
    SEG78                             00000018
    SEG79                             00000019
    SEG7_0                            00000040
    SEG7_1                            00000079
    SEG7_2                            00000024
    SEG7_3                            00000030
    SEG7_4                            00000019
    SEG7_5                            00000012
    SEG7_6                            00000002
    SEG7_7                            00000078
    SEG7_8                            00000000
    SEG7_9                            00000010
    STAND_BY                          00000024
    START                             00000046
    STATUS                            00000003
    SW_CHECK                          0000003D
    S_SAVE                            0000001E
    T0CS                              00000005
    T0IE                              00000005
    T0IF                              00000002
    T0SE                              00000004
    T1M                               00000073
    TIMER_INT                         00000089
    TIME_F                            0000001B
    TIME_OUT                          00000053
    TIME_OUT1                         0000009B
    TM1LP1                            00000075
    TM1LP2                            00000077
    TMR0                              00000001
    TM_CNT                            0000001A
    TRISA                             00000005
    TRISB                             00000006
    W                                 00000000
    WR                                00000001
    WREN                              00000002
    WRERR                             00000003
    W_SAVE                            0000001D
    Z                                 00000002
    _CP_OFF                           00003FFF
    _CP_ON                            0000000F
    MPASM 02.40 Released         COUNTDWN.ASM   6-10-2000  10:16:30         PAGE 10

    SYMBOL TABLE
      LABEL                             VALUE

    _HS_OSC                           00003FFE
    _LP_OSC                           00003FFC
    _PWRTE_OFF                        00003FFF
    _PWRTE_ON                         00003FF7
    _RC_OSC                           00003FFF
    _WDT_OFF                          00003FFB
    _WDT_ON                           00003FFF
    _XT_OSC                           00003FFD
    __16F84A                          00000001

    MEMORY USAGE MAP ('X' = Used,  '-' = Unused)

    0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
    0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
    0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXX--------
    2000 : -------X-------- ---------------- ---------------- ----------------

    All other memory blocks unused.

    Program Memory Words Used:   181
    Program Memory Words Free:   843

    Errors   :     0
    Warnings :     0 reported,     0 suppressed
    Messages :     0 reported,     0 suppressed