Автоматическое нажатие F1 через определенное время при запуске сервера.
Иногда случаются ситуации когда необходимо нажимать кнопку F1 , причин может быть много, НО не идти же каждый раз к серверу(компьютеру), а если он в другом городе? — поэтому это устройство призвано автоматизировать процесс.
В данном варианте реализовано только нажатие F1, но при желании можно дополнить алгоритм любыми комбинациями. Исходник написан на CodeVisionAVR с использованием встроенной библиотеки USB Atmega32U4. В качестве макета была использована плата Leonardo Pro micro. Дополнительной возможностью повесил четыре кнопки, на которые назначены операторы в си, но при желании можно запрограммировать другие словосочетания.
Джампер JP1 переключает задержку нажатия F1 — 30 секунд или 60.

#include <mega32u4.h>
#include <delay.h>
// USB Device functions
#include <usb_device.h>
// USB Human Interface Device functions
#include <usb_hid.h>
// USB initialization
#include "usb_init.h"
#define KEY_EN PINF.6
#define KEY_BK PINF.7
#define KEY_CP PINF.4
#define KEY_PS PINF.5
#define JP_TM PIND.1
unsigned int tik=0;
unsigned int tim=0;
void pr()
{
if(tik<tim)
{
tik++;
if(tik==tim-1)
{
usb_keyboard_keypress(KS_F1,0);
PORTB.0=1;
PORTD.5=1;
}
}
delay_ms(100);
if(KEY_CP==0)
{
delay_ms(100);
while(!KEY_CP){;};
usb_keyboard_keypress(KS_I,0); usb_keyboard_keypress(KS_F,0);
}
if(KEY_PS==0)
{
delay_ms(100);
while(!KEY_PS){;};
usb_keyboard_keypress(KS_V,0); usb_keyboard_keypress(KS_O,0);
usb_keyboard_keypress(KS_I,0); usb_keyboard_keypress(KS_D,0);
}
if(KEY_BK==0)
{
delay_ms(100);
while(!KEY_BK){;};
usb_keyboard_keypress(KS_W,0); usb_keyboard_keypress(KS_H,0);
usb_keyboard_keypress(KS_I,0); usb_keyboard_keypress(KS_L,0);
usb_keyboard_keypress(KS_E,0);
}
if(KEY_EN==0)
{
delay_ms(100);
while(!KEY_EN){;};
usb_keyboard_keypress(KS_F,0); usb_keyboard_keypress(KS_O,0);
usb_keyboard_keypress(KS_R,0);
}
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit7=In Bit6=In
DDRC=(0<<DDC7) | (0<<DDC6);
PORTC=(0<<PORTC7) | (0<<PORTC6);
// Port D initialization
DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (1<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (1<<PORTD1) | (0<<PORTD0);
// Port E initialization
// Function: Bit6=In Bit2=In
DDRE=(0<<DDE6) | (0<<DDE2);
PORTE=(0<<PORTE6) | (0<<PORTE2);
// Port F initialization
DDRF=(0<<DDF7) | (0<<DDF6) | (0<<DDF5) | (0<<DDF4) | (0<<DDF1) | (0<<DDF0);
PORTF=(1<<PORTF7) | (1<<PORTF6) | (1<<PORTF5) | (1<<PORTF4) | (0<<PORTF1) | (0<<PORTF0);
// USB Controller initialization in device mode
// Note: This function also initializes the PLL
usb_init_device(&usb_config);
// Global enable interrupts
#asm("sei")
// Wait for the USB device to be enumerated by the host
while (!usb_enumerated);
// Wait 1.5 seconds for the operating system to
// load any drivers needed by the USB device
delay_ms(1500);
if(JP_TM==0)
{
tim = 600; //60
}else{ tim = 300; } //30
while (1)
{
pr();
}
}
Удачных экспериментов!!!