/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Standard
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.come-mail:office@hpinfotech.com
Project :
Version :
Date : 15.01.2010
Author : ps1x
Company : asd
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <16x2.h>
// Declare your global variables here
char kod;
char last_item;
int current_menu=0; //Переменная указывает на текущее меню
int current_poz=1; //Переменная указывает на текущий пункт меню/подменю
void goto_menu(void);
void print_menu(void);
//Структура описывает пункт меню
typedef struct _selection
{
unsigned char *mas; // Указатель на название пункта
void (*function)(void); //Указатель на функцию выполняющуюся по нажатии на enter/escape
unsigned ent_f: 4; //Флаг входа 4 бита - обычно ID меню в которое надо войти
unsigned esc_f: 4; //Флаг выхода 4 бита - обычно ID меню в которое надо вернуться
}SELECTION;
//Структура описывает меню/подменю
typedef struct _menu {
unsigned char id; //Номер меню/подменю
unsigned char num_selections; //Количество пунктов данного меню/подменю
SELECTION *m; //Указатель намассив пунктов данного меню/подменю
}MENU;
//Номера меню/подменю
enum __menu__id {
MAIN_MENU, //Главное меню
DELAY_MENU, //Меню настроек
FOCUS_MENU,
QUANTITY_MENU,
TIME_MENU //Меню отчёта
};
//Имена пунктов
unsigned char X1[]={"Задержка"};
unsigned char X2[]={"1 сек"};
unsigned char X3[]={"2 сек"};
unsigned char X4[]={"3 сек"};
unsigned char X5[]={"4 сек"};
unsigned char X6[]={"5 сек"};
unsigned char X7[]={"8 сек"};
unsigned char X8[]={"10 сек"};
unsigned char X9[]={"15 сек"};
unsigned char X10[]={"20 сек"};
unsigned char X11[]={"30 сек"};
unsigned char X12[]={"Фокусировка"};
unsigned char X13[]={"Выкл"};
unsigned char X14[]={"0,5 сек"};
unsigned char X15[]={"1 сек"};
unsigned char X16[]={"Кол. фоток"};
unsigned char X17[]={"50 шт"};
unsigned char X18[]={"100 шт"};
unsigned char X19[]={"200 шт"};
unsigned char X20[]={"300 шт"};
unsigned char X21[]={"500 шт"};
unsigned char X22[]={"800 шт"};
unsigned char X23[]={"1000 шт"};
unsigned char X24[]={"Время фотогр."};
unsigned char X25[]={"Непрерывно"};
unsigned char X26[]={"5 мин"};
unsigned char X27[]={"10 мин"};
unsigned char X28[]={"15 мин"};
unsigned char X29[]={"пол часа"};
unsigned char X30[]={"час"};
unsigned char X31[]={"два часа"};
unsigned char X32[]={"Старт съемки"};
//Заголовки функций
void func1(void){}
void func2(void){}
void func3(void){}
void func4(void){}
void func5(void){}
void func6(){}
void func7(void){}
//Массив хранищий пункты главного меню (структура SELECTION)
static SELECTION menu_[]={
{X1, goto_menu, DELAY_MENU, MAIN_MENU}, //Punkt 1
{X12, goto_menu, FOCUS_MENU, MAIN_MENU}, //Punkt 2
{X16, goto_menu, QUANTITY_MENU, MAIN_MENU}, //Punkt 3
{X24, goto_menu, TIME_MENU, MAIN_MENU}, //Punkt 4
{X32, func7, 0, 0} //Punkt 4
};
//Массив хранищий пункты меню настроек (структура SELECTION)
static SELECTION menu_m0[]={
{X2, func6, 0, 0}, //Punkt 1
{X3, func6, 0, 0}, //Punkt 2
{X4, func6, 0, 0}, //Punkt 3
{X5, func6, 0, 0}, //Punkt 2
{X6, func6, 0, 0}, //Punkt 2
{X7, func6, 0, 0}, //Punkt 2
{X8, func6, 0, 0}, //Punkt 2
{X9, func6, 0, 0}, //Punkt 2
{X10, func6, 0, 0}, //Punkt 2
{X11, func6, 0, 0} //Punkt 2
};
static SELECTION menu_m1[]={
{X13, func6, 0, 0}, //Punkt 1
{X14, func6, 0, 0}, //Punkt 2
{X15, func6, 0, 0} //Punkt 3
};
static SELECTION menu_m2[]={
{X17, func6, 0, 0}, //Punkt 1
{X18, func6, 0, 0}, //Punkt 2
{X19, func6, 0, 0}, //Punkt 3
{X20, func6, 0, 0}, //Punkt 1
{X21, func6, 0, 0}, //Punkt 2
{X22, func6, 0, 0}, //Punkt 3
{X23, func6, 0, 0} //Punkt 1
};
static SELECTION menu_m3[]={
{X25, func6, 0, 0}, //Punkt 1
{X26, func6, 0, 0}, //Punkt 2
{X27, func6, 0, 0}, //Punkt 3
{X28, func6, 0, 0}, //Punkt 1
{X29, func6, 0, 0}, //Punkt 2
{X30, func6, 0, 0}, //Punkt 3
{X31, func6, 0, 0} //Punkt 1
};
//Главный массив хранит в себе все меню/подменю
//Все меню/подменю должны описываться в таком же порядке как и в enum __menu__id ...
static MENU menu[] = {
{MAIN_MENU, 5, menu_}, //Меню 1
{DELAY_MENU, 10, menu_m0}, //Меню 2
{FOCUS_MENU, 3, menu_m1},
{QUANTITY_MENU, 7, menu_m2},
{TIME_MENU, 7, menu_m3}
};
void goto_menu(void) {
switch (kod) {
case 'e': {current_menu=menu[current_menu].m[current_poz].ent_f; last_item=current_poz; break;}; //enter
case 'b': {current_menu=menu[current_menu].m[current_poz].esc_f; break;}; //escape
}
current_poz=0;
}
void print_menu()
{
lcd_clear();
lcd_putsf("> ");
lcd_puts(menu[current_menu].m[current_poz].mas);
lcd_gotoxy(2,1);
if (current_poz == menu[current_menu].num_selections-1) {
lcd_puts(menu[current_menu].m[0].mas);
// lcd_putsf("-------------------");
}
else {
lcd_puts(menu[current_menu].m[current_poz+1].mas);
}
delay_ms(100);
kod='k';
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFF;
DDRD=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: Timer 1 Stopped
// 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: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
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=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
lcd_init();
lcd_clear();
lcd_putsf(" МИЭМ");
lcd_gotoxy(0,1);
lcd_putsf(" USB частотомер");
print_menu();
while (1)
{
if(PIND.0==0){delay_ms(150);kod='u';}
if(PIND.1==0){delay_ms(150);kod='d';}
if(PIND.2==0){delay_ms(150);kod='e';}
if(PIND.3==0){delay_ms(150);kod='b';}
switch (kod) {
case 'u': {
if (current_poz<=0){current_poz=menu[current_menu].num_selections-1;}else{current_poz--;}
print_menu();
break;
};
case 'd': {
if(current_poz>=menu[current_menu].num_selections-1){current_poz=0;}else{current_poz++;}
print_menu();
break;
};
case 'b': {
goto_menu();
current_poz=last_item;
print_menu();
break;
};
case 'e': {
menu[current_menu].m[current_poz].function();
print_menu();
break;
};
};
};
}