中科因仑“3+1”工程特种兵精英论坛

标题: 動態掃描 數碼管閃動 [打印本页]

作者: 惨淡的人生    时间: 2016-6-6 18:53
标题: 動態掃描 數碼管閃動
用數碼管做了個學習板  原意是按按鍵k20 數字加一  按按鍵k21數字減一     但發現按鍵長按的時候  數碼管沒有顯示  
只有鬆開按鍵  數碼管才顯示正確的數字  快速按動按鍵  數碼管顯示的數字在閃動  請各位幫忙看看程序那裏出錯了
謝謝





#include<reg52.h>
#include<intrins.h>
unsigned char code dsp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};        //0,1,2,3,4,5,6,7,8,9
sbit led=P3^7;
sbit beep=P3^4;
sbit k20=P2^7;
sbit k21=P2^6;
unsigned int num;
void delayms(unsigned int time);           //長延時
void delayms1(unsigned char tt);           //短延時
void beep1();                                                   //開啓蜂鳴器
void display(unsigned int number);           //顯示數字
void scankey();                                                   //鍵盤掃描
main()
{
        while(1)
        {
                scankey();
                display(num);
        }
}
void delayms(unsigned int time)
{
        unsigned int n;
        unsigned int m;
    while(time>0)
        {
                for(n=0;n<300;n++)
                {
                        for(m=0;m<300;m++);
                }
                time--;
        }
}

void beep1()
{
        beep=0;
        delayms(2);
        beep=1;
}
void display(unsigned int number)
{
        unsigned char bai,shi,ge;
        bai=number/100;                   //分離數字
        shi=number%100/10;
        ge=number%10;
        P2=0xfe;            //百位顯示打開
        P0=dsp[bai];        //顯示百位的數字
        delayms1(10);
        P0=0x00;           //消隱
        P2=0xfb;       //十位顯示打開
        P0=dsp[shi];
        delayms1(10);
        P0=0x00;
        P2=0xf7;       //個位顯示打開
        P0=dsp[ge];
        delayms1(10);
        P0=0x00;
}
void scankey()
{
        if (k20==0)                                //數字加
        {
                delayms(1);
                if(k20==0)
                {
                        num++;
                        if(num==1000)
                        {
                                num=0;
                        }
                        while(!k20);
                        beep1();
                }
        }
        if(k21==0)                  //數字減
        {
                delayms(1);
                if(k21==0)
                {
                    if(num==0)
                        {
                                num=1000;
                        }
                        num--;
                        while(!k21);
                        beep1();
                }
        }
}
void delayms1(unsigned char tt)
{
        unsigned char n=200;
        while(tt>0)
        {
                while(n>0)
                {
                        n--;
                }
                tt--;
        }
}





欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4