找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3705|回復(fù): 5
收起左側(cè)

PIC單片機(jī)在主函數(shù)循環(huán)中怎么加入按鍵,用一個(gè)按鍵通過長(zhǎng)按和短按來(lái)實(shí)現(xiàn)不同的功能

[復(fù)制鏈接]
ID:383379 發(fā)表于 2018-8-17 11:27 | 顯示全部樓層 |閱讀模式
目的是制作一個(gè)呼吸燈,判斷,1:當(dāng)燈亮的時(shí)候,按下按鍵1s燈滅,當(dāng)燈滅的時(shí)候,按下按鍵1s燈亮。2:通過光敏電阻采樣光照,讓燈自動(dòng)亮滅,并能通過按鍵加以控制,即當(dāng)光照暗的時(shí)候,按鍵檢測(cè)1s,燈亮;當(dāng)光照亮的時(shí)候,按鍵檢測(cè)3秒,燈亮。已經(jīng)可以實(shí)現(xiàn)光敏電阻來(lái)控制呼吸燈了,但是不懂得該怎么加入按鍵來(lái)加以控制,大家能幫我看看該怎么在程序中加入按鍵的部分嗎?謝謝

#include<pic16f1828.h>
#define ADC_NUM 8//轉(zhuǎn)換次數(shù)
#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;//右對(duì)齊,8時(shí)鐘,參考電源電壓
   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);
       

         }


以上是用光敏電阻實(shí)現(xiàn)的呼吸燈部分的程序,想從RC3端口輸入加一個(gè)按鍵來(lái)控制,用的是點(diǎn)觸開關(guān),但是不知道該怎么在循環(huán)中加入按鍵的控制,請(qǐng)大家?guī)兔纯,謝謝
回復(fù)

使用道具 舉報(bào)

ID:62223 發(fā)表于 2018-8-18 00:02 | 顯示全部樓層
程序功能多了以后要盡量使用delay了,多用中斷,中斷里面做事件的標(biāo)志,在主函數(shù)中要盡可能快的速度循環(huán),檢測(cè)到事件掛起就去執(zhí)行
回復(fù)

使用道具 舉報(bào)

ID:383379 發(fā)表于 2018-8-21 10:34 | 顯示全部樓層
lingwise 發(fā)表于 2018-8-18 00:02
程序功能多了以后要盡量使用delay了,多用中斷,中斷里面做事件的標(biāo)志,在主函數(shù)中要盡可能快的速度循環(huán), ...

嗯。好的,謝謝。我試試。只是剛開始接觸單片機(jī),不是很懂得該怎么在程序中加入中斷來(lái)實(shí)現(xiàn)按鍵。還一個(gè)是不知道該怎么實(shí)現(xiàn)按鍵的長(zhǎng)按和短按功能
回復(fù)

使用道具 舉報(bào)

ID:197576 發(fā)表于 2018-8-21 12:04 | 顯示全部樓層
淺、念 發(fā)表于 2018-8-21 10:34
嗯。好的,謝謝。我試試。只是剛開始接觸單片機(jī),不是很懂得該怎么在程序中加入中斷來(lái)實(shí)現(xiàn)按鍵。還一個(gè)是 ...

通過一個(gè)計(jì)數(shù)器,例如在高電平中斷里做一個(gè)
u16 t;
while(1) {
t++;
delay_ms(1)
if (電平腳為低)
break;
}
然后判斷t的值可以得到按鍵時(shí)間
回復(fù)

使用道具 舉報(bào)

ID:383379 發(fā)表于 2018-8-23 18:06 | 顯示全部樓層
Carar 發(fā)表于 2018-8-21 12:04
通過一個(gè)計(jì)數(shù)器,例如在高電平中斷里做一個(gè)
u16 t;
while(1) {

你好,請(qǐng)問你那有類似的例子嗎?可以發(fā)給我參考下嗎?我在網(wǎng)上參考了吳堅(jiān)鴻的按鍵寫法,但是沒能實(shí)現(xiàn)按鍵控制的功能,可能是按鍵掃描部分的程序?qū)戝e(cuò)了,基礎(chǔ)很差,還是不懂該怎么加入按鍵來(lái)實(shí)現(xiàn)對(duì)燈的控制。謝謝
回復(fù)

使用道具 舉報(bào)

ID:389283 發(fā)表于 2018-8-24 08:30 | 顯示全部樓層
為什么不使用中斷,然后有標(biāo)志位計(jì)時(shí)方式
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表