以下是程序内容:
#include <pic.h>
#define RLY_UP GPIO4
#define RLY_DOWN GPIO2
#define UP_IN GPIO5
#define DOWN_IN GPIO3
#define AUTO GPIO1
__CONFIG(0x3FC4);
unsigned char ADC ()
{
unsigned char ADH,ADL,AD_value;
char i = 0;
ADCON0 = 0x1; //结果左对齐,VDD参考电压,ANS0模拟输入,并开启AD转换器
for (i=0;i<25;i++) //采样延时
{}
GO = 1; //开始AD转换
while(GO); //等待转换结束
ADCON0 = 0; //关闭AD转换器并停止转换
ADH=ADRESH; //取得高8位
ADL=ADRESL; //取得低8位
AD_value=(ADH<<2)+(ADL>>6); //计算结果并存入 AD_value
return AD_value; //返回AD_value的值
}
void main (void)
{
unsigned char va;
CMCON = 0x07; //关闭比较器
ANSEL = 0x31; //内部RC,AN3设置为模拟量输入,其它为数字IO
TRISIO = 0x2B; //0/2入其它输出
RLY_UP = 0;
RLY_DOWN = 0; //初始化端口
T0CS = 0;//时钟选择(内部指令周期时钟CLKOUT)
PSA = 0; //将预分频器分配给TMR0
PS2 = 1;
PS1 = 1;
PS0 = 1; //分频比设置为1:256
T0IE = 1;//开TMR0中断
while (1)
{
va = ADC (); //调用ADC函数
if (va>16)
{
RLY_UP = 0;
RLY_DOWN = 0;
}
if (UP == 0)
{
RLY_UP = 1;
while (UP == 0);
}
}
}
UP按键按下RLY_UP=1,一直按着一直输出1,若va>16则RLY_UP=0.请教各位前辈该如何实现,小弟是初学。
如何在不使用AD中断的情况下实时查询AD值,上面的程序如果UP按键一直按着,就会一直输出RLY_UP=1,出不来了。 |