直接上代碼
主要兩個問題咨詢一下網友:1、定時器延時函數能不能正常工作;2、開關(此開關不是按鍵開關,是普通的接通和斷開開關)接通執行一套代碼;否則斷開,執行另一套代碼。
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x) __asm__("MOVR _" #x ",F")
#define uchar unsigned char
#define uint unsigned int
#define JRJDQ PORTBbits.PB0 //7腳繼電器1, 高有效
#define JSJDQ PORTBbits.PB1 //6腳繼電器2, 高有效
#define FMQ PORTBbits.PB2 //5腳繼電器3, 高有效
#define JRJDQ2 PORTBbits.PB3 //4腳繼電器4, 高有效
#define KEY1 PORTBbits.PB4 //3腳電源開關,高電平表示接通,低電平表示斷開
#define DCF PORTBbits.PB5 //2腳繼電器5, 高有效
uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;
//==T0時間計算================================================
void time0_init(void)
{
PCON1 &= 0xfe;
T0MD = C_PS0_TMR0 | C_PS0_Div256; //FINST預分頻給T0且為256分頻
TMR0 = 0x00;
INTE = C_INT_TMR0; //開啟T0中斷
PCON1 = C_TMR0_En; //開啟T0
}
void io_init(void)
{
IOSTB = C_PB4_Input; //PB4輸入
IOSTB = C_PB0_Output; //PB0輸出
IOSTB = C_PB1_Output; //PB1輸出
IOSTB = C_PB2_Output; //PB2輸出
IOSTB = C_PB3_Output; //PB3輸出
IOSTB = C_PB5_Output; //PB5輸出
BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB ); //上拉
PORTB = 0x00;
INTE|=(1<<1); //開啟B口電平中斷
}
void delay_us(int count) //@16M 2T 2.5us
{
for(;count>0;count--);
}
void delay_ms(int count) //@8m 4T 1ms
{
int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}
void Delay(unsigned long var)
{
unsigned long i;
i = t0zd1b;
while(t0zd1b-i < var)
{
;
}
}
void main()
{
io_init();
time0_init();
delay_ms(80);
while(1)
{
CLRWDT();
if(INTFbits.WDTIF) //睡眠后60秒左右會進來一次
{
CLRWDT(); //喂狗
INTF= (unsigned char)~(C_INT_WDT); // Clear WDTIF flag bit //清除WDTIF標志位
}
if(KEY1==1) //K1開關接通后,只要K1接通時,延時后DCF繼電器低電平,然后又延時FMQ繼電器低電平,然后延時JRJDQ繼電器高電平,然后延時JRJDQ2繼電器高電平。
{
Delay(10);
{ DCF=0;} Delay(200);
{ FMQ=0;} Delay(2000);
{ JRJDQ=1;} Delay(10);
{ JRJDQ2=1;}
}
else //K1開關斷開后,只要K1斷開后時,延時后DCF繼電器高電平,延時后FMQ繼電器高電平,在延時后FMQ繼電器高電平。
{ //接著延時后JRJDQ低電平,延時后JRJDQ2低電平。
Delay(10);
{ DCF=1;} Delay(200);
{ FMQ=1;} Delay(2000);
{ JRJDQ=0;} Delay(200);
{ JRJDQ2=0;}
}
}
}
void isr(void) __interrupt(0)
{
if(INTFbits.T0IF)
{
INTF= (unsigned char)~(C_INT_TMR0);
t0zd1b=1;
CLRWDT(); //喂狗
if(INTFbits.WDTIF) //睡眠后60秒左右會進來一次
{
CLRWDT(); //喂狗
INTF= (unsigned char)~(C_INT_WDT); // Clear WDTIF flag bit //清除WDTIF標志位
}
}
}
|