Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1385 | Дата выхода: | 22.11.2010, 22:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 223 / 67 | Вопросов / ответов: | 1 / 1 | Вопрос № 180829: Здравствуйте, уважаемые эксперты! Прошу Вас помочь с решением следуюшей задачи: - написать программу в среде MPLab для вывода чисел 1,2,3,5 на индикатор микроконтроллера PIC16F84 последовательно с интервалом в полсекунды. Составить блок - схем... Вопрос № 180829: Здравствуйте, уважаемые эксперты! Прошу Вас помочь с решением следуюшей задачи: - написать программу в среде MPLab для вывода чисел 1,2,3,5 на индикатор микроконтроллера PIC16F84 последовательно с интервалом в полсекунды. Составить блок - схему работы программы! Спасибо!
Отправлен: 17.11.2010, 22:22 Вопрос задал: Посетитель - 342555 (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Посетитель - 342555! Забавный ассемблер... Итак, что мы имеем? Программы для микроконтроллеров абстрактно не пишутся, а только под конкретную схему. Исходя из примеров, приведенных в вопросе № 180728, я делаю вывод, что зажигание всех 32 (4*8) сегментов индикаторов производится последовательно путем импульса по выводу синхронизации порта В, состояние сегмента индикатора при этом берется с вывода данных того же порта. Отсюда получаем следующий алгоритм: 1) Преобразуем требуемое число в сегментный код, показывающий, какие сегменты горят, какие нет 2) Отрабатываем эти 8 бит, тем самым рисуем число на первом индикаторе. 3) Гасим остальные 4 индикатора 4) Выдерживаем паузу 5) Рассматриваем следующее число и на пункт 1) 6) Зацикливаем до бесконечности Вот такая получилась программа
Код: LIST p=16F84
; Регистры общего назначения PC equ 02h ; Счетчик команд STATUS EQU 03h ; статус PORTB EQU 06h ; порт В
; Управляющие регистры портов ввода-вывода TRISB EQU 86h ; для порта В
; Биты регистра STATUS RP0 EQU 05h ; бит выбора страницы
; Биты регистра PORTB DAT EQU 04h ; бит данных SYN EQU 05h ; бит синхронизации
CBLOCK 0CH ; блок рабочих регистров WORK1 ; переменные для циклов WORK2 NUM ; сегменты индикатора ENDC
org 00h ; начало исполняемого кода GOTO START
org 04h ; программа обработки прерываний retfie ; отсутствует
; Основная программа START ; Инициализация PORTB MOVLW B'11001111' ; настройка порта В BSF STATUS,RP0 ; выбор банка 1 MOVWF TRISB ; установка RB4, RB5 на вывод BCF STATUS,RP0 ; выбор банка 0 ; BSF PORTB,DAT ; установка битов DAT, SYN BSF PORTB,SYN ; в регистр PORTB
MAIN ;основной цикл MOVLW 1 CALL ZAZHECH ;рисуем 1 CALL PAUSE ;пауза MOVLW 2 ;2 CALL ZAZHECH CALL PAUSE MOVLW 3 ;3 CALL ZAZHECH CALL PAUSE MOVLW 5 ;5 CALL ZAZHECH CALL PAUSE GOTO MAIN
;============================================= ; Преобразование BCD -> 7 сегментный код ; 0 - горит ;============================================= LCDTable addwf PC,F ; W + PC -> PC retlw b'11000000' ; ..FEDCBA = '0' retlw b'11111001' ; .....CB. = '1' retlw b'10100100' ; .G.ED.BA = '2' retlw b'10110000 9; ; .G..DCBA = '3' retlw b'10011001' ; .GF..CB. = '4' retlw b'10010010' ; .GF.DC.A = '5' retlw b'10000010' ; .GFEDC.A = '6' retlw b'11111000' ; .....CBA = '7' retlw b'10000000' ; .GFEDCBA = '8' retlw b'10010000' ; .GF.DCBA = '9'
; Подпрограмма «Зажечь» ZAZHECH CALL LCDTable ; получаем в W сегменты индикатора MOVWF NUM ; сохраним в NUM MOVLW D'8' ; 8 бит MOVWF WORK1 ; в счетчик WORK1 M01 BCF PORTB,DAT ; установка в 0 RB4 (чтобы горело) BTFSC NUM,0 ; если 0 бит в регистре NUM = 0, то пропускаем BSF PORTB,DAT ; команду, если нет, то установка RB4 в 1 (чтобы потухло)
; синхронизация PORTB BCF PORTB,SYN BSF PORTB,SYN RRF NUM,1 ; сдвиг вправо, через перенос DECFSZ WORK1,1 ; по всем 8 битам GOTO M01 ; переход на метку M01
; погасим остальные 24 сегмента ; бит DA T обязательно = 1, т.к. последний бит везде = 1 MOVLW D'24' ; количество MOVWF WORK1 M02 BCF PORTB,SYN BSF POR TB,SYN DECFSZ WORK1,1 GOTO M02
RETURN ; возврат из подпрограммы
; Подпрограмма «Пауза» PAUSE MOVLW D'128' MOVWF WORK1 ; в счетчик WORK1 CLRF WORK2 ; очистка регистра LOOP DECFSZ WORK2,1 ; уменьшить счетчик WORK2, если он GOTO LOOP ; не равен 0, то вернуться на метку LOOP DECFSZ WORK1,1 ; уменьшить счетчик WORK1, если он GOTO LOOP ; не равен 0, то вернуться на метку LOOP RETURN ; возврат из подпрограммы
END ----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 21.11.2010, 06:02 Номер ответа: 264235 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Комментарий к оценке: Отлично! Спасибо! Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 264235 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий