Но, у меня никак невыходит нормально опрашивать кнопки. Кнопок у меня 4, ну это такое, на будущее.
Для начала я хочу разобраться хотя бы с одной, я ее опрашиваю в прерывании.
Ну код компилируется, загружаю.
Наблюдаю на результат, и вот он какой.
При включении термометра у меня на 7-сегментном индикаторе отображается "500,0", что свидетельствует о том, что в переменную buttons_1 записано "0", потом нажимаю на кнопку, в переменную buttons_1 записано "1", начинает отображаться значение температуры, но вот когда я отпускаю кнопку, по идеи должно опять появится надпись "500,0", то есть в переменную buttons_1 почему-то не возвращается значение "0".
И код предоставлен, пишу в CodeVisionAVR C.
ну и вопрос дня, что я делаю не так)))???
- Код: Выделить всё • Развернуть
- #define F_CPU 8000000UL
 #define variable_frequency PINC.5
 #define nav_minus PINC.0
 #define nav_plus PINC.1
 #define mode_view PINC.2
 #include <mega8.h>
 #include <delay.h>
 #include <ds18b20.h>
 #include <1wire.h>
 #include <stdio.h>
 #asm
 .equ __w1_port=0x15
 .equ __w1_bit=3
 #endasm
 unsigned char number[] =
 {
 0xC0, //0
 0xF9, //1
 0xA4, //2
 0xB0, //3
 0x99, //4
 0x92, //5
 0x82, //6
 0xF8, //7
 0x80, //8
 0x90, //9
 0xBF, //минус
 0xFF //пустой разряд
 };
 unsigned char data1, data2, data3, data4, buttons_1;
 //прерывания таймера Т0 - вывод на индикатор
 interrupt [TIM0_OVF] void Timer0Ovf(void)
 {
 static unsigned char count = 0;
 static unsigned char count_buttons = 0;
 TCNT0 = 0xb2;
 // опрос кнопки
 if (count_buttons == 0 & mode_view == 0) {
 buttons_1 = 1; }
 else buttons_1 = 0;
 count_buttons++;
 if (count_buttons == 3) count_buttons = 0;
 //зажигаем поочерёдно разряды
 if (count == 0) {
 PORTD = number[data4];
 PORTB = (1<<4);
 }
 if (count == 1) {
 PORTD = number[data3];
 PORTB = (1<<3);
 }
 if (count == 2) {
 PORTD = (number[data2]) & (~(1<<7));
 PORTB = (1<<2);
 }
 if (count == 3) {
 PORTD = number[data1];
 PORTB = (1<<1);
 }
 count++;
 if (count == 4) count = 0;
 }
 void main( void )
 {
 unsigned char devices;
 float temper;
 int temper_int,temper_fl, mode, i, temp_eeprom;
 devices=ds18b20_init(0,-35,30,DS18B20_12BIT_RES); // подключаем датчик и узнаем их количество
 //порт, к которому подкл. сегменты
 PORTD = 0xff;
 DDRD = 0xff;
 DDRC = 0x00;
 PORTC = 0xff;
 //порт, к которому подкл. катод
 PORTB = 0;
 DDRB |= (1<<4)|(1<<3)|(1<<2)|(1<<1);
 //инициализация таймера Т0
 TIMSK = (1<<TOIE0);
 TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
 TCNT0 = 0xb2;
 #asm("sei");
 // программный подсчет температуры
 while(1) {
 if (buttons_1 == 1) {
 while(devices>0){
 temper=ds18b20_temperature(0); // считывание температуры
 temper_int=temper; // избавляемся от нецелого чысла
 if (temper<0) // при отрицательной температуре
 {
 temper=temper*(-1);
 temper_int=temper_int*(-1);
 temper_fl=(temper-temper_int)*10;
 temper_int=(temper_int*10)+temper_fl;
 data4=10; // вывод знака "минус"
 }
 else // при положительной температуре
 {
 temper_fl=(temper-temper_int)*10;
 temper_int=(temper_int*10)+temper_fl;
 data4 =11; // вывод пустого разряда, если убрать будет гореть ноль
 }
 // разбиение значения температуры на разряды для вывода на индикатор
 data1 = temper_int % 10;
 temper_int=temper_int/10;
 data2 = temper_int % 10;
 data3 = temper_int / 10;
 delay_ms(100);
 }
 } else data4 = 5;
 }
 }

