Страница 1 из 1
Функция для 4 знаков для 7- сегментника.
Добавлено: Вс янв 25, 2009 17:17:20
Тарас
Здраствуйте колеги, вот возник такой вопрос, много я видел здесь тем где люди хотели зделать часы, я тоже задался этим вопросом, так для этого нужна простая в управлении функция по управлению 7-ми сегментником на 4 числа. Помогите, пожалуйста, с написанием функции
на С для Code Vision AVR; буду очень благодарен.

Добавлено: Вс янв 25, 2009 17:30:57
shtorm
я использую вот такую ф-цию, хотя у меня цели другие, в принцепе и для часов я думаю сойдет, если вызвать ф-цию с нужным параметром (Display(12); ) ф-ция выберит с массива цифры 1 и 2. можно делением но мк отнимает быстрее чем делит.
Код: Выделить всё
void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла
{
unsigned char Num1, Num2;
Num1=0;
while (Number >= 10)
{
Number -= 10;
Num1++;
}
Num2 = Number;
Disp1 = Dig[Num1];
Disp2 = Dig[Num2];
}
void Dig_init(void) //Массив для отображения цыфр на семисегментном индикаторе
{ // тут нужно указать числа которые в двоичном виде будут отображать цифру
Dig[0] = 95;
Dig[1] = 24;
Dig[2] = 109;
Dig[3] = 124;
Dig[4] = 58;
Dig[5] = 118;
Dig[6] = 119;
Dig[7] = 28;
Dig[8] = 127;
Dig[9] = 126;
}
:)
Добавлено: Вс янв 25, 2009 18:13:18
Тарас
а можно на примере посмотреть ии реализацию? ибо я чтото не понимаю как она работает, на какие порты она выдает числа...
Добавлено: Вс янв 25, 2009 23:30:51
chief
а что тут непонятного. Берем часы (или минуты) запихиваем в эту функцию а потом по очереди выдаем Disp1 (десятки) и Disp2 (еденицы). Потом тоже проделываем с минутами. Данные выводим в любой порт с подключенными индикаторами. Время нужно подбирать но желательно что бы каждая цифра загоралась не менее 25 раз в секунду. А лучше еще чаще.
Добавлено: Пн янв 26, 2009 11:06:17
Danko
Массив "знакогенератора" с общим анодом:
Код: Выделить всё
//вес бита сегмента
#define A 1
#define B 2
#define C 4
#define D 8
#define E 16
#define F 32
#define G 64
unsigned char digits[] = {
~(A+B+C+D+E+F), // 0
~(B+C), // 1
~(A+B+D+E+G), // 2
~(A+B+C+D+G), // 3
~(B+C+F+G), // 4
~(A+C+D+F+G), // 5
~(A+C+D+E+F+G), // 6
~(A+B+C), // 7
~(A+B+C+D+E+F+G), // 8
~(A+B+C+D+F+G), // 9
~(G), // 10 - знак минус
~(A+B+F+G), // 11 - символ градус цельсия
~(0) // 12 - пусто
};
для общего катода:
Код: Выделить всё
...
unsigned char digits[] = {
(A+B+C+D+E+F), // 0
(B+C), // 1
...
Добавлено: Пн янв 26, 2009 12:19:08
Krik99
У меня на сайте под знаком WWW можеш посмотреть пример работы с 7-ми сегментниками.
Добавлено: Пн янв 26, 2009 18:00:44
Тарас
да, но у тебя только на 3 розяда, а нужно для 4-х
Добавлено: Пн янв 26, 2009 18:15:33
Danko
Тарас писал(а):да, но у тебя только на 3 розяда, а нужно для 4-х
На сколько я помню то часы это от 0 до 23 а минуты от 0 до 59.
И по моему часы: это два разряда часов плюс два разряда минут,
а у Вас часы и минуты хранятся одним числом.
Да, из проги в два разряда можно сделать хоть двадцать два.
Прошу прощения за флуд.
Добавлено: Вт янв 27, 2009 10:50:01
Krik99
Тарас писал(а):да, но у тебя только на 3 розяда, а нужно для 4-х
Да там можно хоть и на 6 разрядов переделать исходник

Добавлено: Вт янв 27, 2009 13:20:23
shtorm
Тарас тебе не нужно на 4 разряда делать ф-цию, у тебя максимальная цифра 23 - двухзначная, в задачи ф-ции входит разложить число 23 как 2 и 3 так вот тебе нужно вызвать ф-цию с начала для минут например 32 получишь 3 и 2 отобразишь на индекаторе потом вызовешь с часами с секундами и т.д.