Как отправить 40 бит на 7-ми сегментный индикатор
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Как отправить 40 бит на 7-ми сегментный индикатор
ну и где криминал ?
1 байт программного кода в хексе представляется 2 байтами + начальный адрес каждых 16 байт + контрольная сумма каждых 16 байт - где -то так и наскребется.
1 байт программного кода в хексе представляется 2 байтами + начальный адрес каждых 16 байт + контрольная сумма каждых 16 байт - где -то так и наскребется.
- Реклама
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Как отправить 40 бит на 7-ми сегментный индикатор
в некоторых случаях вместо счетчика long по объему кода получается выгоднее иметь массив из 5 символов и пару функций, которые увеличивают/уменьшают "число", там находящееся. что-то типа такого:koyodza писал(а):отдельно существует счётчик нужной длины (для дианазона 0..99999 нужен long), с ним делаете, что Вам нужно. Допустим, инкрементируете.
Код: Выделить всё
char counter[6] = {'0','0','0','0','0',0};
void inc_counter(void){
char i;
for(i=0; i<5; i++){
if(++counter[4-i] <= '9') return;
counter[4-i] = '0';
}
}
void dec_counter(void){
char i;
for(i=0; i<5; i++){
if(--counter[4-i] >= '0') return;
counter[4-i] = '9';
}
}битва с дураками проиграна, победители торжествуют. слава победителям!
- koyodza
- Собутыльник Кота
- Сообщения: 2623
- Зарегистрирован: Вс июл 17, 2011 11:51:52
- Контактная информация:
Re: Как отправить 40 бит на 7-ми сегментный индикатор
Бывает. Это если просто счётчик. Если же с этим числом могут производиться какие-то более сложные действия, то метод не годится.Мастер Ломастер писал(а):в некоторых случаях вместо счетчика long по объему кода получается выгоднее иметь массив из 5 символов и пару функций, которые увеличивают/уменьшают "число", там находящееся.koyodza писал(а):отдельно существует счётчик нужной длины (для дианазона 0..99999 нужен long), с ним делаете, что Вам нужно. Допустим, инкрементируете.
Для вывода на 7-сегментные индикаторы это мало поможетМастер Ломастер писал(а):кстати, этот подход удобен как раз тем, что перед выводом счетчика не надо его преобразовывать в символы - он и так символьный, т.е. готовая строка для вывода.
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: Как отправить 40 бит на 7-ми сегментный индикатор
С этим все понятно, мне подходит предложенный вариант urry, его код мне очень понравился тем что можно делать с числом что угодно! Как теперь состыковать два типа данных.
Есть функция она имеет тип const char необходимо ей передать переменную s тип которой unsigned long int.
В переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое в другую функцию и работать дальше
Есть функция она имеет тип const char необходимо ей передать переменную s тип которой unsigned long int.
В переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое в другую функцию и работать дальше
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Как отправить 40 бит на 7-ми сегментный индикатор
Прекратить эту ерунду! Автору индикатор, по всей видимости, нужен числовой, вот так и надо сделать.
Кстати, предупреждаю: в случае этого кода, высвечиваемое на индикатор число может напугать вас.
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// составляем из сегментов цифры
#define N0 (0x3F) //0
#define N1 (0x06) //1
#define N2 (0x5B) //2
#define N3 (0x4F) //3
#define N4 (0x66) //4
#define N5 (0x6D) //5
#define N6 (0x7D) //6
#define N7 (0x07) //7
#define N8 (0x7F) //8
#define N9 (0x6F) //9
#define _setBit(p,b,x) p = (x)?((p)|(1<<(b))):((p)&(~(1<<(b))))
#define _clk(p,b) p|=(1<<(b)); p&=~(1<<(b))
void export_data (unsigned long i)
{
const char indikator[10]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9};
unsigned char byte, bit, Char;
for (byte=4; byte>=0; byte--)
{
Char = indikator[(i%100000)/10000]; i*=10;
for (bit=7; bit>=0; bit--)
{
_setBit(PORTD, PD5, Char & (1<<bit)); // Устанавливаем бит
_clk(PORTD,PD6); // Двигаем данные
}
}
_clk(PORTD,PD7); // Копируем на внешний буфер.
}
int main(void)
{
long int DS=0; //переменная DS
unsigned int i=0; //переменная i
PORTD=0x00; //Первоначально устанавливаем на всех выходах 0
DDRD=0xff; //установить PD0-PD2 как выходы
while (1) //Бесконечный цикл
{
export_data(61636L); //Отправляем данные на сдвиговый регистр
}
}
Последний раз редактировалось IfoR Пн авг 22, 2011 20:21:06, всего редактировалось 3 раза.
- Реклама
- koyodza
- Собутыльник Кота
- Сообщения: 2623
- Зарегистрирован: Вс июл 17, 2011 11:51:52
- Контактная информация:
Re: Как отправить 40 бит на 7-ми сегментный индикатор
Ну так его функция fnLongToStr это и делает. Только там немного злоупотребляется глобальными переменными, я стараюсь по-возможности этого избегать. Но Вам, как начинающему, так будет даже проще. Так что просмотрите код на предыдущей странице ещё разalexey6522 писал(а):С этим все понятно, мне подходит предложенный вариант urry, его код мне очень понравился тем что можно делать с числом что угодно! Как теперь состыковать два типа данных.
Есть функция она имеет тип const char необходимо ей передать переменную s тип которой unsigned long int.
В переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое в другую функцию и работать дальше
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: Как отправить 40 бит на 7-ми сегментный индикатор
koyodza как мне переделать функцию передачи строки в передачу числа в порт COM1
вот как я ее вызываю
USART_vSendBytes("Hello world"); //Отправляем данные в порт
а теперь мне нужно сделать так что бы моя функция приняла число в виде
USART_vSendBytes(98543); //Отправляем данные в порт
знаю что в обычном Си есть много функций преобразования числа в строку IntToStr или FloatToStr
Код: Выделить всё
void USART_vSendBytes(const char *u8Data) {
while (*u8Data) {
while((UCSRA&(1<<UDRE)) == 0); // Wait if a byte is being transmitted
UDR = *u8Data;
u8Data++; // Transmit data
}
}
USART_vSendBytes("Hello world"); //Отправляем данные в порт
а теперь мне нужно сделать так что бы моя функция приняла число в виде
USART_vSendBytes(98543); //Отправляем данные в порт
знаю что в обычном Си есть много функций преобразования числа в строку IntToStr или FloatToStr
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Как отправить 40 бит на 7-ми сегментный индикатор
Может не стоит постить в двух темах параллельно одно и тоже? Я вам ответил в соседней теме.
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: Как отправить 40 бит на 7-ми сегментный индикатор
Спасибо IfoR, уже прочитал, только этот вариант не очень, честно, я читал
http://radiokot.ru/forum/viewtopic.php? ... view=print
там написано про эту функцию
http://radiokot.ru/forum/viewtopic.php? ... view=print
там написано про эту функцию



