Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
28.07.2011, 17:23
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
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
|
|
|
29.07.2011, 12:34
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
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;
} |
|
Долго пытался понять как это работает... да так и не понял....
Можете по каждой строчке разьяснить... много мне не понятного тут..
Понимаю только то что буфер постоянно инкриментируется. Пробовал в своем исходнике в буфере инкриметировать переменную, компилятор заругался...
|
|
|
|
31.07.2011, 07:49
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
heady69, а зачем используется команда goto или цикл for это тоже не оптимизировано для подобного камня?
|
|
|
|
01.08.2011, 13:04
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от artyomugr
|
Долго пытался понять как это работает... да так и не понял....
много мне не понятного тут..
|
А в каком функции непонятно?
|
|
|
|
02.08.2011, 08:51
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от heady69
|
А в каком функции непонятно?
|
В обеих...
|
|
|
|
02.08.2011, 11:54
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
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
|
|
|
03.08.2011, 11:37
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от Nfc
|
А ещё практикуют математику с вещественными числами реализовывать на сдвигах и ..и много ещё чего - какой ужас!
Это не жесть, это адекватное понимание возможностей платформы с которой имеешь дело.
Вы сравните размер и скорость выполнения кода - сами примете на вооружение.
|
А разьясните мне пожалуйста как разложить число используя вместо деления вычитание?
С ув. Артем
|
|
|
|
03.08.2011, 11:40
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
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;
} |
|
Теперь стало понятнее спасибо
|
|
|
|
03.08.2011, 13:17
|
|
Частый гость
Регистрация: 23.05.2009
Сообщений: 46
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Сообщение от artyomugr
|
А разьясните мне пожалуйста как разложить число используя вместо деления вычитание?
|
Код:
|
val=1000; //делимое
x=4; //делитель
y=0; //частное
while(val›x){
val-=x;
y++;
} // для чисел без знака |
|
|
|
|
03.08.2011, 13:20
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Способы вывода данных на семисегментный индикатор
Лучше потом посмотреть, какой объем этот код будет занимать )))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:07.
|
|