Разработка автоматизированной системы контроля и управления бытовой техникой на основе Linux и микроконтроллера AVR
Обеспечение удалённого и централизованного автоматизированного управления устройствами бытовой техники и контроля за помещением. Разработка микропрограммы для микроконтроллера AVR под управлением Linux и отладка клиентского программного обеспечения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 15.09.2012 |
Размер файла | 2,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
hd44780_wait_ready();
hd44780_outdata(0b00011111);
hd44780_wait_ready();
hd44780_outdata(0b00011100);
hd44780_wait_ready();
hd44780_outdata(0b00011100);
hd44780_wait_ready();
hd44780_outdata(0b00011111);
hd44780_wait_ready();
hd44780_outdata(0b00001110);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outcmd(HD44780_CGADDR(0x0018));
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00001110);
hd44780_wait_ready();
hd44780_outdata(0b00011100);
hd44780_wait_ready();
hd44780_outdata(0b00011000);
hd44780_wait_ready();
hd44780_outdata(0b00011000);
hd44780_wait_ready();
hd44780_outdata(0b00011100);
hd44780_wait_ready();
hd44780_outdata(0b00001110);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outcmd(HD44780_CGADDR(0x0020));
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00001100);
hd44780_wait_ready();
hd44780_outdata(0b00011000);
hd44780_wait_ready();
hd44780_outdata(0b00011000);
hd44780_wait_ready();
hd44780_outdata(0b00011000);
hd44780_wait_ready();
hd44780_outdata(0b00011000);
hd44780_wait_ready();
hd44780_outdata(0b00001100);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outcmd(HD44780_CGADDR(0x0028));
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00001100);
hd44780_wait_ready();
hd44780_outdata(0b00001100);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
hd44780_wait_ready();
hd44780_outdata(0b00000000);
}
void main_init()
{
lcd_init();
SetFont();
lcd_newscreen();
lcd_print_pgm(Text_Loading);
lcd_update();
USART_init();
TSOP_Init(0x20, 2, 0x200);
DS1820_Update();
S1820_GetTemp(0, DS1820_temp1);
DS1820_GetTemp(1, DS1820_temp2);
DDRB = 0;
PORTB = 0xFF;
DDRC = 0xFF;
DDRD &= 0b00000000;
PORTD &= 0b10000000;
eeprom_read_block((void*)RC_Buttons, (void*)0, 4*8); // Кнопки ПДУ
DevicesState = eeprom_read_byte((void*)0x20); // Состояния девайсов
eeprom_read_block((void*)RC_DeviceButtonsOn, (void*)0x21, 4*5); // Кнопки ПДУ для девайсов
eeprom_read_block((void*)RC_DeviceButtonsOff, (void*)0x35, 4*5);
/*
// UART test
int les;
PORTC = 0b00011111;
while (1)
for (les = 0; les < 256; les++)
{
lcd_newscreen();
lcd_printnum(les, 3);
lcd_update();
USART_TransmitByte(les);
_delay_ms(100);
}
*/
PORTC = 0b00011111 & DevicesState & EnabledDevices;
timer_init();
WDTCR = (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); // Watchdog
CommandToPC(1); // Запуск!
USART_TransmitByte(0);
}
char DeviceModeOn[] PROGMEM = "Устройство включено";
char DeviceModeOff[] PROGMEM = "Устройство выключено";
void UpdateDevices()
{
PORTC = (PORTC & 0b11100000) | (DevicesState & EnabledDevices & 0b00011111 & (Motion_Exists ? 0b00011111 : (Motion_Enabled ? ~LIGHT_DEVICES : 0b00011111)));
DevicesState &= EnabledDevices & 0b00011111;
eeprom_write_byte((void*)0x20, DevicesState);
CommandToPC(6); // Текущее состояние девайсов
USART_TransmitByte(DevicesState);
}
void DeviceMode(short int device, short int state)
{
if (state)
{
Motion_Exists = 1;
Motion_NoMotionTime = 0;
}
if (!((EnabledDevices >> device) & 1)) return;
if (((DevicesState >> device) & 1) != (state & 1))
{
lcd_newscreen();
switch (device)
{
case 0: lcd_print_pgm_center(DeviceName1, 0); break;
case 1: lcd_print_pgm_center(DeviceName2, 0); break;
case 2: lcd_print_pgm_center(DeviceName3, 0); break;
case 3: lcd_print_pgm_center(DeviceName4, 0); break;
case 4: lcd_print_pgm_center(DeviceName5, 0); break;
}
if (state)
{
DevicesState |= 1 << device;
lcd_print_pgm_center(DeviceModeOn, 1);
} else {
DevicesState &= ~(1 << device);
lcd_print_pgm_center(DeviceModeOff, 1);
}
lcd_update();
Notice_timeout = NOTICE_TIME;
}
UpdateDevices();
}
void ExecCommand()
{
unsigned short int i, i2;
switch (command_num)
{
case 1:
time_hours = command_buf[0]; // 1 - Синхронизация времени (3 байта)
time_mins = command_buf[1];
time_secs = command_buf[2];
time_tics = 0;
time_is_set = 1;
break;
case 2:// 2 - Обновление данных (1 байт, любой)
CommandToPC(7); // 7 - Список доступных девайсов - 1 байт
USART_TransmitByte(EnabledDevices);
for (i = 0; i < 5; i++)
{
CommandToPC(8); // 8 - Названия девайсов - 1 + 22 байта
USART_TransmitByte(i);
int eol = 0;
for (i2 = 0; i2 < 22; i2++)
{
char* DName = 0;
switch (i)
{
case 0: DName = DeviceName1; break;
case 1: DName = DeviceName2; break;
case 2: DName = DeviceName3; break;
case 3: DName = DeviceName4; break;
case 4: DName = DeviceName5; break;
}
char c = pgm_read_byte(&DName[i2]);
if (!c) eol = 1;
if (!eol) USART_Transmit Byte(c); else USART_Transmit Byte(0);
}
}
Update Devices();
Command ToPC(2); // Температура
USART_Transmit (DS1820_GetRawTemp(), 4);
Command ToPC(9); // Движение
USART_Transmit Byte (Motion_Exists);
break;
case 3:// 3 - Вывод текста на дисплей (48 байт)
for (i = 0; i < 48; i++) PC_lcd[i] = Rus Encode (command_buf[i]);
PC_lcd_timeout = PC_LCD_TIMEOUT;
break;
case 4:// 4 - Выход из PC режима (1 байт, любой)
PC_lcd_timeout = 0;
break;
case 5: // 5 - Вывод нотиса на дисплей (48 байт)
lcd_newscreen();
for (i = 0; i < 24; i++) lcd_putchar(command_buf[i]);
lcd_putchar('\n');
for (i = 24; i < 48; i++) lcd_putchar(command_buf[i]);
lcd_update();
Notice_timeout = NOTICE_TIME;
break;
case 6: // Включение/выключение устройства (1 байт - номер устройства и 1 - команда)
DeviceMode(command_buf[0], command_buf[1]);
break;
case 7: // Комп говорит, что я сижу за компом, т.е. свет не вырубать! (1 байт, любой)
Motion_SSaverTimeout = MOTION_SSAVER_TIMEOUT;
break;
case 8: // Комп говорит, что надо игнорировать кнопки управления самим девайсом, отдадим их под софт на PC (1 байт, любой);
IgnoreRC_timeout = IGNORERC_TIMEOUT;
break;
case 9: // Комп говорит, что уже НЕ надо игнорировать кнопки управления самим девайсом, отдадим их под софт на PC (1 байт, любой);
IgnoreRC_timeout = 0;
break;
}
command_complete = 0;
command_state = 0;
}
void MainUpdate(char mode)
{
wdt_reset();
unsigned char b;
unsigned long RC_Button;
RC_Button_Newpress = TSOP_GetNewpress(); // Не нажата ли кнопка на ПДУ?
if (RC_Button_Newpress > 0)
{
CommandToPC(4); // Нажата кнопка на ПДУ
USART_Transmit((void*)&RC_Button_Newpress, 4); // Шлём её на комп
}
RC_Button = TSOP_GetRepeat(); // А может ЗАжата?
if ((TSOP_GetButton() == 1) && (RC_Button > 0))
{
CommandToPC(5); // Держится кнопка на ПДУ
USART_Transmit((void*)&RC_Button, 4);
}
Button_Newpress = 0;
for (b = 0; b < 7; b++) // Читаем кнопки
{
if ((((PINB>>b) & 1) == 0) && (((Button_NewpressOld>>b) & 1) == 1))
Button_Newpress = b + 1;
if ((IgnoreRC_timeout == 0) && (RC_Button_Newpress > 0) && (RC_Button_Newpress == RC_Buttons[b])) Button_Newpress = b + 1;
}
if ((IgnoreRC_timeout == 0) && (RC_Button_Newpress > 0) && (RC_Button_Newpress == RC_Buttons[7])) Button_Newpress = 6; // Дублируем кнопку OK
Button_NewpressOld = PINB;
for (b = 0; b < 5; b++) // Что-то включаем?
{
if ((RC_Button_Newpress > 0) && (RC_Button_Newpress == RC_DeviceButtonsOn[b])) DeviceMode(b, 1);
if ((RC_Button_Newpress > 0) && (RC_Button_Newpress == RC_DeviceButtonsOff[b])) DeviceMode(b, 0);
}
if ((time_mins != time_lastmin) || ((time_secs == 30) && (time_secs != time_lastsec)))
{
DS1820_Update();
DS1820_GetTemp(0, DS1820_temp1);
DS1820_GetTemp(1, DS1820_temp2);
time_lastmin = time_mins;
}
if ((time_secs == 30) && (time_secs != time_lastsec)) // Каждую минуту шлём на комп температуру
{
CommandToPC(2); // Температура
USART_Transmit(DS1820_GetRawTemp(), 4);
UpdateDevices(); // И состояние девайсов...
CommandToPC(9); // Движение
USART_TransmitByte(Motion_Exists);
}
if (time_secs != time_lastsec) // Счётчики
{
time_lastsec = time_secs;
if (PC_lcd_timeout > 0) PC_lcd_timeout--;
if (NOPC_lcd_timeout > 0) NOPC_lcd_timeout--;
if (IgnoreRC_timeout > 0) IgnoreRC_timeout--;
if (Timer_timeout > 0)
{
Timer_timeout--;
if (Timer_timeout == 0)
{
DevicesState &= ~LightDevices;
UpdateDevices();
}
}
if (Motion_WorkTime < 30000) Motion_WorkTime++;
if (Motion_NoMotionTime < 30000) Motion_NoMotionTime++;
if (Motion_WorkTime < 3) PORTC &= 0b10111111; // Выключаем датчик движения
if (Motion_WorkTime == 3) PORTC |= 0b01000000; // Включаем
if (Motion_Exists && (Motion_NoMotionTime >= MOTION_TIMEOUT) && (Motion_SSaverTimeout == 0)) // Нет движения тут!
{
Motion_Exists = 0;
UpdateDevices();
CommandToPC(9); // Движение
USART_TransmitByte(0);
}
if (Motion_SSaverTimeout > 0) Motion_SSaverTimeout--;
}
if (Notice_timeout > 0) Notice_timeout--;
if (command_complete) ExecCommand(); // Выполняем команду от компа, если нужно
if (mode || (PC_lcd_timeout == 0) || (NOPC_lcd_timeout > 0)) // Какой режим?
{
if (Notice_timeout == 0) lcd_update();
if ((Button_Newpress == 1) && (mode == 0)) NOPC_lcd_timeout = 0;
if (Button_Newpress > 1) NOPC_lcd_timeout = NOPC_LCD_TIMEOUT;
} else {
if (Notice_timeout == 0) lcd_spec_update(PC_lcd);
if (Button_Newpress == 1) NOPC_lcd_timeout = NOPC_LCD_TIMEOUT;
if (Button_Newpress > 1)
{
CommandToPC(3); // Нажали кнопку
USART_Transmit((void*)&Button_Newpress, 1);
Button_Newpress = 0;
}
if ((PIND >> 7) || (!Motion_Enabled))
{
Motion_Exists)
{
Motion_Exists = 1;
UpdateDevices();
CommandToPC(9); // Движение
USART_TransmitByte(1);
}
Motion_NoMotionTime = 0;
if (Motion_WorkTime >= MOTION_TIME_UNTIL_REBOOT) Motion_WorkTime = 0;
}
// if (!Motion_Exists && (time_secs % 2 == 0)) PORTC |= (1 << 7);
}
char Text_Temp1[] PROGMEM = "Темп-ра на улице: ";
char Text_Temp2[] PROGMEM = "Темп-ра в комнате: ";
char Text_TimerOn[] PROGMEM = "Активирован таймер";
char Text_TimerLeft[] PROGMEM = "\n Осталось ";
char Text_TimerLeft2[] PROGMEM = " секунд";
int glukipause(unsigned long c)
{
unsigned long int i;
for (i = 0; i < c; i++)
{
MainUpdate(0);
if (Button_Newpress > 2) return 1;
}
return 0;
}
char Text_GlukiFace1[] PROGMEM = "=O.o=";
char Text_GlukiFace2[] PROGMEM = "=o.O=";
char Text_GlukiFace3[] PROGMEM = "=0.o=";
char Text_GlukiFace4[] PROGMEM = "=o.0=";
char Text_GlukiFace5[] PROGMEM = "=O.0=";
char Text_GlukiFace6[] PROGMEM = "=^_^=";
char Text_GlukiFace7[] PROGMEM = "=O_o=";
char Text_GlukiCC[] PROGMEM = "Cluster Control";
char Text_GlukiCC2[] PROGMEM = "Йа Кластер Контролко!";
char Text_GlukiPreved[] PROGMEM = "Превед медвед!";
char Text_GlukiPreved2[] PROGMEM = "Я кластерное чудо!";
char Text_GlukiRobot1[] PROGMEM = "Убить всех людей!";
char Text_GlukiRobot2[] PROGMEM = "Слава роботам";
char Text_GlukiLost[] PROGMEM = ">: 4 8 15 16 23 42 ";
char Text_GlukiBase[] PROGMEM = "All your base are belong to us!";
inline int gluki(int type) // :))
{
char* Faces[5] = {Text_GlukiFace1, Text_GlukiFace2, Text_GlukiFace3, Text_GlukiFace4, Text_GlukiFace5};
int i;
switch (type)
{
case 0:
for (i = 0; i < 5; i++)
{
lcd_newscreen();
lcd_print_pgm(Faces[rand()%5]);
lcd_goto(10, 0);
lcd_print_pgm(Faces[rand()%5]);
lcd_goto(19, 0);
lcd_print_pgm(Faces[rand()%5]);
lcd_goto(4, 1);
lcd_print_pgm(Faces[rand()%5]);
lcd_goto(16, 1);
lcd_print_pgm(Faces[rand()%5]);
f (glukipause(50)) return 1;
}
lcd_newscreen();
lcd_print_pgm_center(Text_GlukiCC, 0);
lcd_print_pgm_center(Text_GlukiFace6, 1);
if (glukipause(300)) return 1;
break;
case 1:
lcd_newscreen();
lcd_print_pgm_center(Text_GlukiCC2, 0);
lcd_print_pgm_center(Text_GlukiFace7, 1);
if (glukipause(300)) return 1;
break;
case 2:
lcd_newscreen();
lcd_print_pgm_center(Text_GlukiPreved, 0);
lcd_print_pgm_center(Text_GlukiPreved2, 1);
if (glukipause(300)) return 1;
break;
case 3:
lcd_newscreen();
lcd_print_pgm_center(Text_GlukiRobot1, 0);
lcd_print_pgm_center(Text_GlukiRobot2, 1);
if (glukipause(300)) return 1;
break;
case 4:
for (i = 0; i < 3; i++)
{
lcd_newscreen();
lcd_print_pgm(Text_GlukiLost);
if (glukipause(200)) return 1;
lcd_newscreen();
lcd_print_pgm(Text_GlukiLost);
lcd_putchar('\\');
if (glukipause(200)) return 1;
}
break;
}
return 0;
}
unsigned char nextframe(unsigned char pacman)
{
if (pacdir) pacman++; else pacman--;
if (pacman == 4) pacdir = 0;
if (pacman == 1) pacdir = 1;
return pacman;
}
char Text_Time[] PROGMEM = "А у нас сейчас: ";
char Text_TimeIsNotSet[] PROGMEM = " Время не установлено ";
inline void main_idle()
{
const char separator = ':';
unsigned long int i, c, c2, c3;
unsigned char pacman;
int glukitype = 0;
while (Timer_timeout > 0)
{
lcd_newscreen();
lcd_print_pgm_center(Text_TimerOn, 0);
lcd_print_pgm(Text_TimerLeft);
lcd_printnum(Timer_timeout, 2);
lcd_print_pgm(Text_TimerLeft2);
MainUpdate(0);
if (Button_Newpress > 2) return;
}
while (1)
{
pacman = 1;
pacdir = 1;
for (c = 0; c <= 23; c++)
{
for (c2 = 0; c2 < 6; c2++)
{
pacman = nextframe(pacman);
lcd_newscreen();
lcd_goto(c,1);
lcd_putchar(pacman);
for (c3 = c+1; c3 <= 23; c3++) lcd_putchar(5);
if ((c / 3) % 4 <= 1)
{
if (time_is_set)
{
lcd_goto(0, 0);
lcd_print_pgm(Text_Time);
lcd_printnum(time_hours, 2);
lcd_putchar(separator);
lcd_printnum(time_mins, 2);
lcd_putchar(separator);
lcd_printnum(time_secs, 2);
} else lcd_print_pgm_center(Text_TimeIsNotSet, 0);
} else
if ((c / 3) % 4 == 2)
{
lcd_goto(0, 0);
lcd_print_pgm(Text_Temp1);
if (strlen(DS1820_temp1) < 5) lcd_putchar(' ');
lcd_print(DS1820_temp1);
} else
if ((c / 3) % 4 == 3)
{
lcd_goto(0, 0);
lcd_print_pgm(Text_Temp2);
if (strlen(DS1820_temp2) < 5) lcd_putchar(' ');
lcd_print(DS1820_temp2);
}
/*
else {
lcd_print_pgm_center(Text_Version, 0);
}
*/
for (i = 0; i < 30; i++)
{
MainUpdate(0);
if (Button_Newpress > 2) return;
}
}
}
if (gluki(glukitype)) return;
glukitype++;
if (glukitype > 4) glukitype = 0;
nt = 5;
short int CurItem = 0;
unsigned long int MenuTimeout = 0;
while (Button_Newpress != 2)
{
lcd_newscreen();
lcd_putchar('<'); lcd_goto(23, 0); lcd_putchar('>');
lcd_goto(1, 0);
if (CurItem >= ItemsCount) CurItem = 0;
while (!((EnabledDevices >> CurItem) & 1))
{
CurItem++;
if (CurItem >= ItemsCount) CurItem = 0;
}
switch (CurItem)
{
case 0: lcd_print_pgm_center(DeviceName1, 0); break;
case 1: lcd_print_pgm_center(DeviceName2, 0); break;
case 2: lcd_print_pgm_center(DeviceName3, 0); break;
case 3: lcd_print_pgm_center(DeviceName4, 0); break;
case 4: lcd_print_pgm_center(DeviceName5, 0); break;
}
lcd_goto(0, 1);
lcd_print_pgm(Text_DevicesMenuOff);
lcd_goto(21, 1);
lcd_print_pgm(Text_DevicesMenuOn);
if ((DevicesState >> CurItem) & 1) lcd_print_pgm_center(Text_DevicesMenuON, 1); else lcd_print_pgm_center(Text_DevicesMenuOFF, 1);
MainUpdate(1);
if (Button_Newpress == 3)
{
CurItem--;
if (CurItem < 0) CurItem = ItemsCount - 1;
while (!((EnabledDevices >> CurItem) & 1))
{
CurItem--;
if (CurItem < 0) CurItem = ItemsCount - 1;
}
}
if (Button_Newpress == 4) CurItem++;
if (Button_Newpress == 5) DeviceMode(CurItem, 0);
if (Button_Newpress == 7) DeviceMode(CurItem, 1);
if (Button_Newpress > 0) MenuTimeout = 0;
MenuTimeout++;
if (MenuTimeout > MENU_TIMEOUT) return 1;
}
return 0;
}
char Text_RC_SettingsMenu[] PROGMEM = " Настройка ПДУ\n< >";
char Text_RC_SettingsMenu1[] PROGMEM = "Основные кнопки";
char Text_RC_SettingsMenu2[] PROGMEM = "Включающие кнопки";
char Text_RC_SettingsPress[] PROGMEM = "Жми на пульте кнопку\n";
char Text_RC_SettingsPress1[] PROGMEM = "режим";
char Text_RC_SettingsPress2[] PROGMEM = "назад";
char Text_RC_SettingsPress3[] PROGMEM = "влево";
char Text_RC_SettingsPress4[] PROGMEM = "вправо";
char Text_RC_SettingsPress5[] PROGMEM = "вниз-влево";
char Text_RC_SettingsPress6[] PROGMEM = "OK";
char Text_RC_SettingsPress7[] PROGMEM = "вниз-вправо";
char Text_RC_SettingsPress8[] PROGMEM = "вниз";
char Text_RC_SettingsPressOk[] PROGMEM = " - ";
char Text_RC_SettingsPressOn[] PROGMEM = "Жми кнопку включения\n";
char Text_RC_SettingsPressOff[] PROGMEM = "Жми кнопку выключения\n";
inline void RC_settings_menu()
{
const short int ItemsCount = 2;
short int CurItem = 0;
unsigned long int MenuTimeout = 0;
while (Button_Newpress != 2)
{
lcd_newscreen();
lcd_print_pgm(Text_RC_SettingsMenu);
lcd_goto(1, 1);
switch (CurItem)
{
case 0: lcd_print_pgm_center(Text_RC_SettingsMenu1, 1); break;
case 1: lcd_print_pgm_center(Text_RC_SettingsMenu2, 1); break;
}
MainUpdate(1);
if (Button_Newpress == 3) CurItem--;
if (Button_Newpress == 4) CurItem++;
if (CurItem < 0) CurItem = ItemsCount - 1;
if (CurItem >= ItemsCount) CurItem = 0;
if (Button_Newpress > 0) MenuTimeout = 0;
if (Button_Newpress > 4)
{
int i;
switch (CurItem)
{
case 0:
for (i = 0; i < 8; i++) RC_Buttons[i] = 0;
for (i = 0; i < 8; i++)
{
do {
lcd_newscreen();
lcd_print_pgm(Text_RC_SettingsPress);
switch (i)
{
case 0: lcd_print_pgm(Text_RC_SettingsPress1); break;
case 1: lcd_print_pgm(Text_RC_SettingsPress2); break;
case 2: lcd_print_pgm(Text_RC_SettingsPress3); break;
case 3: lcd_print_pgm(Text_RC_SettingsPress4); break;
case 4: lcd_print_pgm(Text_RC_SettingsPress5); break;
case 5: lcd_print_pgm(Text_RC_SettingsPress6); break;
case 6: lcd_print_pgm(Text_RC_SettingsPress7); break;
case 7: lcd_print_pgm(Text_RC_SettingsPress8); break;
}
MainUpdate(1);
} while (RC_Button_Newpress == 0);
RC_Buttons[i] = RC_Button_Newpress;
lcd_print_pgm(Text_RC_SettingsPressOk);
lcd_printnum(RC_Buttons[i], 10);
MainUpdate(1);
_delay_ms(500);
}
eeprom_write_block((void*)RC_Buttons, (void*)0, 4*8);
break;
case 1:
for (i = 0; i < 5; i++) { RC_DeviceButtonsOn[i] = 0; RC_DeviceButtonsOff[i] = 0; }
for (i = 0; i < 5; i++)
{
if ((EnabledDevices >> i) & 1)
{
do {
lcd_newscreen();
lcd_print_pgm_center(Text_RC_SettingsPressOn, 0);
switch (i)
{
case 0: lcd_print_pgm_center(DeviceName1, 1); break;
case 1: lcd_print_pgm_center(DeviceName2, 1); break;
case 2: lcd_print_pgm_center(DeviceName3, 1); break;
case 3: lcd_print_pgm_center(DeviceName4, 1); break;
case 4: lcd_print_pgm_center(DeviceName5, 1); break;
}
MainUpdate(1);
} while (RC_Button_Newpress == 0);
RC_DeviceButtonsOn[i] = RC_Button_Newpress;
MainUpdate(1);
while (RC_Button_Newpress == 0)
{
lcd_newscreen();
lcd_print_pgm_center(Text_RC_SettingsPressOff, 0);
switch (i)
{
case 0: lcd_print_pgm_center(DeviceName1, 1); break;
case 1: lcd_print_pgm_center(DeviceName2, 1); break;
case 2: lcd_print_pgm_center(DeviceName3, 1); break;
case 3: lcd_print_pgm_center(DeviceName4, 1); break;
case 4: lcd_print_pgm_center(DeviceName5, 1); break;
}
MainUpdate(1);
}
RC_DeviceButtonsOff[i] = RC_Button_Newpress;
}
}
eeprom_write_block((void*)RC_DeviceButtonsOn, (void*)0x21, 4*5); // Кнопки ПДУ для девайсов
eeprom_write_block((void*)RC_DeviceButtonsOff, (void*)0x35, 4*5);
break;
}
}
MenuTimeout++;
if (MenuTimeout > MENU_TIMEOUT) return;
}
}
char Text_MainMenu[] PROGMEM = " Главное меню\n< >";
char Text_MainMenu1[] PROGMEM = "Управление девайсами";
char Text_MainMenu2[] PROGMEM = "Показать температуру";
char Text_MainMenu3[] PROGMEM = "Включить таймер";
char Text_MainMenu4[] PROGMEM = "Настройка ПДУ";
char Text_MainMenu5[] PROGMEM = "Датчик движения";
inline void main_menu()
{
const short int ItemsCount = 5;
short int CurItem = 0;
unsigned long int MenuTimeout = 0;
while (1)
{
lcd_newscreen();
lcd_print_pgm(Text_MainMenu);
lcd_goto(1, 1);
switch (CurItem)
{
case 0: lcd_print_pgm_center(Text_MainMenu1, 1); break;
case 1: lcd_print_pgm_center(Text_MainMenu2, 1); break;
case 2: lcd_print_pgm_center(Text_MainMenu3, 1); break;
case 3: lcd_print_pgm_center(Text_MainMenu5, 1); break;
case 4: lcd_print_pgm_center(Text_MainMenu4, 1); break;
}
MainUpdate(1);
if (Button_Newpress == 2) return;
if (Button_Newpress == 3) CurItem--;
f (Button_Newpress == 4) CurItem++;
f (CurItem < 0) CurItem = ItemsCount - 1;
if (CurItem >= ItemsCount) CurItem = 0;
if (Button_Newpress > 0) MenuTimeout = 0;
if (Button_Newpress > 4)
{
unsigned char temp_time_lastsec = 0;
switch (CurItem)
{
case 0:
if (devices_menu()) return;
break;
case 1:
do {
lcd_newscreen();
if (time_secs != time_lastsec)
{
temp_time_lastsec = time_secs;
if ((time_secs != 0) && (time_secs != 30) && (time_secs % 5 == 0))
{
DS1820_Update();
DS1820_GetTemp(0, DS1820_temp1);
= NOTICE_TIME;
Timer_timeout = TIMER_TIME;
break;
case 3:
do {
lcd_newscreen();
lcd_print_pgm_center(Text_MainMenu5, 0);
lcd_goto(0, 1);
lcd_print_pgm(Text_DevicesMenuOff);
lcd_goto(21, 1);
lcd_print_pgm(Text_DevicesMenuOn);
if (Motion_Enabled) lcd_print_pgm_center(Text_DevicesMenuON, 1); else lcd_print_pgm_center(Text_DevicesMenuOFF, 1);
MainUpdate(1);
if (Button_Newpress == 5) Motion_Enabled = 0;
if (Button_Newpress == 7) Motion_Enabled = 1;
if (Button_Newpress > 0) MenuTimeout = 0;
MenuTimeout++;
if (MenuTimeout > MENU_TIMEOUT) return;
} while (Button_Newpress != 2);
break;
case 4:
RC_settings_menu();
break;
}
}
MenuTimeout++;
if (MenuTimeout > MENU_TIMEOUT) return;
}
}
int main(void)
{
main_init();
while(1)
{
main_idle();
main_menu();
}
}
Размещено на Allbest.ru
Подобные документы
Роль микроконтроллеров в современных системах управления. Проектирование схемы на основе микроконтроллера Aduc812, которая будет контролировать работу бытовой стиральной машины. Элементная база, описание и функционирование программы, ее листинг.
курсовая работа [101,3 K], добавлен 23.12.2012Архитектура автоматизированной информационной системы управления складом. Заказ материалов, подсистема учета материалов бытовой техники на цеховом складе. Внемашинное информационное обеспечение. Выбор инструментальной платформы для реализации системы.
курсовая работа [1,6 M], добавлен 04.12.2014Linux - ядро операционной системы с монолитной архитектурой. Прародители операционной системы Linux, ее стабильные и экспериментальные версии. Процесс внедрения Linux и свободного программного обеспечения в школах и государственных учреждениях России.
реферат [18,2 K], добавлен 19.01.2013Идея создания системы удаленного управления и контроля устройств. Разработка электрической принципиальной и структурной схемы. Обоснование выбора микроконтроллера и чипа ENC28J60. Обоснование выбора и отладки среды моделирования, программы и компилятора.
курсовая работа [3,5 M], добавлен 26.08.2014Методические аспекты перехода на СПО в условиях школьного образования. Аналоги Linux-программ при создании школьного комплекта свободного программного обеспечения. Методика использования альтернативной реализации Windows-интерфейса в системе Linux.
дипломная работа [2,3 M], добавлен 03.05.2012Понятие и сущность операционных систем, особенности их возникновения. История создания операционной системы Linux, ее основные характеристики, сетевые возможности. Анализ бизнес-модели производства и распространения "свободного" программного обеспечения.
реферат [35,8 K], добавлен 05.04.2010Изучение IT-инфраструктуры компании проката автомобилей. Основные требования к автоматизации движения товаров. Анализ создания конфигурации для оптового склада бытовой техники. Разработка информационно-логической модели автоматизированной системы.
курсовая работа [1,1 M], добавлен 22.03.2021Разработка приложения, которое осуществляет удаленный доступ управления компьютером с операционной системой Linux с компьютера с ОС Windows. Реализация функциональной части. Графический интерфейс клиента и сервера. Разработка интеграционных тестов.
курсовая работа [1,1 M], добавлен 28.04.2014Разработка встраиваемого в электронную аппаратуру микроконтроллера с целью обеспечения ввода данных с клавиатуры и отображения результатов обработки на индикации. Описание активного элемента (системная шина ISA). Программное обеспечение микроконтроллера.
курсовая работа [848,9 K], добавлен 05.02.2016Создание программного продукта, предназначенного для небольшой сети с оптимизацией ее работы на платформе операционной системы Linux; администрирование. Разработка модуля протоколов управления; методика тестирования подсистемы; системотехнический анализ.
дипломная работа [5,4 M], добавлен 27.06.2012