?? relay.c
字號:
#include <pic.h>/* * Interrupt demo for PIC; wait for button press on RB0/INT, * turn on a relay on another port bit for a period of time. * * Copyright (C)1997 HI-TECH Software. * Freely distributable. *//* Defines; change as appropriate */#define XTAL 4MHz // crystal frequency#define CLKINTR 250 // microseconds per clock interruptstatic bit RELAY @ (unsigned)&PORTB*8+7; // use this bit to drive // the relay - active low.#define OFF 1 // bit is 1 to turn off#define ON 0 // and 0 to turn on#define RELAY_TIME 1000ms // how long to turn the relay on for/* this stuff is not likely to change */#define MHz *1000000 // this many cycles to megahertz#define CLKDIV 4l // xtal is divided by this many#define ms *1000l // this many microseconds in a millisecondstatic unsigned int relay_timer; // timer value for relay driver#define TIMER_RELOAD ((((XTAL)/CLKDIV)*CLKINTR)/1000000)#define RELAY_VALUE ((RELAY_TIME)/(CLKINTR))voidmain(void){ /* setup stuff */ RELAY = OFF; // ensure relay is off before enabling output TRISB = 0x3F; // Port B bits 7 and 6 are output T0CS = 0; // Timer increments on instruction clock T0IE = 1; // Enable interrupt on TMR0 overflow INTEDG = 0; // falling edge trigger the interrupt INTE = 1; // enable the external interrupt GIE = 1; // Global interrupt enable for(;;) CLRWDT(); // Idly kick the dog}static void interruptisr(void) // Here be interrupt function - the name is // unimportant.{ if(T0IF) { // timer interrupt TMR0 -= TIMER_RELOAD; // reload the timer T0IF = 0; // clear the interrupt flag if(relay_timer != 0) // is the relay timer running? relay_timer--; // decrement it if(relay_timer == 0) // if it has time out RELAY = OFF; // turn the relay off PORTB ^= 0x40; // toggle a bit to say we're alive } if(INTF) { // did we see a button press? RELAY = ON; // turn the relay on relay_timer = RELAY_VALUE; // start the timer INTF = 0; // clear the interrupt }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -