找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3735|回复: 5
打印 上一主题 下一主题
收起左侧

PIC单片机在主函数循环中怎么加入按键,用一个按键通过长按和短按来实现不同的功能

[复制链接]
跳转到指定楼层
楼主
ID:383379 发表于 2018-8-17 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的是制作一个呼吸灯,判断,1:当灯亮的时候,按下按键1s灯灭,当灯灭的时候,按下按键1s灯亮。2:通过光敏电阻采样光照,让灯自动亮灭,并能通过按键加以控制,即当光照暗的时候,按键检测1s,灯亮;当光照亮的时候,按键检测3秒,灯亮。已经可以实现光敏电阻来控制呼吸灯了,但是不懂得该怎么加入按键来加以控制,大家能帮我看看该怎么在程序中加入按键的部分吗?谢谢

#include<pic16f1828.h>
#define ADC_NUM 8//转换次数
#define LED1 LATC5
void LED(unsigned char temp);

void delay1ms(unsigned int x)
{  unsigned int y;
        for(;x>0;x--)
        {
         for(y=0;y<270;y--)
         {;}
        }
}
  void AD_GPIO_init(void)
{
   TRISC=0b00001100;
   ANSELC=0x04;
   PORTC=0x00;
   LATC=0x00;
}
  void init_fosc(void)
{
  OSCCON=0xF0;
}
void init_AD(void)
{
   ADCON1=0X90;//右对齐,8时钟,参考电源电压
   ADCON0=0x18;//AN6通道
   ADCON0bits.ADON=1;
}
void PWM_INIT()
  {
          OSCCONbits.IRCF=1110;
      TRISCbits.TRISC5=1;
      PR2=99;
      CCP1CON=0b00001100;
      CCPR1L=0b00110010;
      CCP1CONbits.DC1B=0b00;
      CCPTMRS0=0b11111100;
      PIR1bits.TMR2IF=0;
      T2CONbits.T2CKPS=0b01;
      T2CONbits.TMR2ON=1;
  while(PIR1bits.TMR2IF==0);
      TRISCbits.TRISC5=0;

  }


void LED(unsigned char temp)
        {  unsigned int i;
               
          
            CCPR1L=0;
              if(temp)
         {
             for(i=0;i<100;i++)
            {
              CCPR1L=i;
             delay1ms(60);
             }
          
                 delay1ms(600);
                 delay1ms(600);
                 delay1ms(600);
                  
                  for(i=100;i>0;i--)
               {
                  CCPR1L=i;
                  delay1ms(60);
               }  
                   CCPR1L=0;
                   delay1ms(800);
                   delay1ms(600);
                   delay1ms(600);

        }
        }
  unsigned int ADC_BAT_ONE(void)
{
      unsigned int value;
      value=0;
      ADCON0bits.CHS=6;
      ADCON0bits.ADGO=1;
         while(ADCON0bits.GO==1);
      value=(unsigned int)ADRESH;
      value=value<<8;
      value+=ADRESL;
   return value;
}
  unsigned int ADC_BAT_contiue(void)
{
   unsigned int ADV_MCU[ADC_NUM],ADV_CNT,ADV_ALL;
    ADV_ALL=0;
     for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)
         {
            ADV_MCU[ADV_CNT]=ADC_BAT_ONE();
         }
           for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)
               {
                  ADV_ALL+=ADV_MCU[ADV_CNT];
               }
       ADV_ALL=ADV_ALL/ADC_NUM;
  return ADV_ALL;
}



        void main()
        {unsigned char n;
                init_fosc();
          
            init_AD();
            PWM_INIT();
            AD_GPIO_init();

             while(1)
          {
         if(ADC_BAT_contiue()>460)
                     {delay1ms(1000);
                     
                     n=1;
                      }
                  else
                     {
                        delay1ms(1000);
                     delay1ms(1000);
                     delay1ms(1000);
                     n=0;
                 }   
              LED(n);
       

         }


以上是用光敏电阻实现的呼吸灯部分的程序,想从RC3端口输入加一个按键来控制,用的是点触开关,但是不知道该怎么在循环中加入按键的控制,请大家帮忙看看,谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:62223 发表于 2018-8-18 00:02 | 只看该作者
程序功能多了以后要尽量使用delay了,多用中断,中断里面做事件的标志,在主函数中要尽可能快的速度循环,检测到事件挂起就去执行
回复

使用道具 举报

板凳
ID:383379 发表于 2018-8-21 10:34 | 只看该作者
lingwise 发表于 2018-8-18 00:02
程序功能多了以后要尽量使用delay了,多用中断,中断里面做事件的标志,在主函数中要尽可能快的速度循环, ...

嗯。好的,谢谢。我试试。只是刚开始接触单片机,不是很懂得该怎么在程序中加入中断来实现按键。还一个是不知道该怎么实现按键的长按和短按功能
回复

使用道具 举报

地板
ID:197576 发表于 2018-8-21 12:04 | 只看该作者
浅、念 发表于 2018-8-21 10:34
嗯。好的,谢谢。我试试。只是刚开始接触单片机,不是很懂得该怎么在程序中加入中断来实现按键。还一个是 ...

通过一个计数器,例如在高电平中断里做一个
u16 t;
while(1) {
t++;
delay_ms(1)
if (电平脚为低)
break;
}
然后判断t的值可以得到按键时间
回复

使用道具 举报

5#
ID:383379 发表于 2018-8-23 18:06 | 只看该作者
Carar 发表于 2018-8-21 12:04
通过一个计数器,例如在高电平中断里做一个
u16 t;
while(1) {

你好,请问你那有类似的例子吗?可以发给我参考下吗?我在网上参考了吴坚鸿的按键写法,但是没能实现按键控制的功能,可能是按键扫描部分的程序写错了,基础很差,还是不懂该怎么加入按键来实现对灯的控制。谢谢
回复

使用道具 举报

6#
ID:389283 发表于 2018-8-24 08:30 | 只看该作者
为什么不使用中断,然后有标志位计时方式
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表