DigiScal.doc

(95 KB) Pobierz
;=============================================

;=============================================

; DigiScal.asm

; Цифровая шкала с возможностью

; записи промежуточной частоты

; Денисов А.Ю. Тамбов 1999

; Исправлена ошибка в расчете частоты 16.11.2000

;=============================================

;

        LIST    p=16F84

       __CONFIG 03FF1H

;=============================================

                                   ; значения задержки

                                   ; могут быть от 1 до 255

T1          equ       .67          ; грубо

T2          equ       .221         ; точно

                                   ; (подобрано для 4000 kHz)

;=============================================

;

IndF        equ        00h         ; Доступ к памяти через FSR

Timer0      equ        01h         ; TMR0

OptionR     equ        01h         ; Option (RP0=1)

PC          equ        02h         ; Счетчик команд

Status      equ        03h         ; Status

FSR         equ        04h         ; Регистр косвенной адресации

PortA       equ        05h         ; Port A

TrisA       equ        05h         ; Tris A - RP0=1

PortB       equ        06h         ; Port B

TrisB       equ        06h         ; Tris B - RP0=1

EEData      equ        08h         ; EEPROM Data

EECon1      equ        08h         ; EECON1 - RP0=1

EEAdr       equ        09h         ; EEPROM Address

EECon2      equ        09h         ; EECON2 - RP0=1

 

IntCon      equ        0Bh         ;

;

KeyBuf      equ        0Ch         ; буфер клавиатуры

KeyWait     equ        0Dh         ; ожидание клавиатуры

Count       equ        0Eh         ; временный счетчик

Count1      equ        0Fh         ; еще один

;

LED0        equ       010h         ;

LED1        equ       011h         ;

LED2        equ       012h         ;

LED3        equ       013h         ; ячейки

LED4        equ       014h         ; индикатора

LED5        equ       015h         ;

LED6        equ       016h         ;

LED7        equ       017h         ;

;

Temp        equ       018h         ; временный регистр

LEDIndex    equ       019h         ; указатель LED

 

TimerL      equ       01ah         ; младший байт счетчика частоты

TimerM      equ       01bh         ; средний байт счетчика частоты

TimerH      equ       01ch         ; старший байт счетчика частоты

 

IF_L        equ       01dh         ; младший байт ПЧ

IF_M        equ       01eh         ; средний байт ПЧ

IF_H        equ       01fh         ; старший байт ПЧ

;

;=============================================

;                                    Результат в

W           equ        0           ; аккумуляторе

F           equ        1           ; регистре

;

;=============================================

; Flag bits:

CF          equ        0           ; Carry

DC          equ        1           ; DC

ZF          equ        2           ; Zero

;

RP0         equ        5

;=============================================

            org        2100h

 

            ; частота ПЧ по умолчанию

            DE         008h,064h,070h   ; 5.5 мгц

;

            DE         0h,0h,0h

            DE      "Copyright (C) 1999 Alexander Y Denisov"

 

;

;=============================================

;

            org        0

            goto    Start

;

;=============================================

; Проверка клавиатуры

;=============================================

;

Inkey

            clrf       PortA       ; RA0..RA3 = 0

 

            bsf        Status,RP0

            movlw      b'00010011'

            movwf      TrisA       ; RA0,RA1,RA4 input

            bcf        Status,RP0  ;

 

            movf       PortA,w

            andlw      b'00000011'

            return

;

;=============================================

KeyQuery    ; опрос клавиатуры

            call       Inkey

            addwf      PC,f

           goto       Fun         ; режим установки ПЧ

            goto       plusIF      ; плюс ПЧ

            goto       minusIF     ; минус ПЧ

            goto       Go1         ; и все по новой.

;

Fun

            incf       KeyWait,f

            btfss      KeyWait,3

            goto       Go

 

            movlw      0

            movwf      KeyWait

Function

            call       Inkey

            addwf      PC,f

            goto       Function    ; ждем отжатия клавиш

            nop

            nop

            nop

            movf       TimerL,w

            movwf      IF_L

            movf       TimerM,w

            movwf      IF_M

            movf       TimerH,w

            movwf      IF_H

            call       Bin2LCD

            goto       Edt

;

;=============================================

;

FunOff

            call       Inkey

            addwf      PC,f

            goto       Fun1

            goto       NextFun     ; ничего не нажато

            goto       NextFun     ; ничего не нажато

            goto       NextFun     ; ничего не нажато

Fun1

            incf       KeyWait,f

            btfss      KeyWait,7

            goto       Edt         ; next 8xLED

Fun11

            call       Inkey

            addwf      PC,f

            goto       Fun11       ; ждем отжатия клавиш

            goto       WrtMem      ; запись в память

            goto       WrtMem      ; запись в память

            goto       WrtMem      ; запись в память

;

;=============================================

; Перекодирование двоичного в код LCD

;=============================================

;

Bin2LCD

            bcf        Status,0    ; clear the carry bit

            movlw      .24

            movwf      Count

            clrf       LED3

            clrf       LED2

            clrf       LED1

            clrf       LED0

loop16

            rlf        TimerL,f

            rlf        TimerM,f

            rlf        TimerH,f

            rlf        LED0,f

            rlf        LED1,f

            rlf        LED2,f

            rlf        LED3,f

;

            decfsz     Count,f

            goto       adjDEC

 

            swapf      LED3,w

            andlw      0Fh

            movwf      LED7

 

            movfw      LED3

            andlw      0Fh

            movwf      LED6

 

            swapf      LED2,w

            andlw      0Fh

            movwf      LED5

 

            movfw      LED2

            andlw      0Fh

            movwf      LED4

 

            swapf      LED1,w

            andlw      0Fh

            movwf      LED3

 

            movfw      LED1

            andlw      0Fh

            movwf      LED2

 

            swapf      LED0,w

            andlw      0Fh

            movwf      LED1

 

            movfw      LED0

            andlw      0Fh

            movwf      LED0

 

            return

;

adjDEC

            movlw      LED0

            movwf      FSR

            call       adjBCD

;

            movlw      LED1

            movwf      FSR

            call       adjBCD

;

            movlw      LED2

            movwf      FSR

            call       adjBCD

;

            movlw      LED3

            movwf      FSR

            call       adjBCD

;

            goto       loop16

;

adjBCD

            movlw      3

            addwf      0,W

            movwf      Count1

            btfsc      Count1,3

            movwf      0

            movlw      30

            addwf      0,W

            movwf      Count1

            btfsc      Count1,7

            movwf      0

;

            retlw      0

;

;=============================================

; Преобразование BCD -> 7 сегментный код

;=============================================

 

LCDTable

            addwf      PC,F        ; W + PC -> PC

            retlw      b'00111111' ; ..FEDCBA = '0'

            retlw      b'00000110' ; .....CB. = '1'

            retlw      b'01011011' ; .G.ED.BA = '2'

            retlw      b'01001111' ; .G..DCBA = '3'

            retlw      b'01100110' ; .GF..CB. = '4'

            retlw      b'01101101' ; .GF.DC.A = '5'

            retlw      b'01111101' ; .GFEDC.A = '6'

            retlw      b'00000111' ; .....CBA = '7'

            retlw      b'01111111' ; .GFEDCBA = '8'

            retlw      b'01101111' ; .GF.DCBA = '9'

            retlw      b'01110001' ; .GFE...A = 'F'

;

;=============================================

;Main program

;

Start

            bsf        Status,RP0

 

            movlw      b'00010000' ; RA0..RA3 outputs

            movwf      TrisA       ; RA4 input

 

            movlw      b'00000000' ; RB0..RB7 outputs

            movwf      TrisB

 

            clrwdt                 ;

            movlw      b'00100111' ; Prescaler -> Timer0,

            movwf      OptionR     ; 1:256, rising edge

            bcf        Status,RP0  ;

 

            clrf       Count       ; указатели

            clrf       LEDIndex

 

            clrf       LED0        ; индикаторы

            clrf       LED1

            clrf       LED2

            clrf       LED3

            clrf       LED4

            clrf       LED5

            clrf       LED6

            clrf       LED7

 

            clrf       TimerL      ; ячейки счета

            clrf       TimerM

            clrf       TimerH

 

;=============================================

;Преобразование bin => BCD => код для индикаторов

;

Go

            bcf        EECon1,2    ; запрещение записи

            movlw      0

            movwf      EEAdr

            bsf        Status,RP0

            bsf        EECon1,0

            bcf        Status,RP0  ;

            movf       EEData,w

            movwf      IF_H

 

            movlw      1

            movwf      EEAdr

            bsf        Status,RP0

            bsf        EECon1,0

            bcf        Status,RP0  ;

            movf       EEData,w

            movwf      IF_M

 

            movlw      2

            movwf      EEAdr

            bsf        Status,RP0

            bsf        EECon1,0

            bcf        Status,RP0  ;

            movf       EEData,w

            movwf      IF_L

 

            call       Bin2LCD

;

;====================================...

Zgłoś jeśli naruszono regulamin