打印

新手小白,问一下按键控制灯的问题

[复制链接]
112|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
曾小白|  楼主 | 2024-9-27 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一段按键程序控制一颗灯,芯片IO口已经设置弱上拉,VCC输出5V,我用仿真器调试的时候都是正常。但是烧录芯片后焊接到器具上,出现了一上电灯就被点亮的问题,控制依旧能控制,但是上电就有概率自动被点亮,且点亮的次数更多。请问有可能是什么原因出现的这个BUG?

使用特权

评论回复

相关帖子

沙发
曾小白|  楼主 | 2024-9-27 08:58 | 只看该作者

新手小白,问一下按键控制灯的问题

后续发现用镊子触碰一下控制灯的芯片引脚就能实现灯的亮灭,引脚电压为3.4伏左右

使用特权

评论回复
板凳
LcwSwust| | 2024-9-27 09:28 | 只看该作者
上代码

使用特权

评论回复
地板
曾小白|  楼主 | 2024-9-27 11:06 | 只看该作者

#include <sc.h>//芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long int

#defineLED1RA0//白
#define LED2RA2//白
#define LED3RB4//橙
#define LED4RB0    //橙

#define led     RA1

#define KEY      RB6
#define KEY2  RB7

//#define PTC_EN1  RB5

#define PTC_EN  RB5

#define     FST       RA3

volatile  bit  Start_flat;
volatile  bit  biaozhi1;
volatile  bit  PTC_Level_flat;
volatile  bit  PTC_GPIO_flat;
volatile  uint8_t  KEYMode_flat;
//volatile  uint8_t   KEYMode=0;
volatile  uint8_t   Long_PressKEY=0;
volatile  uint8_t   Short_PressKEY=0;
volatile  uint16_t  tt=0;
volatile  uint16_t  aa=0;
volatile  uint16_t  Timer=0;
volatile  uint8_t   count=0;
volatile  uint8_t   Ptc_DingShi_flat=0;
volatile  uint8_t   led_flat=0;
volatile  uint16_t   count1=0;
volatile  uint16_t   count2=0;
volatile  uint16_t   count3=0;
volatile  uint16_t   count4=0;

#define  FinshDingShi_8H              959  //定时8小时
#define  FinshDingShi_12H            1439  //定时12小时
#define  DLU_FinshDingShi            2879  //定时24小时

#define  PWM_COUNT_MAX             65530
#define  PWM_COUNT                 20000


void Delay(uint16_t x)
{
   uint8_t i,j;
   for(i=x;i>0;i--)
      for(j=9;j>0;j--);
}

void   KEY_Ptc_DingShi_Scan(void)
{
   if(KEY)
   {
if(count1>200)
      {
Ptc_DingShi_flat++;
            if(Ptc_DingShi_flat>2)Ptc_DingShi_flat=0;
            aa=0;Timer=0;
         count1=0;
      }
      biaozhi1=0;count1=0;   
   }
   else if(biaozhi1==0)
   {
      if(KEY==0)
      {
         count1++;
         if(count1==20000)
         {
KEYMode_flat=1;
if(Ptc_DingShi_flat>0)
{
KEYMode_flat=1;
Long_PressKEY++;
if(Long_PressKEY>1)
{
Long_PressKEY=0;//Ptc_DingShi_flat=0;
}
}
else if(Ptc_DingShi_flat==0)
{
Ptc_DingShi_flat=1;Long_PressKEY=1;
KEYMode_flat++;
if(KEYMode_flat>1)
{
KEYMode_flat=0;
}
}
//Ptc_DingShi_flat=0;
   count1=0;biaozhi1=1;
         }
      }
   }
if(KEY2==0)
{
//Delay(200);
while(KEY2==0);
//Delay(200);
led=~led;
}
}
void main(void)
{
asm("nop");
asm("clrwdt");

OPTION_REG =0X00;//预分频给TMR0  
OSCCON = 0x50;//内部振荡器16M   0x27

WPUA = 0B00001000;
WPDA = 0B00000000;            

WPUB = 0B11000000;
WPDB = 0B00000000;              

ODCONB = 0B00000000;//配置开漏输出情况
IOCB = 0B00000000;

TRISA = 0x08;
TRISB = 0xC0;

TMR0 = 6;//设定Timer初始值,计时时间为(256-6)*4*2/16M=125uS
T0IF = 0;
T0IE = 1;//使能Timer0溢出中断

GIE = 1;//开启总中断
if(!FST)
{
Delay(1);
if(!FST)
{
if(Start_flat==1)
{
aa++;
if(aa>=1500)
{
aa=0;
Timer++;
}  
}
count++;
if(count>2)
{
count=0;
}
while(!FST);
}
}
}
}
void interrupt Timer0_Isr(void)
{
if(T0IF)
{
TMR0 += 6;
T0IF = 0;

//PORTB ^= 0XFF;
}
}
大部分代码已上传,控制部分只上传了点亮led,不知道跟哪里BUG,导致器具一上电就会自动开led

使用特权

评论回复
5
曾小白|  楼主 | 2024-9-27 11:07 | 只看该作者
曾小白 发表于 2024-9-27 11:06
#include //芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char

主要就是KEY2  RB7这个,引脚单片机内部已经设置弱上拉

使用特权

评论回复
6
LcwSwust| | 2024-9-27 11:47 | 只看该作者
曾小白 发表于 2024-9-27 11:06
#include //芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char

问题:
1.main里没见到while(1);
2.KEY_Ptc_DingShi_Scan不知在哪里调用;

建议:
1.即然上电容易出问题,那就在程序开始之处加延时,比如1秒,之后再去检测按键;
2.输入脚易受干扰,可以程序中判断KEY2低电平持续100ms才认为是低电平,不要判断一次低电平就执行取反;
也可从硬件上解决,比如加个0.1uf的电容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝