Пример 3. Включение символов на индикатореБольшой практический интерес представляет включение группы светодиодов, которые в совокупности образуют понятные на бытовом уровне символы. Во-первых, это цифры от нуля до девяти. Во-вторых, это некоторые кириллические и латинские буквы. В-третьих, это специфичные символы, например, нижнего подчеркивания "_", знака равно "=" и пр. Наличие таких возможностей в программе определяет совершенство и привлекательность разрабатываемого устройства.
Чтобы повысить уровень вашего интереса к этой теме обратимся к простому примеру из жизни. Многие товары в магазинах бытовой техники имеют встроенные индикаторы, например, стиральные машинки. Почти такая же модель стиральной машинки, но без индикатора, будет стоить на 20-30% дешевле. И разница эта совсем не копеечная. Мы же эти знания получим за сущие копейки.
Опыт и практика полученные в предыдущих примерах позволят вам создать следующую программу. Отрисуем на индикаторе последовательно символы фразы "УРА", затем символ нижнего подчеркивания "_", одновременно сформируем звуковой сигнал и зациклим нашу программу.
Ниже приведен пример такой программы с использованием так называемой таблицы символов. К таблице символов можно обращаться из любого места программы, что очень удобно и практично.
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 ; конец программы
Далее текст прошивки:
:020000040000FA
:1000000083168601831286010A3016208600262078
:100010000B301620860026200C3016208600262065
:100020000D301620860086172620032882076F349D
:100030000C345B345E343C34763477344C347F3467
:100040007E343E3479347D340234353455308C007E
:100050008A308D0003308E008C0B2C288D0B2C28C1
:060060008E0B2C280800A5
:02400E00F13F80
:00000001FF
В сегмент таблицы в программе включены символы цифр. Если нам нужны другие символы, мы можем расширить эту таблицу.
Внимательно изучив текст программы – мы увидим однотипность выполняемых действий. В сегменте отрисовки копируем в аккумулятор W число (последовательно 10, 11, 12, 13). Затем отправляемся в сегмент таблицы. С помощью команды addwf PC,F мы складываем содержимое аккумулятора с регистром PC (в этом регистре у МК реализован аппаратный счетчик команд). В результате сложения счетчик увеличивается на величину, которая у нас содержится в аккумуляторе W и происходит переход на соответствующую команду в таблице. По команде retlw bхххххххх мы помещаем в аккумулятор указанное число (bхххххххх) и возвращаемся назад в сегмент отрисовки. Указанное число представляет собой комбинацию битов, которое затем записывается в порт и приводит к отображению осмысленного символа.
Строго говоря, поставленную в примере задачу можно было бы решить гораздо проще, без таблицы символов и лишних скачков по тексту программы. Однако, этот пример показывает классический подход к работе с символами. Обоснуем это. Например, работа двух кнопок может выполнять функцию увеличения и уменьшения значения какого либо регистра. Мониторинг значения этого регистра мы можем в автоматическом режиме осуществлять через индикатор. Как видим из этого примера, число в регистре в любой момент времени может принять любое значение и, следовательно, значение непредсказуемо. Но это не препятствие, т.к. это значение будет автоматически обрабатываться и без таблицы символов в этом случае не обойтись.
Важный момент в этом примере заключается в том, что перемещение в таблице происходит за счет принудительного увеличения аппаратного счетчика команд.
Наше устройство станет более интересным и привлекательным если в нем будут задействованы кнопки. Это будет не безликая мигалка-пищалка, а послушное устройство, способное быть управляемым, а самое главное – быть полезным и выполнять необходимые функции.
|