Приветствую! Есть готовая программа (ниже) и схема счётчика (импульсов или замыканий кнопки и т.д.)
http://cdrecords.narod.ru/Count.pdf . При каждом нажатии на кнопку SW5 счётчик уменьшается на 1, а при нажатии на SW3, счётчик увеличивается на 1. Кнопками SW1, SW2, SW4, SW8 устанавливаются начальные показания счётчика (удобно при работе счётчика в режиме уменьшения). При достижении счётчиком нулевых значений, загорается светодиод. Предлагается добавить 2 кнопки на свободные выводы, например на RB6 и RA4 . Первая кнопка записывает набранные значения на индикаторе в память EEPROM , вторая кнопка выводит значения из памяти на индикатор (чтобы каждый раз не набирать необходимые значения заново). А может быть даже можно обойтись одной кнопкой подключённой к RB6. Короткое нажатие записывает значение на индикаторе в память, а длительное нажатие выводит показания из памяти на индикатор. Что для этого лучше изменить в программе?
С уважением, Александр
list p=16f84
include "P16F84A.inc"
__config _RC_OSC & _WDT_OFF & _PWRTE_ON
;Описание портов ввода/вывода (табл. 16)
;Вывод
ANODE equ PORTA
bFig1 equ 3 ;RA3 (выв. 2)
bFig2 equ 2 ;RA2 (выв. 1)
bFig3 equ 1 ;RA1 (выв. 1
bFig4 equ 0 ;RA0 (выв. 17)
mANODE equ (1‹‹bFig1)|(1‹‹bFig2)|(1‹‹bFig3)|(1‹‹bFig4)
DCD equ PORTB
mDCD equ B'00001111' ;RB0-RB3 (выв. 6-9)
;Ввод
SENSORS equ PORTB
bKey equ 6 ;RB6 (выв. 12)
bSEN1 equ 5 ;RB5 (выв. 11)
bSEN2 equ 4 ;RB4 (выв. 10)
mSEN1 equ 1‹‹bSEN1
mSEN2 equ 1‹‹bSEN2
mSENS equ mSEN1+mSEN2
MaxInt equ (.31*4)-1
;Переменные (табл. 17)
cblock H'0C'
W_copy
STATUS_copy
FSR_copy
SensPos
FigPtr
Fig1
Fig2
Fig3
Fig4
FigSel
IntCtr ;счетчик прерываний
Alarm ;сигнал перехода 1-›0
endc
;Возможные состояния датчиков
Pos0 equ 0
Pos1 equ mSEN1
Pos2 equ mSENS
Pos3 equ mSEN2
;Макроопределения
;Узел алгоритма (табл. 7)
NODE macro pp1,nn1,pp2,nn2,pp3,nn3
local NO
NO movfw SENSORS
andlw mSENS
movwf SensPos
xorlw pp1
BZ nn1
movfw SensPos
xorlw pp2
BZ nn2
movfw SensPos
xorlw pp3
BZ nn3
goto NO
endm
INCR macro Fig
local Lab
movfw Fig
addlw -9
BZ Lab
incf Fig,f
return
Lab clrf Fig
endm
DECR macro Fig
local Lab
movf Fig,f
BZ Lab
decf Fig,f
return
Lab movlw 9
movwf Fig
endm
SetLeft macro
movlw Fig1
movwf FigPtr
movlw B'00001000'
movwf FigSel
endm
;Начало исполняемого кода
org 0
goto START
org 4
;Обслуживание прерывания
;по переполнению таймера (табл. 19)
T0SERV movwf W_copy
movf STATUS,w
movwf STATUS_copy
movf FSR,w
movwf FSR_copy
;
decfsz IntCtr,f
goto Proceed
movlw MaxInt
movwf IntCtr
btfsc SENSORS,bKey
goto Proceed
btfsc FigSel, bFig2
call INCR1
btfsc FigSel, bFig3
call INCR2
btfsc FigSel, bFig4
call INCR3
btfsc FigSel, bFig1
call INCR4
Proceed
;
clrf ANODE
movfw FigPtr
movwf FSR
movfw INDF
; iorlw ~mDCD
iorwf Alarm,w
movwf DCD
movfw FigSel
movwf ANODE
incf FigPtr,f
bcf STATUS,C
rrf FigSel,f
btfss STATUS,C
goto ENDINT
SetLeft
ENDINT movf FSR_copy,w
movwf FSR
movf STATUS_copy,w
movwf STATUS
swapf W_copy,f
swapf W_copy,w
bcf INTCON,T0IF
retfie
;
INCR1 INCR Fig1
return
INCR2 INCR Fig2
return
INCR3 INCR Fig3
return
INCR4 INCR Fig4
return
;Инициализация (табл. 1
START clrf ANODE
bsf STATUS,RP0
clrf TRISA
movlw B'01110000'
movwf TRISB
;movlw B'00000010'
;movwf OPTION_REG
bcf OPTION_REG,NOT_RBPU
bcf OPTION_REG,T0CS
bcf STATUS,RP0
SetLeft
clrf Fig1
clrf Fig2
clrf Fig3
clrf Fig4
movlw MaxInt
movwf IntCtr
clrf Alarm
bsf INTCON,T0IE
bsf INTCON,GIE
;Основной цикл (табл. 10)
;-----------------------------------------
;picmaniac's code
WP1 btfss PORTB,bSEN1 ;Проверим вход увеличения (активный - высокий)
goto WM1 ;Лог.0 - переход на проверку другого входа
call Pause ;Пауза от дребезга
btfss PORTB,bSEN1 ;Повторная проверка
goto WM1 ;Дребезг - переход
;-----------------------------------------
;ND0 NODE Pos1,ND1,Pos3,ND4,Pos2,ND0
;ND1 NODE Pos2,ND2,Pos0,ND0,Pos3,ND0
;ND2 NODE Pos3,ND3,Pos1,ND1,Pos0,ND0
;ND3 NODE Pos0,ND3A,Pos2,ND2,Pos1,ND0
ND3A bcf INTCON,GIE
call ADD1
bsf INTCON,GIE
clrf Alarm
;-----------------------------------------
;picmaniac's code
WP2 btfsc PORTB,bSEN1 ;Ждем, пока пройдет сигнал по входу увеличения
goto WP2 ;
call Pause ;Пауза от дребезга
btfsc PORTB,bSEN1 ;
goto WP2 ;
WM1 btfss PORTB,bSEN2 ;Проверим вход уменьшения (активный - высокий)
goto WP1 ;Лог.0 - переход на проверку другого входа
call Pause ;Пауза от дребезга
btfss PORTB,bSEN2 ;Повторная проверка
goto WP1 ;Дребезг - переход
;-----------------------------------------
;ND4 NODE Pos2,ND5,Pos0,ND0,Pos1,ND0
;ND5 NODE Pos1,ND6,Pos3,ND4,Pos0,ND0
;ND6 NODE Pos0,ND6S,Pos2,ND5,Pos3,ND0
ND6S bcf INTCON,GIE
call SUBT1
bsf INTCON,GIE
;
clrf Alarm
movf Fig1,w
addwf Fig2,w
addwf Fig3,w
addwf Fig4,w
btfsc STATUS,Z
bsf Alarm,7
;-----------------------------------------
;picmaniac's code
WM2 btfsc PORTB,bSEN2 ;Ждем, пока пройдет сигнал по входу уменьшения
goto WM2 ;
call Pause ;Пауза от дребезга
btfsc PORTB,bSEN2 ;
goto WM2 ;
goto WP1
;-----------------------------------------
;Подпрограммы (табл. 13)
ADD1 INCR Fig4
INCR Fig3
INCR Fig2
INCR Fig1
return
SUBT1 DECR Fig4
DECR Fig3
DECR Fig2
DECR Fig1
return
;-----------------------------------------
;picmaniac's code
Pause movlw 0
P_label addlw 1
nop
btfss STATUS,Z
goto P_label
return
;-----------------------------------------
end