;демонстрационная программа динамической индикации ;мультиплексирование разрядов индикатора сделано на сдвиговом регистре #define pa_dr a1 ;регистр управления порта А #define pb_dr a2 ;регистр управления порта В #define pa_wr b1 ;рабочий регистр порта А #define pb_wr b2 ;рабочий регистр порта В #define temp1 c0 ;временная переменная 1 #define temp2 c1 ;временная переменная 2 #define temp3 c2 ;временная переменная 3 #define temp4 c3 ;временная переменная 4 ;область векторов прерывания jmp start ;вектор прерывания по RESET nop nop nop nop nop nop nop ;точка старта start: ldr #a,18h ;сегмент регистров конфигурации портов ldr #b,0h ;сегмент рабочих регистров портов ldr #c,40h ;1ый сегмент рабочих переменных ;конфигурируем порт А movl pa_dr,00011011b movl pa_dr,00011b ;младшие две линии вход/выход movl pa_dr,0ffh ;все с активным выходом movl pa_dr,0 ;нагрузочные резисторы отключены movl pa_dr,0 ;прерывания movl pa_dr,0 ;запрещены ;конфигурируем порт В movl pb_dr,00011011b movl pb_dr,0ffh ;все вход/выход movl pb_dr,0ffh ;все с активным выходом movl pb_dr,0 ;нагрузочные резисторы отключены movl pb_dr,0 ;прерывания movl pb_dr,0 ;запрещены ;погасил индикаторы ;линия C - тактовые импульсы ;линия D - данные bisl pa_wr,0001b ;установил линию D movl temp1,4 ;счетчик цикла loop1: bicl pa_wr,0010b ;сбросил линию C bisl pa_wr,0010b ;установил линию C, запись сдвиг. регистр dec temp1 jnz loop1 ;записал индицируемые данные в ОЗУ - последовательность цифр 4,3,2,1 ;ОЗУ с адресами 48h-4Bh должно содержать индицируемые данные в BCD формате ;ячейка 48h - старший разряд индикатора ;ячейка 4Bh - младший разряд индикатора ldr #4,48h ldr #5,40h ;IR0 в автоинкременте смотрит на ячейку 48h movl temp1,4 loop2: mov d6,temp1 dec temp1 jnz loop2 ;основная часть программы main: jsr indicate ;индикация jmp main ;************************************************************** ;* Подпрограмма динамической индикации * ;* Мультиплексирование разрядов сделано на сдвиговом регистре * ;************************************************************** ;таблица кодов семисегментного индикатора + точка segm_set: .byte 11000000b,11111001b,10100100b,10110000b,10011001b .byte 10010010b,10000011b,11111000b,10000000b,10011000b .even ;конфигурирование порта В на случай если порт B был перенастроен другой подпрограммой indicate: movl pb_dr,00001011b movl pb_dr,0ffh ldr #4,48h ldr #5,40h ;автоинкремент IR0 ;вывод на индикацию старшего разряда mdal temp1,segm_set mdah temp2,segm_set ;получили адрес таблицы в памяти команд add temp1,d6 adc temp2 ;получили адрес нужного 7ми сегм-го кода mtpr #6,temp1 mtpr #7,temp2 ;поместил его в IR1 mov pb_wr,d7 ;записал в порт этот код bicl pa_wr,0011b ;сбросил линии D и C сдвигового регистра bisl pa_wr,0010b ;установил С - запись в сдвиг. регистр jsr wait_5ms ;задержка 5мс movl pb_wr,0ffh ;погасил индикатор bisl pa_wr,0001b ;установил линию D ;вывод младших трех разрядов movl temp3,3 loop3: mdal temp1,segm_set mdah temp2,segm_set add temp1,d6 adc temp2 ;получили адрес нужного 7ми сегм-го кода mtpr #6,temp1 mtpr #7,temp2 ;поместил его в IR1 bicl pa_wr,0010b ;сбросил линию C регистра bisl pa_wr,0010b ;запись в сдвиг. регистр mov pb_wr,d7 ;засветил следующий разряд jsr wait_5ms ;задержка 5мс movl pb_wr,0ffh ;погасил индикатор dec temp3 jnz loop3 bicl pa_wr,0010b ;сбросил линию C регистра bisl pa_wr,0010b ;заблокировал все разряды rts ;подпрограмма задержки на 5мс при использовании внутреннего ;генератора микроконтроллера wait_5ms: movl temp1,39 $3: dec temp1 jnz $3 rts .end ;конец программы