а) Скопировать содержимое HUNDREDS в W и преобразовать его в 7-сегментный код.
б) Вывести полученный код в порт В.
в) Сформировать импульс
3. ВЫПОЛНЯТЬ:
а) Скопировать содержимое TENS в W и преобразовать его в 7-сегментный код.
б) Вывести полученный код в порт В.
в) Сформировать импульс
4. ВЫПОЛНЯТЬ:
а) Скопировать содержимое UNITS в W и преобразовать его в 7-сегментный код.
б) Вывести полученный код в порт В.
в) Сформировать импульс
Код, реализующий этот алгоритм, приведен в Программе 11.9.
; Задача 1 ----------
DISPLAY movf BINARY,w; Берем двоичное значение
call BIN_2_BCD; Преобразуем его в три BCD-разряда
; Задача 2 ----------
movf HUNDREDS,w; Берем число сотен
call SVN_SEG; Преобразуем в 7-сегментный код
movwf PORTB; Высылаем в порт В
bsf PORTA,2; Заносим в регистр
bcf PORTA,2
; Задача 3 ----------
movf TENS,w; Берем число десятков
call SVN_SEG; Преобразуем в 7-сегментный код
movwf PORTB; Высылаем в порт В
bsf PORTA,1; Заносим в регистр
bcf PORTA,1
; Задача 4 ----------
movf UNITS,w; Берем число единиц
call SVN_SEG; Преобразуем в 7-сегментный
movwf PORTB; Высылаем в порт В
bsf PORTA,0; Заносим в регистр
bcf PORTA,0
Управление схемой, показанной на Рис. 11.16, несколько сложнее, поскольку в ней отсутствуют регистры, хранящие данные! Поэтому данные необходимо непрерывно выдавать друг за другом одновременно с включением соответствующего индикатора. Если мы собираемся обновлять изображение 100 раз в секунду, то перед переходом к следующему знакоместу эти данные должны удерживаться в течение 10 мс. Таким образом, мы получаем новый алгоритм:
1. Преобразовать двоичное однобайтное число в BCD-формат.
2. ВЫПОЛНЯТЬ бесконечно:
а)
• Скопировать содержимое HUNDREDS в W и преобразовать его в 7-сегментный код.
• Выдать полученный код в порт В.
• Выставить на RA2 НИЗКИЙ уровень
• Подождать 10 мс.
• Выставить на RA2 ВЫСОКИЙ уровень
б)
• Скопировать содержимое TENS в W и преобразовать его в 7-сегментный код.
• Выдать полученный код в порт В.
• Выставить на RA1 НИЗКИЙ уровень
• Подождать 10 мс.
• Выставить на RA1 ВЫСОКИЙ уровень
в)
• Скопировать содержимое UNITS в W и преобразовать его в 7-сегментный код.
• Выдать полученный код в порт В.
• Выставить на RA0 НИЗКИЙ уровень
• Подождать 10 мс.
• Выставить на RA0 ВЫСОКИЙ уровень
В коде, приведенном в Программе 11.10, используется подпрограмма формирования 10-мс задержки, которую мы использовали в Программе 11.7 для задания скорости сканирования. За исключением длительности импульса разрешения, основная часть программы идентична предыдущей. Однако чтобы цифры на дисплее светились постоянно, код программы должен выполняться непрерывно. В этом и заключается компромисс между затратами на аппаратную и программную части. Действительно, как уже было показано, все ресурсы микроконтроллера PIC уйдут на обслуживание индикатора! На самом деле ситуацию может спасти прерывание микроконтроллера с периодом 10 мс, что позволит избежать использования подпрограмм формирования задержки. В листинге на стр. 475 показано, как это можно реализовать. Разумеется, в этом случае таймер нельзя будет использовать для других задач. Также можно воспользоваться внешним генератором с частотой 100 Гц, однако при этом схема не будет столь эффективной с аппаратной точки зрения. При длительности свечения одного знакоместа, равной 10 мс, можно без использования дополнительных интерфейсных схем обслуживать до десяти разрядов и все равно изображение будет обновляться чаще 100 раз в секунду.