МК

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