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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2690|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)按鍵消抖有反應(yīng),但是仿真的時(shí)候數(shù)碼管顯示亂抖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#include<reg51.h>
#include<intrins.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#include<stdio.h>


#define uchar unsigned char
#define uint unsigned int
#define key_group P1

uint time=0;
uint ss=00;
uint key_time;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽(yáng)極0-9的段碼
uchar key,key_temp,state_key;



int clock=0;   //時(shí)鐘初值,默認(rèn)為0
int coundown=60; //倒計(jì)時(shí),默認(rèn)60s
int kaiji=0;  //上電后進(jìn)行時(shí)鐘的設(shè)置
char num_show[4];
int show_num=0;
int up=0;  //按鍵松開(kāi)
int choose_num=0;
int state=0;
int count_state=0;
int count=0;
int num1=0,num2=0;
int result=0,add_state=0;
int stopwatch_state=0;
int clock_time=0,clock_ss=0;
int mm=0;

void Display();
void Type();
void anjian4();
void anjian3();
void anjian2();
void anjian1();
void jiafa();
void shizhong();
void miaobiao();
void daojishi();
void keyscan();

void main()
{
                        num_show[0]=clock/60/10;
                        num_show[1]=clock/60%10;
                        num_show[2]=clock%60/10;
                        num_show[3]=clock%60%10;
        TMOD=0x01;//計(jì)時(shí)器0以工作方式1計(jì)時(shí)
        EA=1;//打開(kāi)全局中斷允許
        ET0=1;//打開(kāi)定時(shí)器0中斷允許位
        TR0=1;//啟動(dòng)定時(shí)器0
        TH0=(65535-1000)/256;    //定時(shí)器初值  1ms
        TL0=(65535-1000)%256;
        
        while(1)
        {
                Display();         
        }
}




void ET_T0() interrupt 1
{
        TH0=(65535-1000)/256;    //定時(shí)器初值  1ms
        TL0=(65535-1000)%256;
        show_num++;
        if(show_num>7)
                show_num=0;
        key_time++;
        keyscan();
        if(kaiji==2)   //兩個(gè)初值都設(shè)置完畢
        {
  anjian1();
  }
  anjian3();
  anjian2();
        anjian4();
        if(count_state==1)  //倒計(jì)時(shí)的狀態(tài)變量
        {
         daojishi();
        }
        if(stopwatch_state==1)  //秒表的狀態(tài)變量
        {
                miaobiao();
        }                        
        if(kaiji==2)
        {
    shizhong();
        }
}




void Display(void)
{
switch(show_num)
{
        case 0:
                        
                                 P2=0XF0;
              P0=table[num_show[0]];
                                break;
        case 1:
               P0=table[num_show[0]];
              P2=0XF1;
                          break;
        case 2:
                         P2=0XF0;
             P0=table[num_show[1]];
                         break;
  case 3:        
              P0=table[num_show[1]];
              P2=0xF2;
                          break;
  case 4:
                         P2=0XF0;
             P0=table[num_show[2]];
                         break;
  case 5:        
             P0=table[num_show[2]];
             P2=0xF4;
                         break;
        case 6:
                                P2=0XF0;
              P0=table[num_show[3]];
                                break;
        case 7:
              P0=table[num_show[3]];
              P2=0xF8;
              break;
        default:break;
}
}

void Type(void)
{
switch(state)
  {
         case 0:  //時(shí)鐘模式
                                count_state=0;
                                stopwatch_state=0;
                                num_show[0]=clock/60/10;
                                num_show[1]=clock/60%10;
                                num_show[2]=clock%60/10;
                                num_show[3]=clock%60%10;                                
              break;
         case 1: //加法模式
                                count_state=0;
                                stopwatch_state=0;
                                choose_num=0;
                                num_show[0]=num1/1000;
                                num_show[1]=num1%1000/100;
                                num_show[2]=num1%100/10;
                                num_show[3]=num1%10;                                
                          break;
          case 2: //倒計(jì)時(shí)模式
                                count_state=0;
                                stopwatch_state=0;
                                time=0;
                                ss=0;
                                num_show[0]=coundown/1000;
                                num_show[1]=coundown%1000/100;
                                num_show[2]=coundown%100/10;
                                num_show[3]=coundown%10;                                
                          break;
                        case 3:  //秒表模式
                                count_state=0;
                                stopwatch_state=0;
                                time=0;
                                ss=0;
                                num_show[0]=ss/1000;
                                num_show[1]=ss%1000/100;
                                num_show[2]=ss%100/10;
                                num_show[3]=ss%10;                                
                          break;
      default:break;
        }
}




void keyscan(void)
{
switch(state_key)
{
  case 0:
                key_temp=(key_group&0x0f);
          if(key_temp!=0x0f)
                 {
                  key_time=0;
                        state_key=1;
                 }
  break;
        case 1:if(key_time>=1000)
               {
                                 if(key_temp==0x0f)
                                  {
                                         state_key=0;
                                        }
                                 else
                                 {
                                        state_key=2;
                                  break;
                                        }
                                 }
                                 break;
        case 2:if(key_temp==0x0e)
                    {key=1;}
                                 else if(key_temp==0x0d)
                                      {key=2;}
                                 else if(key_temp==0x0b)
                                      {key=3;}
                                 else if(key_temp==0x07)
                                      {key=4;}
                                 else
                                 {
                                  key_temp=0x0f;
                                        state_key=0;
                                        key=0;
                                        break;
                                 }
         state_key=3;
                                 break;
        case 3:if((key_group&0x0f)==0x0f)
               {
                                  key_temp=0x0f;
                                  state_key=0;
                                 }
         break;
}
}




void anjian4(void)
{
if(key==4)  //切換數(shù)字|等于按鍵/倒計(jì)時(shí),秒表開(kāi)始暫停按鍵
        {
                if(kaiji==0)
                {
                        kaiji=1;
                        choose_num=0;
                        if((num_show[0]*10+num_show[1])<=23&&num_show[2]*10+num_show[3]<=59)  //小于23:59
                                 clock=(num_show[0]*10+num_show[1])*60+num_show[2]*10+num_show[3];   //不然還是默認(rèn)值
                        
                        num_show[0]=coundown/1000;
                        num_show[1]=coundown%1000/100;
                        num_show[2]=coundown%100/10;
                        num_show[3]=coundown%10;                        
                }
                else if(kaiji==1)
                {
                        kaiji=2;
                        choose_num=0;
              coundown=num_show[0]*1000+num_show[1]*100+num_show[2]*10+num_show[3];
      //開(kāi)始時(shí)鐘
                        num_show[0]=clock/60/10;
                        num_show[1]=clock/60%10;
                        num_show[2]=clock%60/10;
                        num_show[3]=clock%60%10;                              
                }
                if(state==2)  //倒計(jì)時(shí)
                {
                        if(count_state==0)
                        {
                                count_state=1;    //開(kāi)始
                        }
                        else
                        {
                                count_state=0;   //暫停
                        }
                }
                else if(state==3)  //秒表
                {
                        if(stopwatch_state==0)
                        {
                                stopwatch_state=1;    //開(kāi)始
                        }
                        else
                        {
                                stopwatch_state=0;   //暫停
                        }
                }
                else if(state==1)  //加法
                {
                        jiafa();
                }
        }
}


void anjian3()
{
        if(key==3)  //切換數(shù)碼管按鍵||秒表清零鍵||倒計(jì)時(shí)復(fù)位鍵
        {
                up=1;
                if(kaiji<=1||state==1)
                {
                        choose_num++;
                        if(choose_num>=4)
                                choose_num=0;
                }
                if(state==2)
                {
                        if(count_state==0)
                        {
                                num_show[0]=coundown/1000;
                                num_show[1]=coundown%1000/100;
                                num_show[2]=coundown%100/10;
                                num_show[3]=coundown%10;                                
                                ss=0;
                                time=0;
                        }
                }
                if(state==3)
                {
                        if(stopwatch_state==0)
                        {
                                ss=0;
                                num_show[0]=ss/1000;
                                num_show[1]=ss%1000/100;
                                num_show[2]=ss%100/10;
                                num_show[3]=ss%10;                                
                                
                                time=0;
                        }
                }
        }
}


void anjian2(void)
{
        if(key==2)  //加1鍵
        {
                if(kaiji<=1||state==1)
                {
                        if(num_show[choose_num]<9)
                        {
                                num_show[choose_num]++;
                        }
                        else
                                num_show[choose_num]=0;
                }
        }
}



void anjian1(void)
{
                if(key==1)   //模式切換按鍵
                {
                        state++;
                        Type();
                        if(state>3)
                        state=0;
                }
}



/**************加法模塊***************/
void jiafa()
{
      add_state++;
                        if(add_state==1)
                        {
                                num1=num_show[0]*1000+num_show[1]*100+num_show[2]*10+num_show[3];
                                choose_num=0;   //位選歸0
                                        num_show[0]=num2/1000;
                                        num_show[1]=num2%1000/100;
                                        num_show[2]=num2%100/10;
                                        num_show[3]=num2%10;                                
                        }
                        if(add_state==2)  //計(jì)算結(jié)果
                        {
                                num2=num_show[0]*1000+num_show[1]*100+num_show[2]*10+num_show[3];
                                result=num1+num2;
                                if(result<=9999)
                                {
                                        num_show[0]=result/1000;
                                        num_show[1]=result%1000/100;
                                        num_show[2]=result%100/10;
                                        num_show[3]=result%10;                                       
                                }
                                else
                                {
                                        num_show[0]=9999/1000;
                                        num_show[1]=9999%1000/100;
                                        num_show[2]=9999%100/10;
                                        num_show[3]=9999%10;                                
                                }
                        }
                        if(add_state>=3)
                        {
                                add_state=0;
                                num1=0;
                                num2=0;
                                result=0;
                                choose_num=0;
                                num_show[0]=num1/1000;
                                num_show[1]=num1%1000/100;
                                num_show[2]=num1%100/10;
                                num_show[3]=num1%10;                                       
                        }
}


/*************時(shí)鐘模塊************/
void shizhong(void)
{
                clock_time++;
                if(clock_time>=1000) //1ms*1000=1s
                {
                        clock_time=0;
                        clock_ss++;
                        if(clock_ss>=60)
                        {
                                clock++;
                                clock_ss=0;
                                if(clock==1440)
                                        clock=0;
                                if(state==0)
                                {
                                 num_show[0]=clock/60/10;
                           num_show[1]=clock/60%10;
                           num_show[2]=clock%60/10;
                           num_show[3]=clock%60%10;
                                }
      }
    }
}



/*************秒表模塊*************/
void miaobiao(void)
{
time++;
                if(time==1000)  //1ms*1000=1s
                {
                        time=0;
                        if(ss!=9999)
                          ss++;
                        else
                                stopwatch_state=0;
                                num_show[0]=ss/1000;
                                num_show[1]=ss%1000/100;
                                num_show[2]=ss%100/10;
                                num_show[3]=ss%10;        
    }
}


/**********倒計(jì)時(shí)模塊**********/
void daojishi(void)
{
        time++;
                if(time==1000)  //1s
                {
                        if(ss!=coundown)
                          ss++;
                        else
                                count_state=0;
                        time=0;
                                num_show[0]=(coundown-ss)/1000;
                                num_show[1]=(coundown-ss)%1000/100;
                                num_show[2]=(coundown-ss)%100/10;
                                num_show[3]=(coundown-ss)%10;        
     }
}

捕獲.PNG (24.06 KB, 下載次數(shù): 39)

這是我的電路圖

這是我的電路圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:447891 發(fā)表于 2019-6-9 10:14 | 只看該作者
請(qǐng)大家?guī)兔匆幌掳存I消抖和按鍵功能模塊那里哪里出錯(cuò)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:332444 發(fā)表于 2019-6-9 20:02 | 只看該作者
幾個(gè)按鍵實(shí)現(xiàn)什么功能?請(qǐng)說(shuō)清楚。
回復(fù)

使用道具 舉報(bào)

地板
ID:294235 發(fā)表于 2019-6-9 20:07 來(lái)自手機(jī) | 只看該作者
消抖的時(shí)間?
回復(fù)

使用道具 舉報(bào)

5#
ID:517466 發(fā)表于 2019-6-9 23:29 | 只看該作者
按鍵掃描放定時(shí)器處理里,顯示處理倒是放在了主循環(huán)處理中了?感覺(jué)邏輯挺奇怪的。一般鍵盤掃描在主循環(huán)中做啊。消除抖動(dòng)的處理邏輯一般是:判斷按鍵是否按下?是,則延遲20ms后再次檢查是不是這個(gè)按鍵被按下。是則繼續(xù)檢測(cè)按鍵是否松開(kāi),是則表示一次完整的按鍵按下和松開(kāi)。松開(kāi)那部分也可以不做,主要是避免速度太快,按下還沒(méi)有松開(kāi)時(shí),相同處理被多次執(zhí)行。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产一区二区电影 | 久草中文网 | 精品国产1区2区3区 在线国产视频 | 午夜视频大全 | 在线观看免费av网 | 久久精品国产v日韩v亚洲 | 国产精久久久久久 | 麻豆久久久9性大片 | 国产综合久久久久久鬼色 | h视频免费在线观看 | 国产一区二 | 亚洲欧美另类在线观看 | 一区二区免费高清视频 | 大乳boobs巨大吃奶挤奶 | 亚洲人成人一区二区在线观看 | 天天欧美 | 在线观看视频中文字幕 | 日韩成人免费av | 91精品国产综合久久久久久丝袜 | 97国产精品 | 亚洲免费人成在线视频观看 | 欧美aaa| 91xxx在线观看 | 日韩视频精品 | 欧美夜夜 | 成人乱人乱一区二区三区软件 | 精品一区二区三区中文字幕 | 国产精品久久久久久久久久久久久 | 精品欧美乱码久久久久久 | 人人做人人澡人人爽欧美 | 国外激情av | 久久久久国产精品午夜一区 | 欧美日韩精品一区二区三区四区 | 欧美黑人又粗大 | 亚洲精品成人网 | 美日韩免费视频 | 欧美一级特黄aaa大片在线观看 | 国产成人精品综合 | 亚洲精品乱码8久久久久久日本 | 欧美日韩一二三区 | 欧美日韩视频一区二区 |