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

【4月晒板卡】+PIC16F18446开发板按键问题

[复制链接]
1248|11
手机看帖
扫描二维码
随时随地手机跟帖
hu9jj|  楼主 | 2019-5-31 14:30 | 显示全部楼层 |阅读模式
本帖最后由 hu9jj 于 2019-5-31 14:31 编辑

    点亮LED灯之后就着手测试开发板上的用户按键,此按键被连接在RC2引脚上,按照用户手册的说明,先将RC2设置为输入,同时设置为弱上拉,然后在主循环中轮询按键状态。在我的测试中,设置了一个变量i,计划每按一次按键,i值加1,超过4则恢复为0,然后根据 i 不同的值对应不同的延时,达到改变LED灯闪烁频率的效果。程序代码如下:
void main(void)
{
    uint8_t i, j;
    /* initialize the device */
    SYSTEM_Initialize();

    /* Enable the Global Interrupts */
//    INTERRUPT_GlobalInterruptEnable();

    /* Enable the Peripheral Interrupts */
//    INTERRUPT_PeripheralInterruptEnable();

//    APP_init();
    TRISA = 0xFB;    //设置RA2为输出
    PORTA = 0xFF;    //端口置‘1’
    TRISC = 0x04;    //设置RC2为输入
    PORTC = 0xFF;    //端口置‘1’
    WPUC  = 0xFF;
//    WPUC2 = 1;     //设置RC2为弱上拉
   
    while (1)
    {
        if(RC2==0)
        {
            i++;
            if(i>4)
                i = 0;
        }
        RA2 = 0;
        switch (i){
            case 1:__delay_ms(100);break;
            case 2:__delay_ms(200);break;
            case 3:__delay_ms(500);break;
            case 4:__delay_ms(1000);break;
            case 5:__delay_ms(2000);
        }
        
        RA2 = 1;
        switch (i){
            case 1:__delay_ms(100);break;
            case 2:__delay_ms(200);break;
            case 3:__delay_ms(500);break;
            case 4:__delay_ms(1000);break;
            case 5:__delay_ms(2000);
        }
        
    }
}
   以下是用户手册上的截图:
硬件手册0.jpg



    但在测试时却不顺利,RC2的值一直为低电平,貌似弱上拉没有被设置好,但我反复查看用户手册和数据手册却找不到问题所在,又找不到示例代码作参考,只好在此求助各位,请帮忙看看是什么原因,谢谢!
    下面是数据手册中相关的说明:


数据手册01.jpg




硬件手册1.jpg

使用特权

评论回复
CoolSilicon| | 2019-5-31 15:23 | 显示全部楼层
RC2默认是复用位模拟口的, 你作为按键数字口用, 需要初始化它位数字口才行..ANSELC寄存器.

说实话, 你用MCC生成代码, IO口也可以自己初始化的, 你检查一下MCC配置, pin 那啥那一项里面, 应该是你没注意到的.
52775cf0d6004dee1.png

使用特权

评论回复
评论
hu9jj 2019-5-31 16:38 回复TA
感谢指教,设置了ANSEL之后就能检测到按键了。 
phosphate| | 2019-5-31 15:43 | 显示全部楼层
需要初始化相关寄存器

使用特权

评论回复
hu9jj|  楼主 | 2019-5-31 15:59 | 显示全部楼层
CoolSilicon 发表于 2019-5-31 15:23
RC2默认是复用位模拟口的, 你作为按键数字口用, 需要初始化它位数字口才行..ANSELC寄存器.

说实话, 你用MC ...

谢谢指教!我用的是官网下载的一个例子,还不会用MCC配置代码。
我再设置一下看看。

使用特权

评论回复
hu9jj|  楼主 | 2019-5-31 16:29 | 显示全部楼层
加了一句
    ANSELC = 0;
就可以了,测试通过后的代码如下:

void main(void)
{
    uint8_t i, j;
    /* initialize the device */
    SYSTEM_Initialize();

    /* Enable the Global Interrupts */
//    INTERRUPT_GlobalInterruptEnable();

    /* Enable the Peripheral Interrupts */
//    INTERRUPT_PeripheralInterruptEnable();

//    APP_init();
    TRISA = 0xFB;    //??RA2???
    PORTA = 0xFF;    //????1?
    ANSELC = 0;
    TRISC = 0x04;    //??RC2???
//    PORTC = 0xFF;    //????1?
    WPUC  = 0xFF;
//    WPUC2 = 1;     //??RC2????
   
    while (1)
    {
        if(RC2==0)
        {
            i++;
            if(i>4)
                i = 0;
        }
        RA2 = 0;
        switch (i){
            case 1:__delay_ms(100);break;
            case 2:__delay_ms(200);break;
            case 3:__delay_ms(500);break;
            case 4:__delay_ms(1000);break;
            case 5:__delay_ms(2000);
        }
        
        RA2 = 1;
        switch (i){
            case 1:__delay_ms(100);break;
            case 2:__delay_ms(200);break;
            case 3:__delay_ms(500);break;
            case 4:__delay_ms(1000);break;
            case 5:__delay_ms(2000);
        }
        
    }
}

使用特权

评论回复
奔波儿熊| | 2019-5-31 16:59 | 显示全部楼层
恭喜楼主解决问题,顺带说一句万恶的欧洲人.

使用特权

评论回复
hu9jj|  楼主 | 2019-5-31 17:50 | 显示全部楼层
难者不会,会者不难。刚开始学PIC单片机,英文又不行,困难总是有的。不急,慢慢啃,啃不下来就发帖请教。

使用特权

评论回复
yiy| | 2019-5-31 19:33 | 显示全部楼层
按下是低电平。

使用特权

评论回复
yiy| | 2019-5-31 19:34 | 显示全部楼层
那默认是拉高了?有上拉电阻?

使用特权

评论回复
hu9jj|  楼主 | 2019-5-31 19:37 | 显示全部楼层
yiy 发表于 2019-5-31 19:34
那默认是拉高了?有上拉电阻?

是设置引脚弱上拉,开发板上没有外接上拉电阻。

使用特权

评论回复
yiy| | 2019-5-31 19:49 | 显示全部楼层
hu9jj 发表于 2019-5-31 19:37
是设置引脚弱上拉,开发板上没有外接上拉电阻。

嗯,说明这个芯片还带内部上拉电阻啊,挺好的。

使用特权

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

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

144

主题

1031

帖子

11

粉丝