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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3255|回復: 9
打印 上一主題 下一主題
收起左側

單片機中斷按鍵顯示計數程序問題

[復制鏈接]
跳轉到指定樓層
樓主
我原來的程序功能是,兩個按鍵,一個按鍵總控制,另外一個按鍵按一下數碼管顯示加1,這個已經實現了, 我現在想改進的功能是,按鍵單按加1,長按加10,以下是我修改的程序,有問題(單按一次,個位,十位均加1),求助各位師兄指點。

/****************************************************************************
         兩個按鍵,一按鍵控制數碼管顯示加1,一按鍵暫停,加1.清零
                   P0口接數碼管,
*****************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //共陰數碼管段碼        0-9
uchar led_num;                                                     //LED計數值
uchar num_L,num_H;                                                                                                   //LED計數值高低位分離
uchar a;                                                                                                                   // 記錄按鍵二的次數
uchar b;                                                                                                                  
sbit P20=P2^0;
sbit P21=P2^1;                                                                        // 數碼管位選控制
void delayms(uint ms)
{
        uint i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
void display(void)
{        
        if(led_num<10)
        {
                P20=0;
                P21=1;
                P0=led_tab[led_num];
                delayms(10);
        }
        else
        {
        num_L=led_num%10;
        num_H=led_num/10;
        P20=1;
           P21=0;
        P0=led_tab[num_H];
        delayms(5);
        P20=0;
           P21=1;
        P0=led_tab[num_L];
        delayms(5);
        }
}
void int0() interrupt 0
{
        b=0;
        delayms(10);
        if(INT0==0)
                {
                        led_num++;                                                   //單按加1
                        delayms(10);                                 
                        if(INT0==0)                                                     //進入長按的延時循環
                        {
                                b++;
                                delayms(50);
                                if(b=50)
                                {
                                        led_num+=10;
                                        b=30;        
                                }
                        }
                        if(led_num>99)
                        {
                                led_num=0;
                        }
                }
}
void int1() interrupt 2
{
        delayms(10);
        if(INT1==0)
                {
                        a++;
                        if(a>3)
                        {
                                a=1;
                        }
                }
}
void INT1_init(void)
{
        EX1=1;
        IT1=1;
        EA=1;
}
void main(void)
{
        a=0;
        led_num=0;
        INT1_init();
        while(1)
        {
                switch(a)
                {
                        case 0: led_num=0; break;
                        case 1: EX0=1;IT0=1; break;
                        case 2: EX0=0; break;
                        case 3: led_num=0; break;
                }
                display();
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:65956 發表于 2020-11-30 09:05 | 只看該作者
你要解決的是單個按鍵要有短按、長按如何區分的功能,壇里有這方面的,可以參考一下就行了
回復

使用道具 舉報

板凳
ID:790408 發表于 2020-11-30 09:21 來自手機 | 只看該作者
可以判斷時間來實現短按和長按的區別
回復

使用道具 舉報

地板
ID:140489 發表于 2020-11-30 10:46 | 只看該作者
你去看看這篇關于長短按鍵識別的文章,包你有收獲 https://blog.csdn.net/yuanmeixiang/article/details/53990353
回復

使用道具 舉報

5#
ID:140489 發表于 2020-11-30 13:40 | 只看該作者
按你的要求,寫了下,仿真通過
/****************************************************************************
      
                   P0口接數碼管,
*****************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};   //共陰數碼管段碼        0-9
uchar led_num;                                                     //LED計數值
uchar num_L,num_H;  //LED計數值高低位分離

uint key_cont; //按鍵消抖計數
bit key_lock;  //按鍵自鎖標志
sbit P20=P2^0;                //數碼管 個位
sbit P21=P2^1;      // 數碼管 十位

sbit key = P3^0;        //按鍵
//////////////////////////////////
void delayms(uint ms)
{
        uint i,j;
   
               for(j = 0; j < ms; j--)
                 for(i = 0;i < 120; i++);
        
}
//////////////////////////////
void display()
{        
        if(led_num<10)
        {
                P20=0;
                P21=1;
                P0=led_tab[led_num];
                delayms(10);
        }
        else
        {
                num_L=led_num%10;
                num_H=led_num/10;
               
                    P20=1;
                P0=led_tab[num_H];
                P21=0;
                delayms(5);
               
                P21=1;
                P0=led_tab[num_L];
                        P20=0;
                delayms(5);
        }
}
////////////////////////////
void keyscan()
{
        if(key)                   //按鍵沒按下
        {
                key_cont = 0;
                key_lock = 0;
        }
        else if(key_lock == 0)         //短按
        {
                key_cont++;
                if(key_cont>100)
                {
                        key_lock = 0;       
                }
                key_lock = 1;
                led_num++;
                if(led_num>100)
                        led_num=0;
        }
        else if(key_cont<1000) //長按
        {
                key_cont++;
                if(key_cont==1000)
                {
                        key_cont=900; //這里調節長按連加的速度
                        led_num+=10;
                        if(led_num>100)
                                led_num=0;       
                }       
        }               
}
///////////////////////////

void main(void)
{
        led_num=21;
        while(1)
        {
                display();
                                keyscan();
        }
}

數碼管.png (18.74 KB, 下載次數: 115)

數碼管.png

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:656213 發表于 2020-11-30 13:50 | 只看該作者
1922323908 發表于 2020-11-30 09:21
可以判斷時間來實現短按和長按的區別

我就是判斷時間長短來進行的呀,不過就是沒有達到我實際想要的效果。
回復

使用道具 舉報

7#
ID:140489 發表于 2020-11-30 16:28 | 只看該作者
jiahz2019 發表于 2020-11-30 13:50
我就是判斷時間長短來進行的呀,不過就是沒有達到我實際想要的效果。

/****************************************************************************
      
                   P0口接數碼管,
*****************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};   //共陰數碼管段碼        0-9
uchar led_num;                                                     //LED計數值
uchar num_L,num_H;  //LED計數值高低位分離

uint key_cont; //按鍵消抖計數
bit key_lock;  //按鍵自鎖標志
sbit P20=P2^0;                //數碼管 個位
sbit P21=P2^1;      // 數碼管 十位

sbit key = P3^0;        //按鍵
//////////////////////////////////
void delayms(uint ms)
{
        uint i,j;
   
               for(j = 0; j < ms; j++)
                 for(i = 0;i < 120; i++);
        
}
//////////////////////////////
void display()
{        
        if(led_num<10)
        {
                P20=0;
                P21=1;
                P0=led_tab[led_num];
                delayms(10);
        }
        else
        {
                num_L=led_num%10;
                num_H=led_num/10;
               
                    P20=1;
                P0=led_tab[num_H];
                P21=0;
                delayms(5);
               
                P21=1;
                P0=led_tab[num_L];
                        P20=0;
                delayms(5);
        }
}
////////////////////////////
void keyscan()
{
        if(key)                   //按鍵沒按下
        {
                key_cont = 0;
                key_lock = 0;
        }
        else if(key_lock == 0)         //短按
        {
                key_cont++;
                if(key_cont>50)
                {
                        key_lock = 0;       
                }
                key_lock = 1;
                led_num++;
                if(led_num>100)
                        led_num=0;
        }
        else if(key_cont<200) //長按
        {
                key_cont++;
                if(key_cont==200)
                {
                        key_cont=150; //這里調節長按連加的速度
                        led_num+=10;
                        if(led_num>100)
                                led_num=0;       
                }       
        }               
}
///////////////////////////

void main(void)
{
        led_num=21;
        while(1)
        {
                display();
                                keyscan();
        }
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:656213 發表于 2020-11-30 22:04 | 只看該作者
lids 發表于 2020-11-30 16:28
/****************************************************************************
      
           ...

想請教 一下   if(key)    這個語句怎么理解, 按我的理解是,如果表達按鍵沒按下,那不是應該 if (key==1) 嗎?
回復

使用道具 舉報

9#
ID:656213 發表于 2020-11-30 22:42 | 只看該作者
lids 發表于 2020-11-30 16:28
/****************************************************************************
      
           ...

這個效果太好了,不過程序我還沒看懂,需要再慢慢理解一下,謝謝!
回復

使用道具 舉報

10#
ID:140489 發表于 2020-12-1 08:14 | 只看該作者
jiahz2019 發表于 2020-11-30 22:04
想請教 一下   if(key)    這個語句怎么理解, 按我的理解是,如果表達按鍵沒按下,那不是應該 if (key== ...

if(key) 就是if (key==1)的簡寫,表達的意思是一樣的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产专区视频 | 嫩草黄色影院 | 日韩在线免费视频 | 日韩国产一区二区三区 | 久久国内 | 91久操视频 | 国产精品中文字幕一区二区三区 | 久久国内精品 | 玖玖视频免费 | 精品在线 | 精品国产青草久久久久福利 | 精品国产乱码久久久久久蜜退臀 | 羞羞视频网站免费观看 | 久久久久国产精品一区二区 | 午夜精品一区二区三区在线观看 | 黑人巨大精品欧美一区二区免费 | 精品无码久久久久久久动漫 | 青青久草 | 久久艹免费视频 | 午夜不卡一区二区 | 最新日韩精品 | 国产羞羞视频在线观看 | 亚洲国产aⅴ精品一区二区 免费观看av | 色视频网站在线观看 | 国产一区二区麻豆 | 久久精品久久久 | 亚洲一区二区三区在线免费观看 | 91小视频| 一区二区av | 国产一区91精品张津瑜 | 国产精品久久久久免费 | 精品一区二区三区在线观看国产 | 亚洲淫视频 | 亚洲 欧美 日韩在线 | 国产成人jvid在线播放 | 久久99蜜桃综合影院免费观看 | 男人天堂999 | 亚洲一区二区三区四区五区午夜 | 午夜视频网站 | 一区二区三区小视频 | 插插插干干干 |