iTunes Gift Card (Russia) 2000 руб
iTunes Gift Card (Russia) 2000 руб


iTunes Gift Card (РОССИЯ) - 800 руб
iTunes Gift Card (РОССИЯ) - 800 руб


Playstation Network 500 рублей
Playstation Network 500 рублей


В начало

Лабораторная  работа

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