| 
 
| /*暂时使用1位数码管程序顺利后使用4位的数码管,程序目的INT(RB0口)中断作为计数器使用,每中断一次数码管计数加一,当没有中断后开始延时或启动定时器10S自动睡眠,只要有中断产生立刻唤醒,数码管加一,无中断10S后睡眠如此循环工作。因为需要低功耗所以使用32.768K的晶体*/ #include<16F877A.h>           //使用877A的芯片
 #include <pic.h>                    // 包含系统寄存器定义
 __CONFIG (WDTDIS);            // 开启看门狗
 unsigned char g_Counter=0;
 void interrupt ISR(void)      //中断服务函数,
 {
 if(INTE&INTF)               // 判断INT中断标志是否置位(为一)
 {
 INTF=0;                   // INTF置位,说明有中断产生,需要清除中断标志
 g_Counter++;              //中断次数计数器加一
 if(g_Counter==10)         //若等于10说明超过9了
 {
 g_Counter=0;            // 计数器清零,因为一位数码管只能记录0到9
 }
 }
 }
 main()                       // 主函数入口
 {
 int p=0;                   //暂时不会使用定时器,定义用延时变量
 const char SMG_Font[]={0b00111111,0b00000110,0b01011011,
 0b01001111,0b01100110,0b01101101,0b01111101,
 0b00000111,0b01111111,0b01101111};
 TRISB=0X01;                //RB0口做输入口
 INTE=1;                    // 打开INT中断
 INTEDG=1;                  // 设置触发中断的条件为电平从高到低触发
 TRISC=0;                   // C口方向设置为输出
 GIE=1;                     // 打开总中断
 while(1)                    // 主循环必须是死循环
 {
 CLRWDT();                //喂狗指令,
 PORTC=SMG_Font[g_Counter];    //数码管显示内容
 /* ?此处是本人有疑问的地方,现在可以睡眠了,也可以唤醒 ,但是当RB0没有按下的时候CPU在执行下面的延时,有中断时不能立刻响应数码管不能加1,要等延时走完了才能响应到中断。但是我的目的是只要RB0 没有按下就开始延时4S或者10S后就睡眠,在延时期间只要有中断产生立刻响应中断程序,在从新去开始延时后在睡眠,请问有什么办法解决,程序应该要怎样写是不是可以用定时器的方法,但我不回写,恳请高人指点,能写出此程序已经花了我一个多月的时间了费尽脑汁了,就差一步就完美了。*/
 if(RB0==1)            //延时的目的是能看到数码管的内容,
 {
 for(p=0;p<300;p++)     //大约3-4S的时间
 {;}
 }
 PORTC=0X0;             //睡眠前的状态C口为0,关闭输出
 SLEEP();               //睡眠指令
 }
 
 }
 | 
 |