使用按钮暂停或获取字符
Pause or Getchar with push button
我是编程新手,我想在 main() 中的 while(1) 循环之前暂停我的代码。按钮的状态改变后暂停将被打破。我不确定这是如何使用 pause 或 getchar 实现的,我已经看到它是通过按键完成的,但不确定如何通过按钮的状态更改来实现它。
#define _XTAL_FREQ 16000000
#pragma config WDT = OFF
#include <xc.h>
#include <stdio.h>
#include <math.h>
#include "lcd.h"
#define UI_Go PORTCbits.RC5 //Go button
void main(void) {
lcd_init();
lcd_cmd(L_L4);
sprintf(Start, "'Go' to Start"); //Start while loop
lcd_str(Start);
__delay_ms(10);
while(1){
Refill();
}
}
好的-
看起来您正在使用 MPLab,因此您可能正在连接到某些嵌入式设备。
听起来您还希望您的 C 代码响应该设备上的物理按钮按下。
这是特定设备的示例:
https://electrosome.com/switch-pic-microcontroller-mplab-xc8/
#define _XTAL_FREQ 8000000
#include <xc.h>
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
int main()
{
TRISB0 = 0; //RB0 as Output PIN
TRISD0 = 1; //RD0 as Input PIN
RB0 = 0; //LED Off
while(1)
{
if(RD0 == 0) //If Switch Pressed
{
RB0 = 1; //LED ON
__delay_ms(3000); //3 Second Delay
RB0 = 0; //LED OFF
}
}
return 0;
}
您会注意到它 polls 设备 (RD0) 改变状态。
您还会注意到,您需要读取的特定端口因设备而异。
你需要在你的代码中做一些类似的事情,通过调整你的“while (1){...}”轮询循环来读取你的“按钮”的当前状态,暂停几毫秒左右在读取之间,如果其值发生变化,则相应地“响应”。
没有我无法测试的硬件,但将您的评论视为黄金
你需要
while(UI_Set==1);
这将循环等待按下按钮
或者也许
while(UI_Set==0);
不确定逻辑是哪种方式
我是编程新手,我想在 main() 中的 while(1) 循环之前暂停我的代码。按钮的状态改变后暂停将被打破。我不确定这是如何使用 pause 或 getchar 实现的,我已经看到它是通过按键完成的,但不确定如何通过按钮的状态更改来实现它。
#define _XTAL_FREQ 16000000
#pragma config WDT = OFF
#include <xc.h>
#include <stdio.h>
#include <math.h>
#include "lcd.h"
#define UI_Go PORTCbits.RC5 //Go button
void main(void) {
lcd_init();
lcd_cmd(L_L4);
sprintf(Start, "'Go' to Start"); //Start while loop
lcd_str(Start);
__delay_ms(10);
while(1){
Refill();
}
}
好的-
看起来您正在使用 MPLab,因此您可能正在连接到某些嵌入式设备。
听起来您还希望您的 C 代码响应该设备上的物理按钮按下。
这是特定设备的示例:
https://electrosome.com/switch-pic-microcontroller-mplab-xc8/
#define _XTAL_FREQ 8000000
#include <xc.h>
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
int main()
{
TRISB0 = 0; //RB0 as Output PIN
TRISD0 = 1; //RD0 as Input PIN
RB0 = 0; //LED Off
while(1)
{
if(RD0 == 0) //If Switch Pressed
{
RB0 = 1; //LED ON
__delay_ms(3000); //3 Second Delay
RB0 = 0; //LED OFF
}
}
return 0;
}
您会注意到它 polls 设备 (RD0) 改变状态。
您还会注意到,您需要读取的特定端口因设备而异。
你需要在你的代码中做一些类似的事情,通过调整你的“while (1){...}”轮询循环来读取你的“按钮”的当前状态,暂停几毫秒左右在读取之间,如果其值发生变化,则相应地“响应”。
没有我无法测试的硬件,但将您的评论视为黄金
你需要
while(UI_Set==1);
这将循环等待按下按钮
或者也许
while(UI_Set==0);
不确定逻辑是哪种方式