Индикация 00:00 = Часы:Мнуты (Mега88V)
Добавлено: Пт июл 17, 2015 01:28:49
Я разбираюсь с отображением времени на индикаторе. Семисегментник у меня на 4 разряда.
Я пытаюсь вывести на индикатор часы и минуты, а выводятся секунды. Причем, если меняю программу в функции индикации, выводится какая-то муть. Мне это не нравится.
Должен выводится отсчет в обратном порядке.
Привожу рабочий код. Работает десятичный счет до 9999. В виде примера конечно же.
А что надо поправить, чтобы выводились часы.минуты?
Добавляю умножение на 100, выводится 00:21. 21 - это часы, а кажет как минуты
Я пытаюсь вывести на индикатор часы и минуты, а выводятся секунды. Причем, если меняю программу в функции индикации, выводится какая-то муть. Мне это не нравится.
Должен выводится отсчет в обратном порядке.
Привожу рабочий код. Работает десятичный счет до 9999. В виде примера конечно же.
А что надо поправить, чтобы выводились часы.минуты?
Код: Выделить всё
//**********************************************************************************************************************************
// НАЧАЛО ФАЙЛОВОЙ ИНИЦИАЛИЗАЦИИ //
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//**********************************************************************************************************************************
// ОСНОВНЫЕ ПЕРЕМЕННЫЕ //
// Если надо добавить точку, то пиши для ВКЛ data[1]=codes[res]^0x04; для ВЫКЛ data[1]=codes[res]|4;
short int k = 0;
volatile int h = 21, m = 35, s = 0, ms = 0; // тут был unsignet. Это ошибка. Поправил
//**********************************************************************************************************************************
// ОСНОВНЫЕ МАССИВЫ ДЛЯ ВЫВОДА //
const unsigned char codes[10]={0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x4,0x5}; // 0-1-2-3-4-5-6-7-8-9
unsigned char counter[4]={0x08,0x04,0x02,0x01}; // 0b 0000 1111 то, есть это 8+4+2+1 // для счетчика разрядов семисегментника порта С
unsigned char data[4]={0x14,0x14,0x14,0x14}; // для значений, выводимых на дисплей... По умолчанию Err_t ТУТ {0x2C,0xEE,0xEE,0xAC}
//**********************************************************************************************************************************
// ОКОНЧАТЕЛЬНЫЙ ВАРИАНТ ПРЕРЫВАНИЯ T0 //
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0x7D; // Прерывание будет вызываться через 1 мс. Стандартный вариант для 8МГц/64. 125000/125=1000 Гц (1мс)
// считаем от нуля до трех. Переключаем разряд и снова ВКЛЮЧАЕМ.
(k == 3) ? k = 0 : k++; // Если k достигла трёх, k сбрасываем, иначе k + 1 при каждом вхождении
PORTC = counter[k]; // Просто включаем аноды сигментника по очереди.
PORTD = data[k]; // При каждом вхождении выводим битную маску в порт по адресам портов 0,1,2,3.
// ТАЙМЕРЫ: ТИКАЕМ 1000... ВХОЖДЕНИЙ. ПОСЛЕ ПОДНИМАЕМ ФЛАГ КАЖДЫЙ ПЕРИОД //
if (++ms > 1000) // Тактирование каждую миллисекунду и Если насчитали 1000 мс, то считаем мы получили период = 1 секунде!
{
ms = 0;
s++;
if (s==60)
{
s=0;
m--;
if ( m < 0)
{
if (h>0)
{
h--;
m=59;
}
}
}
}
}
//**********************************************************************************************************************************
//**********************************************************************************************************************************
// ОСНОВНЫЕ ФУНКЦИИ ПРОГРАММЫ //
void init_timer (void)
{
TIMSK0 = (1<<TOIE0);
TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00) ; //8.000.000/64 = 125.000 тиков в сек. (0-1-1 - делитель на 64)
}
//**********************************************************************************************************************************
//**********************************************************************************************************************************
//************************* ДАННЫЙ КУСОК КОДА СЧИТАЕТ КОЛИЧЕСТВО СЕКУНД В ДЕСЯТИЧНОМ ФОРМАТЕ *********************************
//**********************************************************************************************************************************
//**********************************************************************************************************************************
void convert_data_desimal ()
{
//Весь вывод идет через data[х]
unsigned int temp,res;
//++s;
temp = s;
res = temp/1000;
data[0]=codes[res];
temp=temp-res*1000;
res = temp/100;
if (s % 2)
{data[1]=codes[res]^4;
}
else
{data[1]=codes[res]|4;
}
temp=temp-res*100;
//маленькое вскрытие кода =))
res = temp/10; // res=1, temp=10
data[2]=codes[res]; // вывод на дисплей 1 из массива codes...
temp=temp-res*10; // (1*10)-10=0 вот такия пирожки.
data[3]=codes[temp];
}
//**********************************************************************************************************************************
// ИНИЦИАЛИЗАЦИЯ УСТРОЙСТВ ПРОГРАММЫ //
int main (void)
{
cli();
DDRC = 0x0f; // готовим порты: PortD - data PortC - anode
DDRD = 0xff;
PORTD = 0;
init_timer (); // готовим таймер/счетчик 0
sei (); // Разрешить общие прерыввания. Можно еще написать по старинке SREG |= (1 << 7);
//**********************************************************************************************************************************
// ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ //
while(1)
{
convert_data_desimal(s);
}
}
Добавляю умножение на 100, выводится 00:21. 21 - это часы, а кажет как минуты
Код: Выделить всё
if (h>0)
{
h--;
m=59;
h = (h*100)+m;
}