矩阵键盘KEY0键休眠及唤醒单片机,数码管循环显示按键值,发现不加按键扫描函数KEY_Scan(),可以唤醒单片机,加了之后无法唤醒,求教各位?
void main()
{
Init();
while(1)
{
TRISA=0X00;
LATA=0X00; //数码管位选
LATC=0X01;
SLEEP();
NOP();
LATC=0X80;
while(flag==1)
{
KEY_Scan();
LATD=SEG_CODE[key];
}
}
}
void Init()
{
TRISC=0X00;
LATC=0X00;
TRISB=0x0F; //RB4输出,
PORTB=0XEF; //RB4为低电平
// OPTION_REGbits.nWPUEN=0;
// WPUB=0XFF; //B口弱上拉
ANSELB=0X00; //I/O口
IOCBN=0X1F; //电平变化下降沿使能
TRISD=0X00; //D口输出
ANSELD=0X00;
LATD=0X00;
INTCONbits.IOCIF=0;
INTCONbits.IOCIE=1;
//OPTION_REGbits.INTEDG=0;
INTCONbits.INTE=0;
INTCONbits.INTF=0;
IOCBF=0;
INTCONbits.GIE=1;
}
void KEY_Scan()
{
TRISB=0X0F;
PORTB = 0X7f; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0x70; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0x7e:key=12;break;
case 0x7d:key=13;break;
case 0x7b:key=14;break;
case 0x77:key=15;break;
}
}
PORTB = 0Xbf; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0xb0; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0xbe:key=8;break;
case 0xbd:key=9;break;
case 0xbb:key=10;break;
case 0xb7:key=11;break;
}
}
PORTB = 0Xdf; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0xd0; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0xde:key=4;break;
case 0xdd:key=5;break;
case 0xdb:key=6;break;
case 0xd7:key=7;break;
}
}
PORTB = 0Xef; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0xe0; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0xee:break;
case 0xed:key=1;break;
case 0xeb:key=2;break;
case 0xe7:key=3;break;
}
}
}
void interrupt ISR(void)
{
if(INTCONbits.IOCIE&&INTCONbits.IOCIF&&IOCBFbits.IOCBF0)
{
INTCONbits.IOCIF=0;
IOCBFbits.IOCBF0=0;
flag++;
flag=(flag==1)?1:0;
}
}
void delayms(INT16U x)
{
INT16U j,k;
for(j=x;j>0;j--)
for(k=110;k>0;k--);
} |