|
В начало
Лабораторная работа Работа с клавиатурой 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-ми кнопочной и реализовали индикацию нажатий клавиш а так же функцию
антидребезга клавиатуры. |
|