ibiza11 писал(а):igumich писал(а):Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))
всё получилось, но вот есть ещё одна загвоздка. понять никак не могу.
вот код
#include <mega8.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //ненаю что за библиотека, но без неё неполучается
unsigned int sek; // переменная сек.
unsigned int min; // пересенная мин.
unsigned int hour; // переменная часов
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
{
// Place your code here
TCNT1H=0;
TCNT1L=0;
sek++; // инкрементируем секунду
}
unsigned char devices; //переменная в которой количество присоеденённых датчиков
int temp;
char lcd_buffer[33]; //масив с данными для экрана
void main(void)
{
PORTC=0x03;
DDRC=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
//переменная для хранения температуры
lcd_init(16);
//инициилизация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищим датчики
#asm("sei")
while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000) //если датчик выдаёт больше 1000
{
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
if (temp<=25)
{
sprintf(lcd_buffer,"ALARM");
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру
lcd_gotoxy(4,0);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(50);
// роботаем с кнопками
if (PINC.0==0) // если нажата первая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
min++; // к значению минуты добавляем еденицу
}
if (PINC.1==0) // если нажата вторая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
hour++; // к значению часов добавляем еденицу
}
///// Условия часов.
if(sek==60) // если сек = 60
{
min++; // добавляем 1 к переменной "минута"
sek=0; // зануляем переменную "секунда"
}
if(min==60) // если мин = 60
{
hour++; // добавляем 1 к переменной "час"
min=0; // зануляем переменную "минута"
}
if (hour==24) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0;
}
// выводим переменные
lcd_gotoxy(8,1);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);
lcd_putchar(':');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);
};
}
Проблема такая. Температуру отображает нормально, но вот время... все цифры моргают раз в секунду и при настройке часов и минут прибавляет с задержкой раз в секунду,если зажать соответствующую кнопку. хотя задержка на кнопках такая что по идее цифры должны "летать". никак не могу разобраться, кажется я что-то напутал с while(1)