508不是从SLEEP();后面运行,是从头开始运行,我做了测试,确实数据丢失了。但不知道各位是通过什么方法使数据保存下来的?
/***************************************************************************************
目的:由按键产生长亮,长按三秒为暴闪。。
。 3脚输出********************************
飞凌单片机该型号与PIC12C508相同,但是pic为8脚,8pb513B为6脚,其中,PIC2\7脚不用,
其他管脚通用。
日期:2015.4.28
修改:增加了100MS,50MS,10MS,5MS,1MS,200US,10US,6US,等几种延时的实测值,以备以后产生脉冲时
可以使用。该实测值为4M晶振4个指令周期,即一条指令1US的情况。使用定时器
日期:2016.3.17
****************************************************************************************/
//#include<pic12f508.h>
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define M1 GP1
//#define M2 GP2
//#define M3 GP3
//#define TTLIN GP4
#define TTLOUT GP4
char mos=0;
uint i,time;
char flag;
__CONFIG(0x0a);
void initio()
{
//OSCCAL=0x00;
TRISGPIO=0b00000010;//
//OPTION=0xf0;//64分频
//TMR0=0x00;//使用分频器时初值计算:
//初值=256-定时时间\(指令周期*分频比))+14/分频比;当分频比大于16时可以不必修正
//指令周期为4
//如 1S定时:256-1000000/(4*64)+14/2=256-6.25+7
//不分频初值=256-定时时间*指令周期
TTLOUT=0;
OPTION=OPTION&0X7F;//使能电平变化唤醒功能TRISGPIO清0后OPTION也会清0;
}
/***************************************************************************
***************************************************************************
****************************延时程序***************************************/
Delay100ms()//实测99.992MS
{ int x=3702;
while(x--)
asm("nop");
}
Delay50ms()//实测49.98MS
{ int x=1851;
while(x--)
asm("nop");
}
Delay10ms()//实测10.001MS
{ int x=369;
while(x--)
asm("nop");
}
Delay5ms()//实测5.006MS
{ int x=184;
while(x--)
asm("nop");
}
Delay1ms()//实测1.01MS
{ int x=36;
while(x--)
asm("nop");
}
Delay200us()//实测200us
{ int x=6;
while(x--)
asm("nop");
}
Delay100us()//实测100us
{ int x=2;
while(x--)
asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
}
Delay10us()//10US,用于循环结束延时8M4.5US//实测10us
{
asm("nop");asm("nop");asm("nop");asm("nop");
}
Delay6us()//6US,用于循环结束延时8M4.5US//实测6uS
{
}
/***************************************************************************
******************************************************************************
****************************延时程序结束***************************************/
void main()
{
initio();
//if((GPWUF==0))
//flag=0;
//mos=0;
//flag=0;
//if(GPWUF==1)flag=1;//如果为1,说明是休眠唤醒引起的复位
// else flag=0;
while(1)
{
if(M1==0)
{ //Delay1ms();
if(M1==0)
{
time=0;
while(M1==0)
{
Delay10ms();
time++;
if((mos==2)&(time%5==0))
{
TTLOUT=~TTLOUT;
}
//if (time==310)break;
}
if(time<300)
{
if(mos==0)
{
if(flag==0)mos=1;
else if(flag==1)mos=2;
}
else mos=0;
// if((mos==0)&(flag==0)) mos=1;
// else if((mos==0)&(flag==1)) {mos=3;}
// else if((mos==1)|(mos==3)) {mos=0; }
}
else
{
if(mos==1 ) {mos=2;flag=1;}
else if((mos==2) ){ mos=1; flag=0; }
}
}
}
switch(mos)
{
case 0: {//关闭
TTLOUT=0;
M1=M1;
SLEEP();
} break;
case 1: {//长亮
TTLOUT=1;
} break;
case 2: {//10HZ爆闪
TTLOUT=1;
Delay50ms();
TTLOUT=0;
Delay50ms();
} break;
default:break;
}
}
}
|