Исходник - полностью прокомментированный - на Си Переменные: TIME - время включения (работы) двигателей при складывании-раскладывании (в исходнике 7 сек.) START_WAIT_TIME - время задержки раскладывания после включения зажигания (в исходнике 30 сек.) Код /* Description: Car mirror open-close system * /* Author - ShH ;) * ********************************************** * Vdd 1 -|Vdd GND|- 8 GND * Open key 2 -|GP5 GP0|- 7 Rotate * Close key 3 -|GP4 GP1|- 6 Polarity relay * Vdd-10k 4 -|MCLR GP2|- 5 Switch relay * /GP3 */ #define TIME 7000 #define START_WAIT_TIME 0 sbit Rotate at GPIO.B0; // Rotate key (Input) sbit Polar at GPIO.B1; // Polarization relay (Output) sbit Switch at GPIO.B2; // Switch relay (Output) sbit MClose at GPIO.B4; // Close key (Input) sbit MOpen at GPIO.B5; // Open key (Input) char Pos; // Variable to store mirror position // (1-open, 0-close) bit Lock; // Mirror lock (1-locked, 0-unlocked) void Open(){ // Open() function Pos = 1; // Change Pos EEPROM_Write(0,Pos); // Store Pos Polar = 1; // Turn on Polar delay_ms(50); // Wait Switch = 1; // Turn on switch for(count= 0; count < TIME; ++count) { delay_ms(1); // Wait TIME mseconds if(Rotate) return; } Switch = 0; // Switch off Polar = 0; // Polar off } // End of Open() function void Close(){ // Close() function Pos = 0; // Change Pos EEPROM_Write(0,Pos); // Store Pos Switch = 1; // Switch on for(count= 0; count < TIME; ++count) { delay_ms(1); // Wait TIME mseconds if(Rotate) return; } Switch = 0; // Switch off } // End of Close() function void main() { // Main() function CMCON = 0b00000111; TRISIO = 0b110001; // Define IO pins ANSEL = 0; Polar = 0; // Turn off Polar Switch = 0; // Turn off Switch Pos = EEPROM_Read(0); // Read stored Pos delay_ms(START_WAIT_TIME); // Wait a bit while(1){ // Endless loop if(!MOpen && Lock){ // MOpen is'nt pressed Lock = 0; // Unlock mirror delay_ms(100); // Wait } if(MOpen){ // if MOpen is pressed if(!Pos && !Lock){ // mirror is closed and unlocked Open(); // just Open } Lock = 1; // Lock mirror } if(!MClose && Pos) // if MClose is pressed and mirror is opened Close(); // just close } // Thats all! :) }