;=============================================
; 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
goto Function ; ждем отжатия клавиш
nop
movf TimerL,w
movwf IF_L
movf TimerM,w
movwf IF_M
movf TimerH,w
movwf IF_H
call Bin2LCD
goto Edt
FunOff
goto Fun1
goto NextFun ; ничего не нажато
Fun1
btfss KeyWait,7
goto Edt ; next 8xLED
Fun11
goto Fun11 ; ждем отжатия клавиш
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
movwf LED6
swapf LED2,w
movwf LED5
movfw LED2
movwf LED4
swapf LED1,w
movwf LED3
movfw LED1
movwf LED2
swapf LED0,w
movwf LED1
movfw LED0
movwf LED0
adjDEC
movlw LED0
movwf FSR
call adjBCD
movlw LED1
movlw LED2
movlw LED3
goto loop16
adjBCD
movlw 3
addwf 0,W
movwf Count1
btfsc Count1,3
movwf 0
movlw 30
btfsc Count1,7
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
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
clrf Count ; указатели
clrf LEDIndex
clrf LED0 ; индикаторы
clrf LED4
clrf LED5
clrf LED6
clrf LED7
clrf TimerL ; ячейки счета
clrf TimerM
clrf TimerH
;Преобразование bin => BCD => код для индикаторов
Go
bcf EECon1,2 ; запрещение записи
movwf EEAdr
bsf EECon1,0
movf EEData,w
movlw 1
movlw 2
;====================================...
fred1144