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 18:12

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);
        }
}
如果把while();屏蔽掉,那么按键处理程序里面的IO操作,可以正常处理,处理完后各个按键也可以正常触发,不会卡死。

一周热门 更多>