Pic16f630 и Pic16f84a: Таблица данных: включение символов на индикаторе

Здравствуйте, давайте изучим использование таблицы данных (table) в ассемблере для микроконтроллеров pic, для примера в pic16f630 будет выводить на индикаторе цифры от 0 до 6 по порядку с задержкой в 1 секунду, а для Pic16f84a выведем на индикаторе последовательно символы фразы “УРА”, затем символ
нижнего подчеркивания “_”, одновременно сформируем звуковой сигнал и зациклим нашу программу.

————————————————-
Пример для pic16f630 будет выводить на индикаторе цифры от 0 до 6 по порядку с задержкой в 1 секунду.
————————————————-

Скачать файлы для pic16f630: hex, inc, asm:


Скачать файлы.

Код для pic16f630 на ассемблере:

#include <P16F630.INC>
 __CONFIG (_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT)  ;Internal osc.

Reg_1 EQU 22
Reg_2 EQU 23
Reg_3 EQU 24
 
 org 0 ; 
 

 bsf STATUS,RP0 ; 
 clrf TRISC
 clrf TRISA
 bcf STATUS,RP0 ; 

 
m1
 clrf PORTC ; 
 movlw 0x0
 call TABLE ; 
 movwf PORTC
 movlw b'00000000'
 movwf PORTA
 call Pause
 movlw 0x1
 call TABLE ; 
 movwf PORTC
 movlw b'00000000'
 movwf PORTA
 call Pause
 movlw 0x2
 call TABLE ; 
 movwf PORTC
 movlw b'00000100'
 movwf PORTA
 call Pause
 movlw 0x3
 call TABLE ; 
 movwf PORTC
 movlw b'00000100'
 movwf PORTA
 call Pause
 movlw 0x4
 call TABLE ; 
 movwf PORTC
 movlw b'00000100'
 movwf PORTA
 call Pause
 movlw 0x5
 call TABLE ;
 movwf PORTC
 movlw b'00000100'
 movwf PORTA
 call Pause
 movlw 0x6
 call TABLE ; 
 movwf PORTC
 movlw b'00000100'
 movwf PORTA
 call Pause
 goto m1 ; 
 
;====================================
TABLE addwf PCL ; прибавляем к счетчику команд PCL порядковый номер элемента таблицы из аккумулятора W
 retlw b'00111111' ; 0
 retlw b'00100100' ; 1
 retlw b'00011110'; 2
 retlw b'00110110' ; 3
 retlw b'00100101' ; 4
retlw b'00110011' ; 5
 retlw b'00111011' ; 6
;====================================
 
;delay = 10000 machine cycles
Pause
       movlw       0x173
       movwf       Reg_1
       movlw       0x19
       movwf       Reg_2
       movlw       0x6
       movwf       Reg_3
wr          
       decfsz      Reg_1, 1
       goto        wr
       decfsz      Reg_2, 1
       goto        wr
       decfsz      Reg_3, 1
       goto        wr
       nop
return
 end ; 

Схема подключения для pic16f630:

PS: Так можно игральный кубик сделать, добавить кнопку и паузу длиннее при нажатии на неё.

———————————————————–
Пример для Pic16f84a выведем на индикаторе последовательно символы фразы “УРА”, затем символ
нижнего подчеркивания “_”, одновременно сформируем звуковой сигнал и зациклим нашу программу.
———————————————————–

Ниже приведен пример такой программы с использованием так называемой таблицы
символов. К таблице символов можно обращаться из любого места программы, что очень удобно и практично.

———————-
Заметка: почему-то для pic16f630 следующая строчка не работала:

TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W 

Заменил её на следующую и всё заработало:

TABLE addwf PCL ; Содержимое счетчика команд PC = PC + W 

———————-

LIST P=PIC16F84A
 __CONFIG H3FF1
PC EQU H0002
STATUS EQU H0003
PORTB EQU H0006
TRISB EQU H0006
Reg_1 EQU H000C
Reg_2 EQU H000D
Reg_3 EQU H000E

 org 0 ; начало программы 

; подготовительные моменты
 bsf STATUS,5 ; переход в Банк 1 
 clrf TRISB
 bcf STATUS,5 ; переход назад в Банк 0
; отрисовка фразы "УРА_" + звук

m1
 clrf PORTB ; очистка порта
 movlw .10
 call TABLE ; переход на метку TABLE
 movwf PORTB
 call Pause
 movlw .11
 call TABLE ; переход на метку TABLE
 movwf PORTB
 call Pause
 movlw .12
 call TABLE ; переход на метку TABLE
 movwf PORTB
 call Pause
 movlw .13
 call TABLE ; переход на метку TABLE
 movwf PORTB
 bsf PORTB,7 ; звук
 call Pause
.
 goto m1 ; переход на метку (зацикливание)

;====================================
TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W 
 retlw b01101111 ; 0
 retlw b00001100 ; 1
 retlw b01011011 ; 2
 retlw b01011110 ; 3
retlw b00111100 ; 4
 retlw b01110110 ; 5
 retlw b01110111 ; 6
 retlw b01001100 ; 7
 retlw b01111111 ; 8
 retlw b01111110 ; 9
 retlw b00111110 ; У
 retlw b01111001 ; Р
 retlw b01111101 ; А
 retlw b00000010 ; _
 retlw b00110101 ; h
;====================================

;delay = 500000 machine cycles
Pause 
 movlw .85
 movwf Reg_1
 movlw .138
 movwf Reg_2
 movlw .3
 movwf Reg_3
wr decfsz Reg_1, F
 goto wr
 decfsz Reg_2, F
 goto wr
 decfsz Reg_3, F
 goto wr
 return
 end ; конец программы

В сегмент таблицы в программе включены символы цифр. Если нам нужны другие символы,
мы можем расширить эту таблицу.
Внимательно изучив текст программы – мы увидим однотипность выполняемых действий. В
сегменте отрисовки копируем в аккумулятор W число (последовательно 10, 11, 12, 13). Затем
отправляемся в сегмент таблицы. С помощью команды addwf PC,F мы складываем
содержимое аккумулятора с регистром PC (в этом регистре у МК реализован аппаратный
счетчик команд). В результате сложения счетчик увеличивается на величину, которая у нас
содержится в аккумуляторе W и происходит переход на соответствующую команду в таблице.
По команде retlw bхххххххх мы помещаем в аккумулятор указанное число (bхххххххх) и
возвращаемся назад в сегмент отрисовки. Указанное число представляет собой комбинацию
битов, которое затем записывается в порт и приводит к отображению осмысленного символа.
Строго говоря, поставленную в примере задачу можно было бы решить гораздо проще, без
таблицы символов и лишних скачков по тексту программы. Однако, этот пример показывает
классический подход к работе с символами. Обоснуем это. Например, работа двух кнопок
может выполнять функцию увеличения и уменьшения значения какого либо регистра.
Мониторинг значения этого регистра мы можем в автоматическом режиме осуществлять
через индикатор. Как видим из этого примера, число в регистре в любой момент времени
может принять любое значение и, следовательно, значение непредсказуемо. Но это не
препятствие, т.к. это значение будет автоматически обрабатываться и без таблицы символов в
этом случае не обойтись.
Важный момент в этом примере заключается в том, что перемещение в таблице происходит
за счет принудительного увеличения аппаратного счетчика команд.

Добавить комментарий