GPIO控制,程序卡死

2019-07-17 15:30发布


#define key_up                 GpioDataRegs.GPBDAT.bit.GPIO48
#define key_down         GpioDataRegs.GPBDAT.bit.GPIO51
#define key_right        GpioDataRegs.GPBDAT.bit.GPIO49
#define key_left         GpioDataRegs.GPBDAT.bit.GPIO50
#define key_enter        GpioDataRegs.GPBDAT.bit.GPIO52
#define key_exit         GpioDataRegs.GPBDAT.bit.GPIO53
#define relay0                GpioDataRegs.GPBDAT.bit.GPIO55
#define relay1                 GpioDataRegs.GPBDAT.bit.GPIO57


void key_init()
{
                EALLOW;
                // 用户根据需要可以使能内部上拉或禁止.
                GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO51 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO52 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO53 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;   //  LCD_RS使能上拉

                /* 通过I/O功能选择寄存器配置通用I/O功能*/
                GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;   // GPIO模式

                /* 设置I/O口为输入引脚*/
        //    GpioCtrlRegs.GPADIR.all = 0xFFFF0000;
                GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO51 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO52 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO55 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1;   // 输出模式

                //各个IO初值设定
                GpioDataRegs.GPBDAT.bit.GPIO48 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO49 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO50 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO51 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO52 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO53 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO55 = 1;                //继电器上电关断
                GpioDataRegs.GPBDAT.bit.GPIO57 = 1;
}

void key_scan()
{
        if(key_up==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    UP  ");
                show("RELAY0 TEST OPEN");
                relay0 = 0;
                DELAY_US(30);
                while(key_up==0);
        }
        if(key_down==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    DOWN");
                show("RELAY0 TEST CLOS");
                relay0 = 1;DELAY_US(20);
                while(key_down==0);
        }
        if(key_right==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST   RIGHT");
                show("RELAY1 TEST CLOS");
                relay1 = 1;DELAY_US(20);
                while(key_right==0);
        }
        if(key_left==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    LEFT");
                show("RELAY1 TEST OPEN");
                relay1 = 0;DELAY_US(20);
                while(key_left==0);
        }
        if(key_enter==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
                show("KEY TEST   ENTER");
                while(key_enter==0);
        }
        if(key_exit==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
                show("KEY TEST    EXIT");
                while(key_exit==0);
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
清枫城主
2019-07-17 16:38
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里,把relay的控制屏蔽或者删除,各个按键触发灵敏,不会存在卡死问题。在按键处理里面,没有IO控制的情况下,各个按键都可以正常触发控制,但是加入IO控制,就会卡死,个人判断卡死与while(key_xxx==0)这句语句中。不知道是哪里问题,导致IO控制会致使另一个IO如**常检测识别。

一周热门 更多>