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