не-а.
это позволяет ставить точку с запятой после вызова макроса, если просто закрыть тело макроса в фигурные скобки, без while, то код вида
if(...)
BLA-BLA();
else
FOO();
не скомпилится
Технический форум по робототехнике.
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
unsigned char io=0x01; // переменная для условия цикла ADC>USART. Обнуляется обработчиком таймера1 по прошествии секунды
unsigned char lcd_buf[17]; // для вывода количества измерений на LCD
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
io=0x00;
PORTA.3=0;
TCCR1B=0x00;
}
void initialization(void){
// LCD module initialization
lcd_init(16);
// 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
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCNT1H=0xE1; // настроено считать одну секунду на Кварце 8Мгц
TCNT1L=0x7B;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
PORTD.4 = 1; // кнопка
DDRD = 0b00010000;
DDRA.3=1; // Выход
PORTA.3 = 0; //
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 115k (Double Speed Mode)
UCSRA=0x02;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x08;
// ADC initialization: AREF-pin used, ADC5 input, ADC enabled.
ADMUX=0b00100110;
ADCSRA=0b10000000;
};
void main(void){
unsigned char zamer ; // для данных АЦП
unsigned char SW1; // переменная контроля состояния кнопки
unsigned int counter; // счетчик количества измерений
// Global enable interrupts
#asm("sei")
initialization();
while(1){
counter=0;
io=0x01;
SW1 = PIND.4;
lcd_clear();
lcd_putsf("PRESS START");
while (PIND.4 == SW1) { /* пока SW1 не изменился ... */};
if(PIND.4==0){
lcd_clear();
lcd_putsf("Loading...");
PORTA.3=1;
TCCR1B=0x05;
while (io==0x01)
{
ADCSRA|=0x40;
while(ADCSRA&0x40); // ждем пока АЦП не закончит
zamer=ADCH;
printf("%d\n\r", zamer);
counter++;
};
lcd_clear();
lcd_putsf("DONE!");
delay_ms(700);
lcd_clear();
sprintf (lcd_buf, "%u", counter); // Преобразование кол-ва измерений из числа в строку
lcd_putsf("N = ");
lcd_puts(lcd_buf); // Вывод количества измерений на ЖКИ
TCNT1H=0xE1; // реинициализация Т1
TCNT1L=0x7B;
delay_ms(1000);
};
};
};