找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機中斷按鍵顯示計數(shù)程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:656213 發(fā)表于 2020-11-30 00:13 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
我原來的程序功能是,兩個按鍵,一個按鍵總控制,另外一個按鍵按一下數(shù)碼管顯示加1,這個已經(jīng)實現(xiàn)了, 我現(xiàn)在想改進的功能是,按鍵單按加1,長按加10,以下是我修改的程序,有問題(單按一次,個位,十位均加1),求助各位師兄指點。

/****************************************************************************
         兩個按鍵,一按鍵控制數(shù)碼管顯示加1,一按鍵暫停,加1.清零
                   P0口接數(shù)碼管,
*****************************************************************************/
#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};   //共陰數(shù)碼管段碼        0-9
uchar led_num;                                                     //LED計數(shù)值
uchar num_L,num_H;                                                                                                   //LED計數(shù)值高低位分離
uchar a;                                                                                                                   // 記錄按鍵二的次數(shù)
uchar b;                                                                                                                  
sbit P20=P2^0;
sbit P21=P2^1;                                                                        // 數(shù)碼管位選控制
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)                                                     //進入長按的延時循環(huán)
                        {
                                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 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

/****************************************************************************
      
                   P0口接數(shù)碼管,
*****************************************************************************/
#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};   //共陰數(shù)碼管段碼        0-9
uchar led_num;                                                     //LED計數(shù)值
uchar num_L,num_H;  //LED計數(shù)值高低位分離

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

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; //這里調(diào)節(jié)長按連加的速度
                        led_num+=10;
                        if(led_num>100)
                                led_num=0;       
                }       
        }               
}
///////////////////////////

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

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

使用道具 舉報

5#
ID:140489 發(fā)表于 2020-11-30 13:40 | 只看該作者
按你的要求,寫了下,仿真通過
/****************************************************************************
      
                   P0口接數(shù)碼管,
*****************************************************************************/
#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};   //共陰數(shù)碼管段碼        0-9
uchar led_num;                                                     //LED計數(shù)值
uchar num_L,num_H;  //LED計數(shù)值高低位分離

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

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; //這里調(diào)節(jié)長按連加的速度
                        led_num+=10;
                        if(led_num>100)
                                led_num=0;       
                }       
        }               
}
///////////////////////////

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

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

數(shù)碼管.png

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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