МК
Работа с клавиатурой TMR2 (Лабораторная
работа)
Задание
Реализовать
опрос 8-ми клавиш подключенных к порту B. Необходимо реализовать программную
процедуру антидребезга нажатий. Клавиш необходимо идентифицировать с помощью
4-х светодиодов. Если ни одна не нажата, или нажато одновременно несколько
клавиш, то индикация должна отсутствовать.
Краткие теоретические сведения
Модуль таймера TMR2
TMR2 – 8-разрядный таймер с программируемыми
предделителем и выходным делителем, 8-разрядным
регистром периода PR2. TMR2 может быть опорным
таймером для CCP модуля в ШИМ режиме. Регистры TMR2
доступны для записи/чтения и очищаются при любом виде
сброса.
Входной тактовый сигнал (FOSC/4) поступает через
предделитель с программируемым коэффициентом деления
(1:1, 1:4 или 1:16), определяемый битами
T2CKPS1:T2CKPS0 (T2CON<1:0>).
TMR2 считает инкрементируя от 00h до значения в
регистре PR2, затем сбрасывается в 00h на следующем
машинном цикле. Регистр PR2 доступен для записи и
чтения. После сброса значение регистра PR2 равно FFh.
Сигнал переполнения TMR2 проходит через выходной
4-разрядный делитель с программируемым
коэффициентом деления (от 1:1 до 1:16 включительно)
для установки флага TMR2IF в регистре PIR1<1>.
Для уменьшения энергопотребления таймер TMR2 может
быть выключен сбросом бита TMR2ON (T2CON<2>) в
‘0’.
Предделитель и выходной делитель TMR2
Счетчик предделителя и выходного делителя сбрасываются
в случае:
- записи в регистр TMR2;
- записи в регистр T2CON;
- любого вида сброса микроконтроллера (POR, BOR, сброс
WDT или активный сигнал -MCLR).
Регистр TMR2 не очищается при записи в T2CON.
Сигнал TMR2
Сигнал переполнения TMR2 (до выходного предделителя)
поступает в модуль SSP для управления скоростью
передачи данных (в микроконтроллерах PIC16F62X модуля
SSP нет).
Таблица. Код программы
list
p=16f627 ; list directive to define processor
#include P16f627.inc
errorlevel -302
cblock 20
temp
w_temp
status_temp
MY_FLAGS
CLOCK_LOOP_COUNTER
PRESSED_KEY_COUNT
KEY_CODE_BUFFER
LOOP_COUNTER
PRV_CODE_BUFFER
endc
org 0x00
goto main
org 0x04
goto services
main
banksel CLOCK_LOOP_COUNTER
movwf CLOCK_LOOP_COUNTER
banksel T2CON
movlw b'01111111'
movwf T2CON
banksel PR2
movlw .1
movwf PR2
;настройка системы
прерываний
banksel PIE1
bsf PIE1, TMR2IE
banksel PIR1
bcf PIR1, TMR2IF
bsf INTCON, PEIE
bsf INTCON, GIE
banksel TRISB
movlw b'00000000'
movwf TRISB
movlw b'11100000'
movwf INTCON
banksel TRISA
movlw b'000011111'
movwf TRISA
;настраиваем таймер
movlw b'001001'
movwf T1CON
movlw .10
movwf LOOP_COUNTER
start
btfss MY_FLAGS, 0
goto start
bcf MY_FLAGS, 0
movfw KEY_CODE_BUFFER
movwf PRV_CODE_BUFFER
movfw PORTB
btfss PORTB,0
goto label_0
incf 30h,f
movlw b'00000000'
label_0
btfss PORTB,1
goto label_1
incf PRESSED_KEY_COUNT,f
movlw b'00000001'
label_1
btfss PORTB,2
goto label_2
incf PRESSED_KEY_COUNT,f
movlw b'00000010'
label_2
btfss PORTB,3
goto label_3
incf PRESSED_KEY_COUNT,f
movlw b'00000011'
label_3
btfss PORTB,4
goto label_4
incf PRESSED_KEY_COUNT,f
movlw b'00000100'
label_4
btfss PORTB,5
goto label_5
incf PRESSED_KEY_COUNT,f
movlw b'00000101'
label_5
btfss PORTB,6
goto label_6
incf PRESSED_KEY_COUNT,f
movlw b'00000110'
label_6
btfss PORTB,7
goto label_7
incf PRESSED_KEY_COUNT,f
movlw b'00000111'
label_7
movwf KEY_CODE_BUFFER
movfw PRESSED_KEY_COUNT
sublw .1
btfss STATUS,Z
goto start
movfw KEY_CODE_BUFFER
andwf PRV_CODE_BUFFER
btfsc STATUS,Z
goto start
decfsz LOOP_COUNTER,f
goto start
movlw .10
movwf LOOP_COUNTER
movfw KEY_CODE_BUFFER
movwf PORTA
goto start
services
movwf w_temp ; save off current W register
contents
movf STATUS,w ; move status register into W
register
movwf status_temp ; save off contents of
STATUS register
banksel PIR1
btfss PIR1, TMR2IF
goto services_end
services_tmr2
;часы
bcf PIR1, TMR2IF
decfsz CLOCK_LOOP_COUNTER, F
goto services_end
bsf MY_FLAGS, 0
movlw .16
banksel CLOCK_LOOP_COUNTER
movwf CLOCK_LOOP_COUNTER
;
isr code can go here or be located as a call subroutine elsewhere
services_end
movf status_temp,w ; retrieve copy of STATUS
register
movwf STATUS ; restore pre-isr STATUS
register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register
contents retfie ; return from interrupt
retfie
end
|
Выводы
В
данной лабораторной работе мы работали с 8-ми кнопочной и реализовали индикацию
нажатий клавиш а так же функцию антидребезга клавиатуры.