В начало

Динамическая индикация на PIC16F627 (Лабораторная работа)

 

Задание

Необходимо обеспечить последовательную индикацию чисел от 0 до FFh с помощью 2-х 7-ми сегментных индикаторов. Индикаторы подключены к порту B, причем старшие 7-битов подключены к сегментам, а младший бит обеспечивает выбор младшего или старшего индикатора: 0-младший, 1-старший.

Зажигание сегмента производится логическим 0. Смена значений на индикаторе должна производится с частотой около 2 Гц.

Тактовая частота устройства 8 МГц.

Светодиоды подключены к порту B.

 

Краткие теоретические сведения

Для выполнения косвенной адресации необходимо обратиться к физически нереализованному регистру INDF.

Обращение к регистру INDF фактически вызовет действие с регистром, адрес которого указан в FSR. Косвенное чтение

регистра INDF (FSR=0) даст результат 00h. Косвенная запись в регистр INDF не вызовет никаких действий (вызывает

воздействия на флаги АЛУ в регистре STATUS). 9-бит косвенного адреса IRP сохраняется в регистре STATUS<7>.

Листинг 1. Пример косвенной адресации

BCF STATUS, IRP ; Установить банк 0,1

MOVLW 0x20 ; Указать первый регистр в ОЗУ

MOVWF FSR

NEXT:

CLRF INDF ; Очистить регистр

INCF FSR,F ; Увеличить адрес

BTFSS FSR,4 ; Завершить?

GOTO NEXT ; Нет, продолжить очистку

CONTINUE:

; Да

 

Листинг 2. Текст программы

list p=16f627 ; list directive to define processor

      #include P16f627.inc

      errorlevel -302

      cblock      20

temp       

w_temp

status_temp

MY_FLAGS

      endc

#define     CLOCK_05 MY_FLAGS, 0                                 

            org   0x00

            goto main

           

            org   0x04

            goto services

main

      banksel 27h

      movwf 27h

      banksel T2CON

      movlw b'01111111'

      movwf T2CON

      banksel PR2

      movlw .244

      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 PORTB

     

      ;настраиваем таймер

      movlw b'001001'

      movwf T1CON

      ;задамем массив данных

      movlw 40h

      movfw FSR

      ;0

      movlw b'00010000'

      movwf INDF

      incf FSR,f

      ;1

      movlw b'01111100'

      movwf INDF

      incf FSR,f 

      ;2

      movlw b'00100010'

      movwf INDF

      incf FSR,f 

      ;3

      movlw b'00101000'

      movwf INDF

      incf FSR,f 

      ;4

      movlw b'01001100'

      movwf INDF

      incf FSR,f 

      ;5

      movlw b'10101000'

      movwf INDF

      incf FSR,f 

      ;6

      movlw b'10000000

      movwf INDF

      incf FSR,f 

      ;7

      movlw b'00111100'

      movwf INDF

      incf FSR,f 

      ;8

      movlw b'00000000'

      movwf INDF

      incf FSR,f 

      ;9

      movlw b'00001000'

      movwf INDF

      incf FSR,f

      ;A

      movlw b'00000100'

      movwf INDF

      incf FSR,f 

      ;B

      movlw b'11000000'

      movwf INDF

      incf FSR,f 

      ;C

      movlw b'10010010'

      movwf INDF

      incf FSR,f

      ;D

      movlw b'01100000'

      movwf INDF

      incf FSR,f

      ;E

      movlw b'10000010'

      movwf INDF

      incf FSR,f 

      ;F

      movlw b'10000110'

      movwf INDF

main_1

      ;обнуляем регистр

      movlw 40h

      movfw FSR

      ;младший разряд

      movlw 40h

      movfw 30h

      ;старший разряд

      movlw 40h

      movfw 31h

      ;счетчик внутреннего цикла

      movlw .16

      movwf 32h

      ;счетчик внешнего цикла

      movlw .16

      movwf 33h

     

start

      btfss MY_FLAGS, 0

      goto  start

            ;внутренний цикл, изменяем младший разряд от 0 до FF

            bcf         MY_FLAGS, 0

            movfw       30h

            movwf FSR

            movfw INDF

            movwf       PORTB

            incf 30h,f

            decfsz      32h,f

      goto start

      ;внешний цикл, изменяем старший разряд от 0 до FF

      movlw 40h

      movlw       b'00010000' ;обнуляем младший разряд

     

      movwf PORTB

      movlw       .16 ;задаем счетчик внутреннего цикла

      movwf       32h

     

      movfw       31h

      movwf FSR

      movfw INDF

      movwf       PORTB

      incf 31h,f

      decfsz      33h,f

      goto start

 

goto main_1

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 ;часы, создают прерывание каждые 25Гц

      bcf         PIR1, TMR2IF

      decfsz      27h, F

      goto  services_end

      bsf         CLOCK_05

      movlw .16

      banksel 27h

      movwf 27h

 

goto main

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

            end

                       

Выводы по работе: в ходе работы были изучены 7-сегментные индикаторы. Для хранения данных мы использовали одномерный массив данных. Для работы с массивами лучше всего использовать косвенную адресация – регистры INDF и FSR.

 

Tom Clancys The Division
Tom Clancys The Division


LEGO: The Hobbit
LEGO: The Hobbit


Civilization-5: Brave New World
Civilization-5: Brave New World