久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2207|回復: 6
收起左側

單片機按鍵+定時程序循環問題

[復制鏈接]
ID:468415 發表于 2022-7-8 09:28 | 顯示全部樓層 |閱讀模式
麻煩大佬給看一下,這個程序中,count賦值大一點(目前是1),按鍵在按的時候就不正常了,單片機源碼如下:
#include "reg52.h"

/*宏定義*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000)   /*1ms timer calculation method in 12Tmode*/
#define const_key_time_short1  60    /*短按的按鍵去抖延時時間*/
#define const_key_time_long1   1000     /*長按的按鍵去抖延時時間*/
#define const_key_time_short2  60    /*短按的按鍵去抖延時時間*/
#define const_key_time_long2   1000     /*長按的按鍵去抖延時時間*/
/*變量函數定義及申明*/
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit Key_S1 = P2^4;
sbit Breathe_Led = P0^0;
sbit Led_Red = P0^1;
sbit Led_Green = P0^2;
sbit V_buss = P0^3;
sbit Op_Ion_Fan = P0^4;

unsigned char ucKeySec = 0;   /*被觸發的按鍵編號*/
unsigned int  uiKeyTimeCnt1 = 0; /*按鍵去抖延時計數器*/
unsigned char ucKeyLock1 = 0; /*按鍵觸發后自鎖的變量標志*/
unsigned char ucShortTouchFlag1=0; /*短按觸發標志*/
unsigned int  uiVoiceCnt = 0;  /*蜂鳴器叫的持續時間計數器*/
unsigned int number;
unsigned int num;
unsigned int min;
unsigned int count;
unsigned char flag = 0;
unsigned char on_off = 0;
unsigned char flag1 = 0;

void Init_T0(void)
        {
        TMOD = 0x01;                    /*set timer0 as mode1 (16-bit)*/
        TL0 = T1MS;                     /*initial timer0 low byte*/
        TH0 = T1MS >> 8;                /*initial timer0 high byte*/
        }
        
void Init_Peripheral(void)
        {
        ET0 = 1;/*允許定時中斷*/
        TR0 = 1;/*啟動定時中斷*/
        EA = 1;/*開總中斷*/
        }

void Init(void)
        {
        Init_T0();
        Op_Ion_Fan = 0;
        Led_Green = 1;
        Led_Red = 1;
        Breathe_Led = 1;
        }
void Power_off()
{
        Op_Ion_Fan = 0;
        Led_Red = 1;
        Led_Green = 1;
        Breathe_Led = 1;
}        
void Work_Mode1(void)
{
        Op_Ion_Fan = 1;
        Led_Red = 1;
        Led_Green = 0;
        Breathe_Led = 0;
}        

void Work_Mode2(void)
{
        Op_Ion_Fan = 0;
        Led_Red = 1;
        Led_Green = 0;
        Breathe_Led = 0;
}

void Strong_Mode()
{
        Op_Ion_Fan = 1;
        Led_Red = 0;
        Led_Green = 1;
        Breathe_Led = 0;
}

void Key_Scan(void)
        {
/*掃描S1*/
                if(Key_S1 == 1) /*如果按鍵沒有被按下,將一些標志位及時清零*/
                {
                ucKeyLock1 = 0;/*自鎖標志位清0*/
                uiKeyTimeCnt1 = 0;/*按鍵去抖延時計數器清零*/
                        if(ucShortTouchFlag1 == 1)/*短按*/
                        {
                        ucShortTouchFlag1 = 0;
                        ucKeySec = 1; /*觸發S1短按*/
                        }
                }
        else if(ucKeyLock1 == 0) /*如果有按鍵按下,且是第一次按下*/
                {
                uiKeyTimeCnt1 ++;
                if(uiKeyTimeCnt1 > const_key_time_short1)/*判定短按*/
                        {
                        ucShortTouchFlag1 = 1;/*激活短按有效標志位*/
                        }
                if(uiKeyTimeCnt1 > const_key_time_long1)/*判定長按*/
                        {
                        ucShortTouchFlag1 = 0;/*清除短按有效標志位*/
                        uiKeyTimeCnt1 = 0;
                        ucKeyLock1 = 1;/*自鎖按鍵置位,避免一直觸發*/
                        ucKeySec = 2; /*觸發S1長按*/
                        }
                }        
        }

void key_Service(void)
{
        if((ucKeySec == 2) && (on_off == 0) )/*開機并確定是否為USB供電*/
        {
                on_off = 1;
                ucKeySec = 0;
                flag = 1;
        }
        if((ucKeySec == 2) && (on_off == 1))
        {
                on_off = 0;
                Power_off();
                ucKeySec = 0;
        }
        if((on_off == 1) && (flag1 == 0)&& (flag == 1) && (count >= 1))
        {
                flag1 = 1;
                count   = 0;
                Work_Mode1();
        }
        if((on_off == 1) && (flag1 == 1) && (flag == 1) && (count >= 1))
        {
                flag1 = 0;
                count   = 0;
                Work_Mode2();
        }
        if((ucKeySec == 1) && (on_off == 1) && (flag == 1))
        {
                flag = 0;
                Strong_Mode();
                ucKeySec = 0;
        }
        if((ucKeySec == 1) && (on_off == 1) && (flag == 0))
        {
                flag = 1;
                ucKeySec = 0;
        }
}

void ISR_T0(void) interrupt 1
        {
        TF0 = 0;  /*清除中斷標志*/
  TR0 = 0; /*關中斷*/
/*掃描按鍵*/
        Key_Scan();
        TL0 = T1MS;                     /*initial timer0 low byte*/
        TH0 = T1MS >> 8;                /*initial timer0 high byte*/
  TR0 = 1; /*開中斷*/        
        number++;
        if(number >= 100)
        {
                num++;
                number = 0;
                }
                if(num>=10)
                {
                        num = 0;
                        count ++;
                }
        }


void Delay_Long(unsigned int uiDelayLong)
        {
   unsigned int i;
   unsigned int j;
   for(i=0;i<uiDelayLong;i++)
                        {
      for(j=0;j<500;j++)  /*內嵌循環的空指令數量*/
         {
             ; /*一個分號相當于執行一條空語句*/
         }
                        }
        }

        /*主函數*/
void main()
        {
        /*單片機初始化*/
        Init();
        /*延時,延時時間一般是0.3-2秒之間,等待外圍芯片和模塊上電穩定*/
        Delay_Long(100);
        /*單片機外圍初始化*/
        Init_Peripheral();
        ENLED = 0;
        ADDR3 = 1;
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;
        P2 = 0xF7;
        while(1)
                {
                /*按鍵服務函數*/
        key_Service();
                }
        }
回復

使用道具 舉報

ID:883242 發表于 2022-7-8 13:00 | 顯示全部樓層
先把count改成char型試試。
回復

使用道具 舉報

ID:468415 發表于 2022-7-8 13:02 | 顯示全部樓層
Hephaestus 發表于 2022-7-8 13:00
先把count改成char型試試。

好的,我試下,謝謝!
回復

使用道具 舉報

ID:140489 發表于 2022-7-8 13:07 | 顯示全部樓層
if(num>=10)
                {
                        num = 0;
                        count ++;
                }

把count++改成count=1;試試
回復

使用道具 舉報

ID:468415 發表于 2022-7-8 13:25 | 顯示全部樓層
lids 發表于 2022-7-8 13:07
if(num>=10)
                {
                        num = 0;

count = 1 的話,后面如何增加這個數值呢?因為目前count = 1 就是1秒鐘,后面如何做時間加長處理呢?
回復

使用道具 舉報

ID:213173 發表于 2022-7-8 14:09 | 顯示全部樓層
Key_Scan函數已經放在T0中斷函數中運行,其中uiKeyTimeCnt1就是1ms計時單位,鍵值ucKeySec=2就含有長按1秒的時間信息,再增加count判斷就多余了。把number、num、count統統去掉。
回復

使用道具 舉報

ID:468415 發表于 2022-7-8 14:23 | 顯示全部樓層
wulin 發表于 2022-7-8 14:09
Key_Scan函數已經放在T0中斷函數中運行,其中uiKeyTimeCnt1就是1ms計時單位,鍵值ucKeySec=2就含有長按1秒 ...

count是1秒定時,里面有一個循環模式,這個變量值是需要調整的,有可能是20秒,也有可能是60秒,所以是需要這個count的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人超碰| 免费一区二区三区在线视频 | 亚洲三级在线观看 | 精品欧美一区二区精品久久久 | 亚洲精品久久久一区二区三区 | 精品视频一区二区三区在线观看 | 欧美精品欧美精品系列 | 亚洲天堂日韩精品 | 欧美一区二区三区四区视频 | 九九视频网 | 麻豆av片 | 国产欧美在线观看 | 国产综合一区二区 | 欧美区在线 | 成人国产精品一级毛片视频毛片 | 国产精品一二三区 | 欧美区在线 | 日日精品 | 欧美一区不卡 | 日韩一二区在线 | 精品久久久久久久久久久久久久久久久 | 中文字幕在线视频精品 | 一区二区三区免费 | av黄在线观看 | 国产亚洲精品久久19p | 色99视频| 国产精品免费视频一区 | 天天躁人人躁人人躁狂躁 | 成人在线免费网站 | www.亚洲视频.com | 久在线| 亚洲 欧美 另类 综合 偷拍 | 国内自拍偷拍视频 | 亚洲欧洲激情 | 欧美国产日韩在线观看 | 成人三级视频在线观看 | 狠狠操狠狠干 | 日韩av在线一区二区三区 | 久久国产亚洲 | www,黄色,com| 一片毛片 |