[PIC®/AVR® MCU] 加了之后无法唤醒

[复制链接]
1852|9
手机看帖
扫描二维码
随时随地手机跟帖
yinxiangh|  楼主 | 2021-10-19 23:13 | 显示全部楼层 |阅读模式
本帖最后由 pzsh 于 2021-11-1 11:29 编辑

PIC16F1937,
矩阵键盘KEY0键休眠及唤醒单片机,数码管循环显示按键值,发现不加按键扫描函数KEY_Scan(),可以唤醒单片机,加了之后无法唤醒

使用特权

评论回复
stly| | 2021-10-19 23:15 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
yinxiangh|  楼主 | 2021-10-19 23:17 | 显示全部楼层

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--);
}

使用特权

评论回复
renyaq| | 2021-10-19 23:19 | 显示全部楼层
我也遇到休眠不能唤醒了,求救。

使用特权

评论回复
xxrs| | 2021-10-19 23:21 | 显示全部楼层
你的K0呢?s

使用特权

评论回复
juventus9554| | 2021-10-19 23:35 | 显示全部楼层
你是用什么方法唤醒MCU?

使用特权

评论回复
pengf| | 2021-10-19 23:37 | 显示全部楼层
按键的电路接法是什么样子的?

使用特权

评论回复
dingy| | 2021-10-19 23:39 | 显示全部楼层
即使贴了代码,也很少有人能真正有耐心帮你把代码看完。。

使用特权

评论回复
yinxiangh|  楼主 | 2021-10-19 23:42 | 显示全部楼层
唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
pzsh| | 2021-11-1 11:29 | 显示全部楼层
外部I/O中断, 上升或下降沿唤醒吗?

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则