Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 28.07.2011, 17:23  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

А почему не сделать как примерно советовал MisterDi.
Функция сдвигает буфер и вставляет новый символ.

Код:
//сдвиг буфера на 1 символ

buffer_rotate(unsigned char new_sumbol){
 unsigned char i;
for (i=led_buff_size-1;i›0;i--) { led_buff[i+1]=led_buff[i]; } //сдвигаем буфер 
//вставляем в буфер новый символ
led_buff[0]=new_sumbol;
}
другая функция читает данные из и выводит последовательно,при достижении символа конца строки $,начинает вывод снова.

Код:
unsigned char line_data[]={"a","b","c","d","$"};


run_line (){
  unsigned char pointer=0;
  unsigned char j;
loop:
  j= line_data[pointer++];
  if(j=="$") {pointer=0; goto loop;}
  buffer_rotate(j)
 goto loop;
}
Реклама:

Последний раз редактировалось heady69; 28.07.2011 в 17:41.
heady69 вне форума  
Сказали "Спасибо" heady69
artyomugr (29.07.2011)
Непрочитано 29.07.2011, 12:34  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Сообщение от heady69 Посмотреть сообщение
А почему не сделать как примерно советовал MisterDi.
Функция сдвигает буфер и вставляет новый символ.

Код:
//сдвиг буфера на 1 символ

buffer_rotate(unsigned char new_sumbol){
 unsigned char i;
for (i=led_buff_size-1;i›0;i--) { led_buff[i+1]=led_buff[i]; } //сдвигаем буфер 
//вставляем в буфер новый символ
led_buff[0]=new_sumbol;
}
другая функция читает данные из и выводит последовательно,при достижении символа конца строки $,начинает вывод снова.

Код:
unsigned char line_data[]={"a","b","c","d","$"};


run_line (){
  unsigned char pointer=0;
  unsigned char j;
loop:
  j= line_data[pointer++];
  if(j=="$") {pointer=0; goto loop;}
  buffer_rotate(j)
 goto loop;
}
Долго пытался понять как это работает... да так и не понял....
Можете по каждой строчке разьяснить... много мне не понятного тут..
Понимаю только то что буфер постоянно инкриментируется. Пробовал в своем исходнике в буфере инкриметировать переменную, компилятор заругался...
artyomugr вне форума  
Непрочитано 31.07.2011, 07:49  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

heady69, а зачем используется команда goto или цикл for это тоже не оптимизировано для подобного камня?
Flopix вне форума  
Непрочитано 01.08.2011, 13:04  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Сообщение от artyomugr Посмотреть сообщение
Долго пытался понять как это работает... да так и не понял....
много мне не понятного тут..
А в каком функции непонятно?
heady69 вне форума  
Непрочитано 02.08.2011, 08:51  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Сообщение от heady69 Посмотреть сообщение
А в каком функции непонятно?
В обеих...
artyomugr вне форума  
Непрочитано 02.08.2011, 11:54  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Код:
buffer_rotate(unsigned char new_sumbol){
 unsigned char i;
for (i=led_buff_size-1;i›0;i--) { led_buff[i+1]=led_buff[i]; } //в этом цикле перезаписываем данные в буфере вывода на индикатор т.е. если длина буфера (led_buff_size) напр.=6 элемент буфера 5 переписывается на место 6, 4-›5, 3-›4 и т.д. 
//вставляем в буфер новый символ
led_buff[0]=new_sumbol; //сдесь в начало буфера вставляется новый символ
}
Код:
unsigned char line_data[]={"a","b","c","d","$"}; // буфер данных для вывода 


run_line (){
  unsigned char pointer=0; // сбрасываем указатель
  unsigned char j;
loop:
  j= line_data[pointer++]; //получаем новый символ для вывода на строку
  if(j=="$") {pointer=0; goto loop;} //если конец бегущей строки,сброс указателя и начинаем выдавать по новой
  buffer_rotate(j); //передаем программе новый символ (она сдвинет старые данные и вставит его в начало буфера вывода данных на индикаторы)
 goto loop;
}

Последний раз редактировалось heady69; 02.08.2011 в 12:04.
heady69 вне форума  
Сказали "Спасибо" heady69
artyomugr (03.08.2011)
Непрочитано 03.08.2011, 11:37  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Сообщение от Nfc Посмотреть сообщение
А ещё практикуют математику с вещественными числами реализовывать на сдвигах и ..и много ещё чего - какой ужас!

Это не жесть, это адекватное понимание возможностей платформы с которой имеешь дело.
Вы сравните размер и скорость выполнения кода - сами примете на вооружение.
А разьясните мне пожалуйста как разложить число используя вместо деления вычитание?
С ув. Артем
artyomugr вне форума  
Непрочитано 03.08.2011, 11:40  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Сообщение от heady69 Посмотреть сообщение
Код:
buffer_rotate(unsigned char new_sumbol){
 unsigned char i;
for (i=led_buff_size-1;i›0;i--) { led_buff[i+1]=led_buff[i]; } //в этом цикле перезаписываем данные в буфере вывода на индикатор т.е. если длина буфера (led_buff_size) напр.=6 элемент буфера 5 переписывается на место 6, 4-›5, 3-›4 и т.д. 
//вставляем в буфер новый символ
led_buff[0]=new_sumbol; //сдесь в начало буфера вставляется новый символ
}
Код:
unsigned char line_data[]={"a","b","c","d","$"}; // буфер данных для вывода 


run_line (){
  unsigned char pointer=0; // сбрасываем указатель
  unsigned char j;
loop:
  j= line_data[pointer++]; //получаем новый символ для вывода на строку
  if(j=="$") {pointer=0; goto loop;} //если конец бегущей строки,сброс указателя и начинаем выдавать по новой
  buffer_rotate(j); //передаем программе новый символ (она сдвинет старые данные и вставит его в начало буфера вывода данных на индикаторы)
 goto loop;
}


Теперь стало понятнее спасибо
artyomugr вне форума  
Непрочитано 03.08.2011, 13:17  
kazusdoc
Частый гость
 
Регистрация: 23.05.2009
Сообщений: 46
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
kazusdoc на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Сообщение от artyomugr
А разьясните мне пожалуйста как разложить число используя вместо деления вычитание?
Код:
val=1000; //делимое
x=4; //делитель
y=0; //частное

while(val›x){
val-=x;
y++;
} // для чисел без знака
kazusdoc вне форума  
Непрочитано 03.08.2011, 13:20  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Способы вывода данных на семисегментный индикатор

Лучше потом посмотреть, какой объем этот код будет занимать )))
Easyrider83 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Методика и способы воостановления данных diman_the_best Делимся опытом 0 25.10.2010 00:20


Часовой пояс GMT +4, время: 20:07.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot