Здравствуйте, давайте изучим использование таблицы данных (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хххххххх) и
возвращаемся назад в сегмент отрисовки. Указанное число представляет собой комбинацию
битов, которое затем записывается в порт и приводит к отображению осмысленного символа.
Строго говоря, поставленную в примере задачу можно было бы решить гораздо проще, без
таблицы символов и лишних скачков по тексту программы. Однако, этот пример показывает
классический подход к работе с символами. Обоснуем это. Например, работа двух кнопок
может выполнять функцию увеличения и уменьшения значения какого либо регистра.
Мониторинг значения этого регистра мы можем в автоматическом режиме осуществлять
через индикатор. Как видим из этого примера, число в регистре в любой момент времени
может принять любое значение и, следовательно, значение непредсказуемо. Но это не
препятствие, т.к. это значение будет автоматически обрабатываться и без таблицы символов в
этом случае не обойтись.
Важный момент в этом примере заключается в том, что перемещение в таблице происходит
за счет принудительного увеличения аппаратного счетчика команд.


