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

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

QQ登錄

只需一步,快速開始

搜索
查看: 4320|回復(fù): 4
收起左側(cè)

如何保證按鍵控制數(shù)碼管的穩(wěn)定顯示?

[復(fù)制鏈接]
ID:109813 發(fā)表于 2017-1-20 14:11 | 顯示全部樓層 |閱讀模式
PS:需要按一下按鍵加一或者減一,同時(shí)要保證數(shù)字的穩(wěn)定顯示(現(xiàn)在只能在沒有松手檢測(cè)的時(shí)候穩(wěn)定顯示)
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P1^1;
sbit du = P1^2;
sbit lcden = P3^4;
uchar num1 = 1, num3=1;
uint  num2=1;
uchar leddata[]={
                        0xC0,  //"0"
                        0xF9,  //"1"
                        0xA4,  //"2"
                        0xB0,  //"3"
                        0x99,  //"4"
                        0x92,  //"5"
                        0x82,  //"6"
                        0xF8,  //"7"
                        0x80,  //"8"
                        0x90,  //"9"        
                                       };

void delay(uint z);
void KeyScan();        //帶返回值的子函數(shù)
void show_num_2bit();                          //2位數(shù)碼管顯示程序
void show_num_3bit_1();                          //第一個(gè)3位數(shù)碼管顯示程序
void show_num_3bit_2();                          //第二個(gè)3位數(shù)碼管顯示程序
void show_num();
/*------------------------------------------------*/
void main()
{        
               
                lcden = 0;                                                
        TMOD = 0x01;                                       
        TH0 = (65536 - 0)/256;
        TL0 = (65536 - 0)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
               
                while(1)
                {
                        show_num();
                }
        
}

/*------------------------------------------------*/

void Interrupt_T0()interrupt 1
{
        TH0 = (65536 - 0)/256;
        TL0 = (65536 - 0)%256;

               KeyScan();        
}

void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}


void KeyScan()        //帶返回值的子函數(shù)
{
        uchar cord_l,cord_h;//聲明列線和行線的值的儲(chǔ)存變量
        P2 = 0xf8;//1111 0000
        if( (P2 & 0xf8) != 0xf8)//判斷是否有按鍵按下
        {
                delay(5);//軟件消抖
                if( (P2 & 0xf8) != 0xf8)//判斷是否有按鍵按下
                {
                          cord_l = P2 & 0xf8;// 儲(chǔ)存列線值
                          P2 = cord_l | 0x07;
                          cord_h = P2 & 0x7;// 儲(chǔ)存行線值
                        
                         switch( cord_l + cord_h )
                         {
                                         //第一行鍵值碼         控制二位數(shù)碼管
                                        case 0xf6: if(num1>=0&&num1<=98) num1++; break;                         //+1
                                        case 0xee: if(num1>=1&&num1<=99) num1--; break;                         //-1
                                        case 0xde:                 break;
                                        case 0xbe:                 break;
                                        case 0x7e:                 break;
                                       
                                        //第二行鍵值碼         控制第一個(gè)三位數(shù)碼管
                                        case 0xf5: if(num2>=1&&num2<=199) num2++; break;                         //+1
                                        case 0xed: if(num2>=2&&num2<=200) num2--; break;                         //-1
                                        case 0xdd:                 break;
                                        case 0xbd:                 break;
                                        case 0x7d:                 break;
                        
                        
                                        //第三行鍵值碼         控制第二個(gè)三位數(shù)碼管
                                        case 0xf3: if(num3>=1&&num3<=199) num3++; break;                         //+1
                                        case 0xeb: if(num3>=2&&num3<=200) num3--; break;                         //-1
                                        case 0xdb:         break;
                                        case 0xbb:         break;
                                        case 0x7b:         break;
               
                                
                         }        
                }
               
        }
               
}

void show_num_2bit()                          //2位數(shù)碼管顯示程序
{
        uchar ge, shi;
        shi =num1/10;
        ge =num1%10;         

        P0 = 0x01;                                                                 //十位顯示
        we = 1;
        we = 0;

          if(shi==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(shi!=0)
                {
                        P0 = leddata[shi];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x02;                                                          //個(gè)位顯示
        we = 1;
        we = 0;
        
        P0 = leddata[ge];
        du=1;
        du=0;
        delay(2);
                 
}

void show_num_3bit_1()                          //第一個(gè)3位數(shù)碼管顯示程序
{
        uchar ge, shi, bai;
        bai =num2/100;
        shi =num2%100/10;
        ge =num2%10;         
               
        P0 = 0x04;                                                //百位顯示
        we = 1;
        we = 0;

          if(bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(bai!=0)
                {
                        P0 = leddata[bai];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x08;                                                                 //十位顯示
        we = 1;
        we = 0;

          if(shi==0&&bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(shi!=0||bai!=0)
                {
                        P0 = leddata[shi];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x10;                                                          //個(gè)位顯示
        we = 1;
        we = 0;
        
        P0 = leddata[ge];
        du=1;
        du=0;
        delay(2);
                 
}

void show_num_3bit_2()                          //第二個(gè)3位數(shù)碼管顯示程序
{
        uchar ge, shi, bai;
        bai =num3/100;
        shi =num3%100/10;
        ge =num3%10;         
               
        P0 = 0x20;                                                //百位顯示
        we = 1;
        we = 0;

          if(bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(bai!=0)
                {
                        P0 = leddata[bai];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x40;                                                                 //十位顯示
        we = 1;
        we = 0;

          if(shi==0&&bai==0)
                {
                        P0 = 0xFF;
                        du=1;
                        du=0;
                        delay(2);
                }
        else if(shi!=0||bai!=0)
                {
                        P0 = leddata[shi];
                        du=1;
                        du=0;
                        delay(2);
                }

        P0 = 0x80;                                                          //個(gè)位顯示
        we = 1;
        we = 0;
        
        P0 = leddata[ge];
        du=1;
        du=0;
        delay(2);
                 
}

void show_num()
{
                show_num_2bit();
                show_num_3bit_1();
                show_num_3bit_2();
}
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2017-1-21 12:56 | 顯示全部樓層
“按鍵加一或者減一,同時(shí)要保證數(shù)字的穩(wěn)定顯示"  只要程序斜對(duì)了,自然能達(dá)到目的。
回復(fù)

使用道具 舉報(bào)

ID:162736 發(fā)表于 2017-1-22 17:27 | 顯示全部樓層
消抖的延遲時(shí)間短了,通常要在20ms左右
回復(fù)

使用道具 舉報(bào)

ID:154786 發(fā)表于 2017-1-22 21:01 | 顯示全部樓層
那就說明你程序?qū)懙拇蟛糠质钦_的,但消抖和延時(shí)要注意下
回復(fù)

使用道具 舉報(bào)

ID:153041 發(fā)表于 2017-1-23 12:55 | 顯示全部樓層
這個(gè)程序沒有看到按鍵釋放檢測(cè)部分,我猜是按鍵釋放檢測(cè)時(shí)(當(dāng)一直按住按鈕的時(shí)候,程序一直在檢測(cè)按鍵釋放的循環(huán)里,無法退出中斷,當(dāng)然也就沒辦法再去掃數(shù)碼管了,相當(dāng)于顯示掃描被暫時(shí)停止了);; 建議:把顯示數(shù)碼管的代碼放到定時(shí)器中斷里,把按鍵掃描放在主程序里,換個(gè)位置。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲a在线视频 | 中日av| 国产精品成人一区二区三区 | 国产精品精品视频一区二区三区 | 鲁大师一区影视 | 亚洲高清视频在线观看 | 国产一区二区三区四区 | 日本天堂一区二区 | 人妖一区| 国产一区二区精华 | 一区二区三区欧美大片 | 天天摸天天看 | 免费观看黄色一级片 | 五月婷婷激情网 | 成年人黄色一级毛片 | 中文字幕一区二区三区不卡 | 91视频一区二区三区 | www.四虎.com| 日韩美女一区二区三区在线观看 | 91精品国产综合久久久久久丝袜 | 国产乱码精品1区2区3区 | 五月综合激情在线 | 亚洲夜夜爽 | 久久国| 国产欧美日韩精品在线观看 | 91社区视频 | 成人亚洲一区 | 日韩精品亚洲专区在线观看 | 国产精品福利久久久 | 亚洲国产一区二区三区 | 波多野结衣电影一区 | 亚洲在线一区 | 日韩中文字幕 | 黄色永久免费 | 亚洲精品一区二区 | 久久激情视频 | 国产欧美一区二区三区久久手机版 | 欧美激情在线精品一区二区三区 | 色欧美片视频在线观看 | www.中文字幕.com | 亚洲一区免费在线 |