/* @brief 初始化CAPK @param 无 @return CAPKERR_xxx */ int CAPK_Init(void) { int fp; fdel(FILE_CAPK); fp = fopen(FILE_CAPK, "w"); fclose(fp); if (fp < 0) { return(CAPKERR_INIT); } return(CAPKERR_NONE); }
void main(void) { // Declare your local variables here // 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 // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=P Bit1=P Bit0=P PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=P Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=T Bit1=T Bit0=T PORTD=(1<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Fast PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Disconnected // Timer Period: 0,016 ms // Output Pulse(s): // OC0A Period: 0,016 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 4,096 ms // Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); 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: 16000,000 kHz // Mode: Fast PWM top=0xFF // OC2A output: Disconnected // OC2B output: Non-Inverted PWM // Timer Period: 0,016 ms // Output Pulse(s): // OC2B Period: 0,016 ms Width: 8,0314 us ASSR=(0<<EXCLK) | (0<<AS2); TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (1<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20); TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (1<<CS20); TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1); // Timer/Counter 2 Interrupt(s) initialization TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2); // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); EIMSK=(0<<INT1) | (0<<INT0); PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0); // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART0 Mode: Asynchronous // USART Baud Rate: 9600 UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0); UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80); UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0); UBRR0H=0x00; UBRR0L=0x67; // Analog Comparator initialization // Analog Comparator: On // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin // Interrupt on Rising Output Edge // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=(0<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (1<<ACIE) | (0<<ACIC) | (1<<ACIS1) | (1<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR1=(0<<AIN0D) | (0<<AIN1D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // SPI initialization // SPI disabled SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0); // TWI initialization // Mode: TWI Slave // Match Any Slave Address: Off // I2C Bus Slave Address: 0x21 twi_slave_init(false,0x21,twi_rx_buffer,sizeof(twi_rx_buffer),twi_tx_buffer,twi_rx_handler,twi_tx_handler); // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTB Bit 0 // RD - PORTB Bit 7 // EN - PORTB Bit 1 // D4 - PORTB Bit 2 // D5 - PORTB Bit 3 // D6 - PORTB Bit 4 // D7 - PORTB Bit 5 // Characters/line: 16 lcd_init(16); lcd_putsf(" WELCOME! "); // Global enable interrupts ACSR |= (1<<ACIE); // включить перывания от компарат ACSR &= ~(1<<ACIE); // выкл прер компар vyh_t0 = 0; // выкл таймер 0 TCCR0A &= ~(1<<CS00); procfreq = 16000000 ; ton1 = fdel(1080); for (n = 0; n < 32; n++) { sost[n] = esost[n]; twi_tx_buffer[n] = sost[n]; } //PORTD.4 = 1; //delay_ms(100); //PORTD.4 = 0; //PORTD.2 = 1; #asm("sei") //vyh_plus = 1; OCR2B=0x00; // выключение преобразователя // time = 0; // while (time < 1000) #asm("wdr"); // задержка 25 мСек // // OCR2B=0x50; // выключение преобразователя // // time = 0; // while (time < 1000) #asm("wdr"); // задержка 25 мСек // //OCR2B=0x50; // выключение преобразователя // // time = 0; // while (time < 1000) #asm("wdr"); // задержка 25 мСек // vyh_plus = 0; // vyh_minus = 1; // //OCR2B=0xB0; // выключение преобразователя // // time = 0; // while (time < 1000) #asm("wdr"); // задержка 25 мСек // // //OCR2B=0xFF; // выключение преобразователя // while (1) { for (i = 0 ; i < 128 ; i++) { if(kn1&kn3) nagh = 0; // сброс флага нажатия при отпущеной кнопке if(!kn1) { if(!nagh) // если кнопка только-что нажата { nagh = 1; lcd_gotoxy(3,0); if (fix) { fix = 0; // если была включена фиксация, - выключить lcd_putchar(' '); } else { fix = 1; // включить фиксацию page = (i / 32); // на какой странице зафиксировано if (page == 0) page = 4; page--; page *= 32; pos = 0; x_dysp = 5; y_dysp = 0; lcd_putchar('F'); } } } if(fix) { if(p10++ == 0) { // отображение подч lcd_gotoxy(x_dysp,y_dysp); lcd_putchar('_'); } if(p10 == 8) { // отображение текущего состояние точки n sig_bayt = (pos+page) / 4; // текущий байт в слове состояния sig_bit = ((pos + page) - (sig_bayt * 4)) * 2; // текущая двухбитовая пара в слове состояния lcd_gotoxy(x_dysp,y_dysp); if((sost[sig_bayt]&(1<<sig_bit))) { if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); else lcd_putchar('.'); } else lcd_putchar(' '); } if(p10 > 16) { p10 = 0; if(!kn2) { if(++pos > 30) { pos = 0; x_dysp = 3; y_dysp = 0; } else if(pos == 15) pos++; x_dysp++; if(++x_dysp > 15) { y_dysp++; x_dysp = 1; } } if(!kn3) { if(!nagh) // если кнопка только-что нажата { nagh = 1; // включение - выключение охраны lcd_gotoxy(x_dysp,y_dysp); sig_bayt = (pos+page) / 4; // текущий байт в слове состояния sig_bit = ((pos + page) - (sig_bayt * 4)) * 2; // текущая двухбитовая пара в слове состояния if((sost[sig_bayt]&(1<<sig_bit))) { sost[sig_bayt] &= ~(1<<sig_bit); // выкл. охрану lcd_putchar(' '); } else { sost[sig_bayt] |= (1<<sig_bit); // включаем охрану lcd_putchar('.'); } } } } } sig_bayt = i / 4; // текущий байт в слове состояния sig_bit = (i - sig_bayt * 4) * 2; // текущая двухбитовая пара в слове состояния OCR0A=0x00; a = 49728; TCCR0A |= (1<<CS00); // включить таймер 0; TIMSK0 |= (1<<TOIE0); // time = 0; while (time < 6) #asm("wdr"); // задержка 25 мСек zvuk = 0; if(i == 0) while (time < 75) #asm("wdr"); // если первый шаг, задержка 300 мСек TIMSK0 &= ~(1<<TOIE0); // OCR0A=0x00; a = 49728; TCCR0A &= ~(1<<CS00); // выкл таймер 0 vyh_t0 = 0; // переключить а вход ACSR |= (1<<ACIE); // включить перывания от компарат time = 0; while (time < 9) #asm("wdr"); // 25мСек + 12 ACSR &= ~(1<<ACIE); // выкл прер компар vyh_t0 = 1; // переключить а вyход if (flag435) // если был отлет 435 Гц { switch (i) { case 31: // вывод первой половины на дисп if (!fix) { clear_lcd(); lcd_gotoxy(0,0); lcd_putsf("1 "); n = 1; for (sig_bayt = 0; sig_bayt < 8 ; sig_bayt++) { for(sig_bit = 0; (sig_bayt == 3 || sig_bayt == 7)? sig_bit < 6: sig_bit < 8; sig_bit += 2) { if(++n>10) n = 1; lcd_putchar(47+n); if((sost[sig_bayt]&(1<<sig_bit))) { if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); else lcd_putchar('.'); } else lcd_putchar(' '); } } } pit_ok = 1; while (time < 125) #asm("wdr"); // задержка до 0.5 сек break; case 15: case 47: case 63: case 79: case 95: case 111: case 127: sinc_err = 1; // ошибка синхронизации zvuk = 1; break; default: if (sost[sig_bayt]&(1<<sig_bit)) // если под охраной { if ((esost[sig_bayt]&(1<<sig_bit) == 0)) { //если не был под охр. поставить под охрану. OCR2B=0x50; // выдача на шим vyh_plus = 1; vyh_t0 = 0; // переключить а вход n = 0; while(flag435) { flag435 = 0; ACSR |= (1<<ACIE); // включить перывания от компарат time = 0; while (time < 9) #asm("wdr"); // 25мСек + 12 ACSR &= ~(1<<ACIE); // выкл прер компар //Ждем прекращения сигнала if (++n > 250) flag435 = 0; } vyh_t0 = 1; // переключить Hа вyход if(n < 251) { esost[sig_bayt] |= (1<<sig_bit); // включаем охрану если сигнал прервался twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния } else sost[sig_bayt] &= ~(3<<sig_bit); // если не взялась, - снять } else { // если объекм был по охраной тревога sost[sig_bayt] |= (1<<(sig_bit+1)); esost[sig_bayt] |= (1<<(sig_bit+1)); twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния trevoga = 1; zvuk = 1; } while(time<375) #asm("wdr"); vyh_plus = 0; OCR2B=0xFF; } else if (esost[sig_bayt]&(1<<sig_bit)) // не под охр, но был { esost[sig_bayt] &= ~(3<<sig_bit); // если был под охр. снять с охр. twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния } } } else // если не было ответа { switch (i) { case 31: // вкл питание if (!fix) { clear_lcd(); lcd_gotoxy(0,1); lcd_putsf("Error Pitanie!!!"); } pit_err = 1; pit_ok = 0; break; case 63: // вывод второй половины на дисп if (!fix) { clear_lcd(); lcd_gotoxy(0,0); lcd_putsf("31 "); n = 1; for (sig_bayt = 8; sig_bayt < 16 ; sig_bayt++) { for(sig_bit = 0; (sig_bayt == 11 || sig_bayt == 15)? sig_bit < 6: sig_bit < 8; sig_bit += 2) { if(++n>10) n = 1; lcd_putchar(47+n); if((sost[sig_bayt]&(1<<sig_bit))) { if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); else lcd_putchar('.'); } else lcd_putchar(' '); } } } break; case 95: // вывод третьей половины на дисп if (!fix) { clear_lcd(); lcd_gotoxy(0,0); lcd_putsf("61 "); n = 1; for (sig_bayt = 16; sig_bayt < 24 ; sig_bayt++) { for(sig_bit = 0; (sig_bayt == 19 || sig_bayt == 23)? sig_bit < 6: sig_bit < 8; sig_bit += 2) { if(++n>10) n = 1; lcd_putchar(47+n); if((sost[sig_bayt]&(1<<sig_bit))) { if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); else lcd_putchar('.'); } else lcd_putchar(' '); } } } break; case 127: // вывод четвертой половины на дисп if (!fix) { clear_lcd(); lcd_gotoxy(0,0); lcd_putsf("91 "); n = 1; for (sig_bayt = 24; sig_bayt < 32; sig_bayt++) { for(sig_bit = 0; (sig_bayt == 27 || sig_bayt == 31)? sig_bit < 6: sig_bit < 8; sig_bit += 2) { if(++n>10) n = 1; lcd_putchar(47+n); if((sost[sig_bayt]&(1<<sig_bit))) { if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); else lcd_putchar('.'); } else lcd_putchar(' '); } } } break; case 15: case 47: case 79: case 111: break; default: if ((sost[sig_bayt]&(1<<sig_bit)) == 0) { if (esost[sig_bayt]&(1<<sig_bit)) // не под охр, но был { //если был под охр. снять с охр. esost[sig_bayt] &= ~(3<<sig_bit); // снять с охр. twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния } } else if ((esost[sig_bayt]&(1<<sig_bit)) == 0) //если под охраной, но не был { esost[sig_bayt] |= (1<<sig_bit); // включаем охрану twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния } } } flag435 = 0; if (pit_ok) { while (time < 125) #asm("wdr"); pit_ok = 0; } // if (trevoga) //while (time < 375); // trevoga = 0; if (sinc_err) { sinc_err = 0; if (!fix) { clear_lcd(); lcd_gotoxy(0,1); lcd_putsf(" Error Sync!!! "); } else { lcd_gotoxy(3,0); lcd_putchar('F'); } break; } } } }