Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
28.07.2011, 12:15
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от Easyrider83
|
Динамическая индикация делается на прерываниях! Забудьте про паузу.
|
А на прерываниях все и сделано
Запустите файлик протеус, и Вы поймете что я хочу сделать.
|
|
|
|
28.07.2011, 12:16
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Регулятор уровня? Работает, вроде.
|
|
|
|
28.07.2011, 12:19
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от Easyrider83
|
Регулятор уровня? Работает, вроде.
|
Там не только регулятор уровня..
Работает там сейчас все, я просто хочу сделать меню с эфектом бегущей строки
так чтоб старые данные сдвигались а новые данные толкали их..
|
|
|
|
28.07.2011, 12:21
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от MisterDi
|
Читайте Кеннигана и Ричи. Они рулез (с)
Код:
|
while (1){
//сдвиг буфера на 1 символ
for (i=led_buff_size-1;i›0;i--) { led_buff[i+1]=led_buff[i]; }
//чтение нового символа из отображаемой строки
led_buff[0]=read_next_char();
//задержка
delay_ms(100);
} |
вышенаписанное не проверял, могут быть ошибки любого типа, особенно в условиях цикла for.
|
Извините, пропустил Ваше сообщение, вот почему то с фор оператором у меня досих пор проблемы...
спасибо Вам огромное сейчас буду разбирать код.
|
|
|
|
28.07.2011, 12:26
|
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Прикинь, сам писал, работает как часы, привожу функции, прототипы подпишешь сам и вставь зти функции в программу куда тебе надо...
Функции заточены под D триггеры, кот. завязаны на семисегментники по типовой схеме...
#use standard_io (A)
#use standard_io (B)
unsigned int8 datum;//Промежуточная переменная хранения
//one,tens,fractions
unsigned int16 SUM;
#define SH_CP PIN_B1 //выход для тактовых импульсов
#define DS PIN_B6 //последовательный выход данных
#define ST_CP PIN_B2//выход для защёлкивания данных
#define ST_CP_R PIN_B4//выход для защёлкивания данных результата
unsigned int8 CONST digits [10] = {0x3F, 0x6,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7,0x7F, 0x6F};
/*---OUT_NUMB FOR INDIKATORS---*/
/*--------Запись в 74HC595---------*/
void out_cifra (unsigned int8 datum)
{
int K; /* переменная счётчик циклов*/
for (K=0; K‹=7; K++)
{
if (!(datum&0x80)) {output_low (DS);}
else {output_high(DS);}
output_high (SH_CP);
output_low (SH_CP);
datum=datum‹‹1;
}
return;
}
/* Cуммирующая функция вычисления и вывода на индикаторы числа*/
void out_token (unsigned int16 SUM)
{
unsigned int8 one=0;//единицы
unsigned int8 tens=0;// десятки
unsigned int8 fractions=0;//десятые доли
unsigned int8 edinici=0;
unsigned int8 desatki=0;
unsigned int8 sotni=0;
while (SUM ›=100)
{
tens++;
SUM -=100;
};
while (SUM ›= 10)
{
one++;
SUM -= 10;
fractions=SUM;
};
/*---------------------Convert-конвертация из двоичного в код семисегментника*/
edinici=digits [fractions];
desatki=digits [one];
sotni=digits [tens];
/*---Вывод конвертированных данных на соотв. индикаторы---*/
datum=edinici;
out_cifra (datum);
datum=desatki;
out_cifra (datum);
datum=sotni;
out_cifra (datum);
}
//Не забудь дёрнуть ногами, для обновления информации
output_high (ST_CP_R ); /* Cмена информации на всех индикаторах /
output_low (ST_CP_R );
Примеров много, погугли...
Конечно, лучше с схемой, ну немогу, надо бежать на рынок за новым смесителем, а то жена убивает ужо....
И ещё раз - программа и схема - вещи не разлучимые!
Последний раз редактировалось Prototup; 29.07.2011 в 13:08.
|
|
|
|
28.07.2011, 12:50
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от Prototup
|
Прикинь, сам писал, работает как часы, привожу функции, прототипы подпишешь сам и вставь зти функции в программу куда тебе надо...
Функции заточены под D триггеры, кот. завязаны на семисегментники по типовой схеме...
#use standard_io (A)
#use standard_io (B)
unsigned int8 datum;//Промежуточная переменная хранения
//one,tens,fractions
unsigned int16 SUM;
#define SH_CP PIN_B1 //выход для тактовых импульсов
#define DS PIN_B6 //последовательный выход данных
#define ST_CP PIN_B2//выход для защёлкивания данных
#define ST_CP_R PIN_B4//выход для защёлкивания данных результата
/*---OUT_NUMB FOR INDIKATORS---*/
/*--------Запись в 74HC595---------*/
void out_cifra (unsigned int8 datum)
{
int K; /* переменная счётчик циклов*/
for (K=0; K‹=7; K++)
{
if (!(datum&0x80)) {output_low (DS);}
else {output_high(DS);}
output_high (SH_CP);
output_low (SH_CP);
datum=datum‹‹1;
}
return;
}
/* Cуммирующая функция вычисления и вывода на индикаторы числа*/
void out_token (unsigned int16 SUM)
{
unsigned int8 one=0;//единицы
unsigned int8 tens=0;// десятки
unsigned int8 fractions=0;//десятые доли
unsigned int8 edinici=0;
unsigned int8 desatki=0;
unsigned int8 sotni=0;
while (SUM ›=100)
{
tens++;
SUM -=100;
};
while (SUM ›= 10)
{
one++;
SUM -= 10;
fractions=SUM;
};
/*---------------------Convert-конвертация из двоичного в код семисегментника*/
edinici=digits [fractions];
desatki=digits [one];
sotni=digits [tens];
/*---Вывод конвертированных данных на соотв. индикаторы---*/
datum=edinici;
out_cifra (datum);
datum=desatki;
out_cifra (datum);
datum=sotni;
out_cifra (datum);
}
//Не забудь дёрнуть ногами, для обновления информации
output_high (ST_CP_R ); /* Cмена информации на всех индикаторах /
output_low (ST_CP_R );
Примеров много, погугли...
Конечно, лучше с схемой, ну немогу, надо бежать на рынок за новым смесителем, а то жена убивает ужо....
И ещё раз - программа и схема - вещи не разлучимые!
|
Интиресный код
А индикация получается не динамическая?
|
|
|
|
28.07.2011, 14:09
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Индикация явно не динамика. Вывод через сдвиговые регистры с зящелкой на выходе. Да и код конечно... особенно это:
Код:
|
while (SUM ›=100)
{
tens++;
SUM -=100;
};
while (SUM ›= 10)
{
one++;
SUM -= 10;
fractions=SUM;
}; |
делить на 100 и на десять методом вычитания это ЖЕСТЬ!! Вообще с СИ сеть операторы: "/"разделить, "%"взять остаток деления .
|
|
|
|
28.07.2011, 14:12
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
heady69, много проще через BCD формат все сделать
|
|
|
|
28.07.2011, 14:16
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от Easyrider83
|
heady69, много проще через BCD формат все сделать
|
Согласен,тоже вариант не плохой.
|
|
|
|
28.07.2011, 14:19
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Я вообще стараюсь избегать деления на восьмибитных камнях. На 2,4,8.. делю сдвигом. В остальном лучше обходить стороной такую математику.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:49.
|
|