这是一个微不足道的问题,但是在过去的几天里,我仍然在服从我。
我试图获取用户输入并等待,直到用户输入值,但是我的程序没有执行该操作。如果有人可以帮助我,我将不胜感激。

这个想法是程序应该打印一条消息,提示用户用户应该使用键盘输入该值,然后等待直到输入了键盘输入。并且根据输入,某些端口引脚数据寄存器应设置为高电平,以便最终调用端口中断处理程序。

/**
* main.c
*/
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "tm4c1294ncpdt.h"
#include "int_handler.h"
#include "inc/hw_memmap.h"

#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom_map.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"

//states[3]=[0,0,0]; //S0,S1,Error
/**
 * main.c
 * 2 out 3,3V
 * 2 in 3,3V
 */
int main(void)
{
    // Port Clock Gating Control Port A
    SYSCTL_RCGCGPIO_R |= 0x00000001;
    while((SYSCTL_PRGPIO_R & 0x00000001) == 0);
    // Set INPUT direction I/O pin PA6
    GPIO_PORTA_AHB_DIR_R &= 0xBF;
    // Digital I/O pins PA6 enable
    GPIO_PORTA_AHB_DEN_R |= 0x40;
    GPIO_PORTA_AHB_DATA_R &= 0x00;
    //GPIO_PORTA_AHB_AFSEL_R &= ~0x40; // disable alt funct on PA6 (default setting)

    //GPIO_PORTA_AHB_PCTL_R &= ~0x0F000000;// configure PA6 as GPIO (default setting)
    //GPIO_PORTA_AHB_AMSEL_R &= ~0x40;// disable analog functionality on PA6 (default setting)
    GPIO_PORTA_AHB_IS_R &= ~0x40;   // PA6 is edge-sensitive (default setting)
    GPIO_PORTA_AHB_IBE_R &= ~0x40;  // PA6 is not both edges (default setting)
    GPIO_PORTA_AHB_IEV_R |= 0x40;   // PA6 rising edge event
    GPIO_PORTA_AHB_ICR_R = 0x40;    // clear flag6
    GPIO_PORTA_AHB_IM_R |= 0x40;    // enable interrupt on PA6
                                // GPIO PortC=priority 2
    NVIC_EN0_R |= (1<<0); // enable PortA interrupt (Int#0/Vec#16) in NVIC


    // Port Clock Gating Control Port B
    SYSCTL_RCGCGPIO_R |= 0x00000002;
    while((SYSCTL_PRGPIO_R & 0x00000002) == 0);
    // Set output direction I/O pins PB0 to PB7
    GPIO_PORTB_AHB_DIR_R |= 0xFF;
    // Digital I/O pins PB2 to PB3 enable
    GPIO_PORTB_AHB_DEN_R |= 0x0C;

    // Port Clock Gating Control Port C
    SYSCTL_RCGCGPIO_R |= 0x00000004;
    while((SYSCTL_PRGPIO_R & 0x00000004) == 0);
    // Set output direction I/O pins PC0 to PC7
    GPIO_PORTC_AHB_DIR_R |= 0xFF;
    // Digital I/O pins PC4 to PC7 enable
    GPIO_PORTC_AHB_DEN_R |= 0xF0;


    // Port Clock Gating Control Port D
    SYSCTL_RCGCGPIO_R |= 0x00000008;
    while((SYSCTL_PRGPIO_R & 0x00000008) == 0);
    // Set output direction I/O pins PD3
    GPIO_PORTD_AHB_DIR_R |= 0x0F;
    GPIO_PORTD_AHB_DIR_R &= 0x0F;     // Set INPUT direction I/O pins PD7
    // Digital I/O pins PD3 AND PD7 enable
    GPIO_PORTD_AHB_DEN_R |= 0x88;

    GPIO_PORTD_AHB_IS_R &= ~0x80;   // PD7 is edge-sensitive (default setting)
    GPIO_PORTD_AHB_IBE_R &= ~0x80;  // PD7 is not both edges (default setting)
    GPIO_PORTD_AHB_IEV_R |= 0x80;   // PD7 rising edge event
    GPIO_PORTD_AHB_ICR_R = 0x80;    // clear flag6
    GPIO_PORTD_AHB_IM_R |= 0x80;    // enable interrupt on PA6

    NVIC_EN0_R |= (1<<3); // enable PortD interrupt (Int#3/Vec#19) in NVIC



    // Port Clock Gating Control Port E
    SYSCTL_RCGCGPIO_R |= (1 << 4);
    while((SYSCTL_PRGPIO_R & (1 << 4)) == 0);
    // Set INPUT direction I/O pins PE0 to PE3
    GPIO_PORTE_AHB_DIR_R &= 0xF0;
    GPIO_PORTE_AHB_DIR_R |= 0xF0;// Set OUTPUT direction I/O pins PE5
    // Digital I/O pins PE0 to PE3 AND PE5 enable
    GPIO_PORTE_AHB_DEN_R |= 0x2F;

    GPIO_PORTE_AHB_IS_R &= ~0x0F;   // PE0 to PE3 is edge-sensitive (default setting)
    GPIO_PORTE_AHB_IBE_R &= ~0x0F;  // PA6 is not both edges (default setting)
    GPIO_PORTE_AHB_IEV_R |= 0x0F;   // PA6 rising edge event
    GPIO_PORTE_AHB_ICR_R = 0x0F;    // clear flag6
    GPIO_PORTE_AHB_IM_R |= 0x0F;    // enable interrupt on PA6
                                // GPIO PortC=priority 2
    NVIC_EN0_R |= (1<<4); // enable PortE interrupt (Int#4/Vec#20) in NVIC


    // Port Clock Gating Control Port M
    SYSCTL_RCGCGPIO_R |= (1 << 11);
    while((SYSCTL_PRGPIO_R & (1 << 11)) == 0);
    // Set input direction I/O pins PM4 and PM5
    GPIO_PORTM_DIR_R &= ~(0x30);
    // Digital I/O pins PM4 and PM5 enable
    GPIO_PORTM_DEN_R |= 0x30;

    GPIO_PORTM_IS_R &= ~0x30;   // PE0 to PE3 is edge-sensitive (default setting)
    GPIO_PORTM_IBE_R &= ~0x30;  // PA6 is not both edges (default setting)
    GPIO_PORTM_IEV_R |= 0x30;   // PA6 rising edge event
    GPIO_PORTM_ICR_R = 0x30;    // clear flag6
    GPIO_PORTM_IM_R |= 0x30;    // enable interrupt on PA6
                                  // GPIO PortC=priority 2
    NVIC_EN2_R |= (1<<8); // enable PortM interrupt (Int#72/Vec#88) in NVIC

    while(1){
        //DEMO
        //Placing instructions with keyboard
        int i;
        char name='m';
        //fflush(stdout);
        printf("Please enter l or r");
        fflush(stdout);


        //gets(name);
        //scanf(" %c", &name);
        //fgets(name,5,stdin);
        //getchar();

        while(name != 'l' && name != 'r'){
            scanf("%c", &name);
        }

        printf("U entered %c", name);
        fflush(stdout);
        if(name=='l')//PE0 is high
        {
            GPIO_PORTE_AHB_DATA_R |= 0x01; // PE0 high
            for(i=0;i<500000;i++);
            GPIO_PORTE_AHB_DATA_R &= 0x00; // PE0 LOW
        }
        else if(name=='r'){
            GPIO_PORTE_AHB_DATA_R |= 0x02; // PE1 high
            for(i=0;i<500000;i++);
            GPIO_PORTE_AHB_DATA_R &= 0x00; // PE1 LOW
        }
        else{
            printf("Pls enter l or r");
            fflush (stdout);

        }

    }
}

最佳答案

由于namechar,因此您不应与strcmp进行比较。

采用

while(name != 'l' && name != 'r'){
    scanf("%c", &name);
}
//name cannot have values other than 'l' and 'r' here

//...

if(name == 'l'){
//...
}else{
//...
}

关于c - 等到用户输入值并将其分配给var,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59444697/

10-11 22:05
查看更多