Led on/off 使用 PIC 16f777a
Led on/off using PIC 16f777a
我正在使用按钮进行练习。当按下按钮时,LED 开始闪烁,再次按下时停止。当我尝试时,LED 在第一次按下时闪烁,但在第二次按下时没有停止。我正在使用带有 HiTech C 编译器的 PIC16F877A MCU。我的代码是:
#include<pic.h>
#define _XTAL_FREQ 20000000
void main()
{
TRISB = 0x01;
PORTB = 0x00;
while(1){
if(RB0 == 1){
while(1){
PORTB = 0xff;
__delay_ms(250);
PORTB = 0x00;
__delay_ms(250);
if(RB0 == 1){
break;
}
}
}
}
}
我认为是一个 "too short" 循环。
使用 double while 捕捉输入会导致两个 IF 都有效一千次,直到您释放按钮。
建议您在按钮释放时进行管理,即您触发按钮的按下并在按钮释放时有效。
一个简单的解决方案可以是:
#include <pic.h>
#include <stdint.h>
#define _XTAL_FREQ 20000000
void main()
{
unit8_t pressed = 0;
bool blink = 0;
TRISB = 0x01;
PORTB = 0x00;
while(1)
{
// Button pressed for the first time
if ((RB0 == 1) && (pressed == 0))
{
pressed = 1;
}
// Button released = valid
else if ((RB0 == 0) && (pressed == 1))
{
pressed = 2;
}
if (pressed == 2)
{
blink ^= 1;
pressed = 0;
}
if (blink == 1)
{
PORTB ^= 0xFE;
__delay_ms(250);
}
}
}
使用这个非常简单的解决方案,根据您的详细说明,您总是有一个 "strange feeling" 按钮,因为 每个循环有 250 毫秒的延迟(在您的情况下为 500 毫秒)意味着您可以松开单个按钮压力。
另请注意,通过简单的输入,您还必须管理去抖动。
当任何机械开关的触点撞击在一起时,它们会在稳定之前稍微回弹,从而导致弹跳。当然,去抖动是消除反弹的过程,将模拟世界的残酷现实转化为原始的 1 和 0。
无论如何,最好的解决方案是添加一个计时器来管理 LED 的闪烁,并使用主循环来评估按钮压力。这避免了输入检查之间的延迟。
我认为您 运行 完成代码的速度太快(与之前的回答相同)。
如果你按下,你就会进入。按下第二个 if() 上的按钮是困难的。
你应该去抖动你的按钮。要触发您的按钮,您可以使用 Interrupt on Change(下降上升沿)或计算定时器中断中 "pushes" 的数量(如果端口为低或高,则每 x 毫秒查看一次,如果端口已更改,则递增一个变量)
希望对您有所帮助
当你触摸开关时,led 应该亮起,第二次触摸开关时,led 应该熄灭。pic16f1527 微控制器....这段代码不起作用,所以任何人都有解决方案。
include <xc.h>
int switchpressed(void){ // CREATE A FUNCTION FOR SWITCH PRESSED 1ST TIME
if(TRISFbits.TRISF3==1){
}
return switchpressed;
}
int switchpressed2(void){ // CREATE A FUNCTION FOR SWITCH PRESSED 2ND TIME
if(TRISFbits.TRISF3==1){
}
return switchpressed2;
}
void main(void) {
ANSELFbits.ANSF3 = 0; // RF3 AS DIGITAL PIN
TRISFbits.TRISF3 = 1; // PORT RF3 AS INPUT PIN
TRISBbits.TRISB5 = 0; // RB5 OUTPUT PIN
do{
if(RF3== switchpressed()){
PORTBbits.RB5= 1;
}
if(RF3==switchpressed2()){
PORTBbits.RB5= 0;
}
}while(1);
return ;
}
我正在使用按钮进行练习。当按下按钮时,LED 开始闪烁,再次按下时停止。当我尝试时,LED 在第一次按下时闪烁,但在第二次按下时没有停止。我正在使用带有 HiTech C 编译器的 PIC16F877A MCU。我的代码是:
#include<pic.h>
#define _XTAL_FREQ 20000000
void main()
{
TRISB = 0x01;
PORTB = 0x00;
while(1){
if(RB0 == 1){
while(1){
PORTB = 0xff;
__delay_ms(250);
PORTB = 0x00;
__delay_ms(250);
if(RB0 == 1){
break;
}
}
}
}
}
我认为是一个 "too short" 循环。
使用 double while 捕捉输入会导致两个 IF 都有效一千次,直到您释放按钮。
建议您在按钮释放时进行管理,即您触发按钮的按下并在按钮释放时有效。
一个简单的解决方案可以是:
#include <pic.h>
#include <stdint.h>
#define _XTAL_FREQ 20000000
void main()
{
unit8_t pressed = 0;
bool blink = 0;
TRISB = 0x01;
PORTB = 0x00;
while(1)
{
// Button pressed for the first time
if ((RB0 == 1) && (pressed == 0))
{
pressed = 1;
}
// Button released = valid
else if ((RB0 == 0) && (pressed == 1))
{
pressed = 2;
}
if (pressed == 2)
{
blink ^= 1;
pressed = 0;
}
if (blink == 1)
{
PORTB ^= 0xFE;
__delay_ms(250);
}
}
}
使用这个非常简单的解决方案,根据您的详细说明,您总是有一个 "strange feeling" 按钮,因为 每个循环有 250 毫秒的延迟(在您的情况下为 500 毫秒)意味着您可以松开单个按钮压力。
另请注意,通过简单的输入,您还必须管理去抖动。 当任何机械开关的触点撞击在一起时,它们会在稳定之前稍微回弹,从而导致弹跳。当然,去抖动是消除反弹的过程,将模拟世界的残酷现实转化为原始的 1 和 0。
无论如何,最好的解决方案是添加一个计时器来管理 LED 的闪烁,并使用主循环来评估按钮压力。这避免了输入检查之间的延迟。
我认为您 运行 完成代码的速度太快(与之前的回答相同)。
如果你按下,你就会进入。按下第二个 if() 上的按钮是困难的。
你应该去抖动你的按钮。要触发您的按钮,您可以使用 Interrupt on Change(下降上升沿)或计算定时器中断中 "pushes" 的数量(如果端口为低或高,则每 x 毫秒查看一次,如果端口已更改,则递增一个变量)
希望对您有所帮助
当你触摸开关时,led 应该亮起,第二次触摸开关时,led 应该熄灭。pic16f1527 微控制器....这段代码不起作用,所以任何人都有解决方案。
include <xc.h>
int switchpressed(void){ // CREATE A FUNCTION FOR SWITCH PRESSED 1ST TIME
if(TRISFbits.TRISF3==1){
}
return switchpressed;
}
int switchpressed2(void){ // CREATE A FUNCTION FOR SWITCH PRESSED 2ND TIME
if(TRISFbits.TRISF3==1){
}
return switchpressed2;
}
void main(void) {
ANSELFbits.ANSF3 = 0; // RF3 AS DIGITAL PIN
TRISFbits.TRISF3 = 1; // PORT RF3 AS INPUT PIN
TRISBbits.TRISB5 = 0; // RB5 OUTPUT PIN
do{
if(RF3== switchpressed()){
PORTBbits.RB5= 1;
}
if(RF3==switchpressed2()){
PORTBbits.RB5= 0;
}
}while(1);
return ;
}