/*暂时使用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(); //睡眠指令
}
} |