Но, у меня никак невыходит нормально опрашивать кнопки. Кнопок у меня 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;
}
}