Дело вот в чем, начал я изучать динамическую индикацию и в принципе всё мне с ней понятно вот мой учебный код динамической индикации:
Код: Выделить всё
#define _pic16f877 // зададим тип процессора
#include <pic> // подключим файл описаний
__CONFIG(LVPDIS & UNPROTECT & PWRTDIS & WDTDIS & XT);
// таблица знакогенератора
const unsigned char CODE_TABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char buffer[9]={1,2,3,4,5,6,7,8,9}; // буфер индикатора
unsigned char PTR; // указатель буфера
void main(void)
{
// настроим порты на выход
TRISB = 0b11110000; // для дешифратора знакомест (4 младших разряда)
TRISD = 0b00000000; // для символа
PORTD = 0; // очистим индикатор
PTR = 0; // начало буфера
PORTB = 0b00001111; // установим последний разряд индикатора
OPTION = 0b10000010; // запишем байт настройки в регистр OPTION
INTCON = 0; // Выключить все прерывания и сбросить T0IF
TMR0 = 0; // Сброс TMR0
T0IE = 1; // Разрешить прерывания от TMR0
GIE = 1; // Разрешить все прерывания
// зациклим программу
cycle:;
goto cycle;
}
// обработка прерываний
void interrupt all(void)
{
PORTD = 0; // очистим индикатор
PORTB++; // установим следующее знакоместо для отображения
PORTD = CODE_TABLE[buffer[PTR]]; // выведем на индикатор
PTR++; // установим указатель на следующий символ
if(PTR == 10) { PTR = 0; PORTB = 0b00001111; } //проверим, не кончился ли массив для вывода на индикатор
T0IF = 0; // сбросим флаг прерывания
}
Я попытался сделать это следующим образом.
в обработчике прерывания изменил и добавил
if(PTR == 10) { PORTB = 0b00001111; }
if(PTR == 16) { PTR = 0; PORTB = 0b00001111; }
но такой способ не прокатывает показания накладываются друг на друга и получается белебирда.
Я ставил задержку, что-бы понаблюдать как все происходит и при включенной задержке я четко вижу как последовательно загораются цифры от 1 до 9 затем от 0 до 4.Нутром чую, что надо наверное как-то организовать, что-то типа паузы между частями,но как это сделать ну никак не врублюсь, вроде придет мысль и думаю ну вот сейчас заработает, а оно не работает результат тот же одни показания накладываются на другие.
Может хоть кто нибудь направить в нужном направлении куда капать, только по подробнее если можно.
Компилятор используемый мной для этого примера HITECH-PICC.
Дешифратор 74145
МК PIC16F877A
Файл для протеуса:


