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条回答
shenmu2012
1楼-- · 2019-07-18 20:53
楼主那是判断key的状态的,,没有及时得到状态的
清枫城主
2楼-- · 2019-07-18 22:18
shenmu2012 发表于 2017-5-12 21:50
楼主那是判断key的状态的,,没有及时得到状态的

嗯 因为IO刚开始设置错误 设置成输出模式 到时得到错误结果 后面改为输入模式搞定了
hudi008
3楼-- · 2019-07-18 23:18
清枫城主 发表于 2017-5-6 15:41
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里 ...

这个死机了吗
selongli
4楼-- · 2019-07-18 23:38
 精彩回答 2  元偷偷看……
febgxu
5楼-- · 2019-07-19 05:22
你这不是用while了吗
sanfuzi
6楼-- · 2019-07-19 11:07
清枫城主 发表于 2017-5-6 15:42
原以为是IO操作频繁导致问题,特意在relay与while之间加延时,从延时3us到30us还是卡死。 ...

延时卡死,就是没有退出程序。

一周热门 更多>