[Menu]>[Circuits Gallery]>[Signboard 2]>[Software]>[Main process]

Source code file of Main process for signboard 2

    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
    ;********************************************************
    ;
    ;           The signboard control 2 processing
    ;
    ;                                 Author : Seiichi Inoue
    ;********************************************************

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

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

    ;****************  Label Definition  ********************

    scrnhd         equ     h'10'    ;Screen area head address
    scrnwhd        equ     h'20'    ;Screen work head address

    h_timer        equ     h'30'    ;For Interruption
    w_save         equ     h'31'
    s_save         equ     h'32'

    cnt500u        equ     h'33'    ;For Softwear Timer
    cnt1m          equ     h'34'
    cnt100m        equ     h'35'
    cnt500m        equ     h'36'
    cnt1s          equ     h'37'

    cnt_t          equ     h'33'    ;For LED control
    lpcnt          equ     h'34'
    rowindex       equ     h'35'
    porta_work     equ     h'36'
    edge           equ     h'37'

    ;****************  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
            clrf    trisa           ;Set PORTA to Output mode
            clrf    trisb           ;Set PORTB to Output mode
            bcf     status,rp0      ;Change to Bank0
            movf    portb,w         ;Read portb
            iorlw   h'80'           ;Set right data
            movwf   portb           ;Output data
            movlw   d'16'           ;Set loop count
            movwf   lpcnt           ;Save loop count
            movlw   d'15'           ;Set row index
            movwf   rowindex        ;Save row index
    init_loop
            movlw   scrnhd          ;Set table head address
            addwf   rowindex,w      ;Head + Index
            movwf   fsr             ;Set table address
            movlw   h'7f'           ;Set OFF data
            movwf   indf            ;Write data
            decf    rowindex,f      ;Index - 1
            decfsz  lpcnt,f         ;Loop end ?
            goto    init_loop       ;No. Next row
            call    led_cnt         ;LED control

    ;******************  Main Process  **********************
    main

    ; CALL sentences for subroutine call are put here.

            goto    main

    ;********************************************************
    ;*    Required effect processings are put below.        *
    ;********************************************************

    ; The subroutines are put here.

    ;***************  Interruption processing  **************
    int
            retfie                  ;Not use

    ;********************************************************
    ;*    Required effect processings are put above.        *
    ;********************************************************

    ;*************  LED control Subroutine  *****************
    led_cnt
            movlw   d'16'           ;Set loop count
            movwf   lpcnt           ;Save loop conut
            movlw   h'0f'           ;Set row index
            movwf   rowindex        ;Save index
    loop
            rlf     rowindex,w      ;Set selector data
            iorlw   h'01'           ;CLK bit = 1
            movwf   porta_work      ;Save porta data
            movwf   porta           ;Output row data + CLK=1
            movf    portb,w         ;Read portb data
            andlw   h'80'           ;Pick-up edge data
            movwf   edge            ;Save edge data
            movlw   scrnhd          ;Set table head address
            addwf   rowindex,w      ;Head + Index
            movwf   fsr             ;Set Table address
            movf    indf,w          ;Read Data
            andlw   h'7f'           ;Pick-up LED control data
            iorwf   edge,w          ;Edge data + LED data
            movwf   portb           ;Output data
            call    w_timing        ;Wait
            movf    porta_work,w    ;Read porta data
            andlw   h'fe'           ;Set CLK=0
            movwf   porta           ;Output data latch pulse
            call    w_timing        ;Wait
            decf    rowindex,f      ;Index - 1
            decfsz  lpcnt,f         ;Loop end ?
            goto    loop            ;No. Next row
            return                  ;Yes. Count end

    ;       <<< Timer  Subroutine for 10MHz clock  >>>

    ;************  LED control timing Subroutine  ***********
    ;                    < About 100 us >
    w_timing
           movlw   d'50'            ;Set loop count
    #ifndef _debug
           movwf   cnt_t            ;Save loop count
    w_loop
           nop                      ;Time adjust
           nop                      ;Time adjust
           decfsz  cnt_t,f          ;cnt_t-1=0 ?
           goto    w_loop           ;No. Continue
    #endif
           return                   ;Count end

    ;*************  1msec Timer Subroutine  *****************
    t1m     movlw   2               ;(1)       Set loop cnt1
    #ifndef _debug
            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
    #endif
            return                  ;(2)       Yes. Cnt end
                                    ;Total 2501*0.4usec=1msec

    ;*************  100msec Timer Subroutine  ***************
    t100m   movlw   d'100'          ;Set loop counter
    #ifndef _debug
            movwf   cnt100m         ;Save loop counter
    tm2lp   call    t1m             ;1msec subroutine
            decfsz  cnt100m,f       ;cnt100m - 1 = 0 ?
            goto    tm2lp           ;No. Continue
    #endif
            return                  ;Yes. Count end

    ;*************  500msec Timer Subroutine  ***************
    t500m   movlw   5               ;Set loop counter
    #ifndef _debug
            movwf   cnt500m         ;Save loop counter
    tm3lp   call    t100m           ;100msec subroutine
            decfsz  cnt500m,f       ;cnt500m - 1 = 0 ?
            goto    tm3lp           ;No. Continue
    #endif
            return                  ;Yes. Count end

    ;**************  1sec Timer Subroutine  *****************
    t1s     movlw   2               ;Set loop counter
    #ifndef _debug
            movwf   cnt1s           ;Save loop counter
    tm4lp   call    t500m           ;500msec subroutine
            decfsz  cnt1s,f         ;cnt1s - 1 = 0 ?
            goto    tm4lp           ;No. Continue
    #endif
            return                  ;Yes. Count end

    ;********************************************************
    ;          END of signboard 2 control processing
    ;********************************************************

            end