打印
[PIC®/AVR®/dsPIC®产品]

PIC16F1937,电平变化唤醒sleep工作和休眠

[复制链接]
2330|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
y18370990546|  楼主 | 2018-5-5 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
矩阵键盘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--);
}
沙发
feng2260| | 2018-12-30 09:59 | 只看该作者
楼主,请问你这个问题解决了没?

使用特权

评论回复
板凳
淘猫汤姆| | 2018-12-30 16:50 | 只看该作者
好几个月了,解决了他也不上来看了

使用特权

评论回复
地板
钓鱼大师| | 2019-1-5 14:22 | 只看该作者
我也遇到休眠不能唤醒了,求救。

使用特权

评论回复
5
捉虫天师| | 2019-1-7 16:21 | 只看该作者
你的K0呢?s

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

112

帖子

0

粉丝