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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

矩陣鍵盤和獨立鍵盤共用單片機P3口應(yīng)如何實現(xiàn)分別控制?

查看數(shù): 5540 | 評論數(shù): 7 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2017-7-24 23:55

正文摘要:

矩陣鍵盤和獨立鍵盤共用單片機P3口時,分別給其寫程序是否會互相干擾? 想實現(xiàn)獨立鍵盤對數(shù)碼管進行位選  矩陣鍵盤進行段選應(yīng)該怎么寫程序呢? 以及怎樣才能實現(xiàn)像輸入計算器時那種數(shù)碼管的動態(tài)顯示方式 ...

回復

ID:332444 發(fā)表于 2021-11-9 08:37
ID:313048 發(fā)表于 2021-11-8 17:14
先檢測獨立的,然后檢測矩陣的,挺簡單的還是。
ID:979186 發(fā)表于 2021-11-8 17:01
lgz1860 發(fā)表于 2020-3-27 09:58
雖然這是多年前的問題了,但我百度確未解決問題,苦惱一晚上,借鑒了他人的思路。利用中斷解決了這個問題。

解決問題了,十分感謝這個兄弟,確實是好多年前的問題了,但是在網(wǎng)上也沒找到解決辦法。
ID:716711 發(fā)表于 2020-3-27 10:07
思路:利用中斷 掃描矩陣鍵盤,矩陣鍵盤每次掃描完,又把P2 口賦高電平,主程序檢測獨立鍵盤,兩者互不干擾。 利用我的程序需要將 P0 口接 六位共陰極液晶顯示, P1口接流水燈。  不知道發(fā)圖片,可以肯定的是能夠?qū)崿F(xiàn),我的程序100% 仿真成功。
ID:716711 發(fā)表于 2020-3-27 09:59
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula= P3^6;//段選,液晶的每一個引腳
sbit wela= P3^7;//位選,液晶的公共端
sbit s1=P2^4;
sbit s2=P2^5;
sbit s3=P2^6;
sbit s4=P2^7;
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
uint temp,z;
uchar num=0;
void delay(z);
void duli ();
void display(num);
scanjuzheng ();
uchar code led[]={   
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,
        0x00};

void init()
        {                               
                TMOD=0X01;
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                EA=1;
                ET0=1;
                TR0=1;
                P0=0xfe;
                wela=1;
                wela=0;
                P2=0xff;       
                num=16;
                P0=0x00;
                dula=1;
                dula=0;       
        }
       
//主程序       
void main ()       
{               
        init();
        while(1)
        {                       
                duli();       
        }
}
       
//獨立按鍵子程序
void duli ()
{

        if(s1==0)
        {
                delay(5);
                        if(s1==0)
                        {
                          d1=0;       
                        }
                        while(s1==0);
                        delay(5);
                        while(s1==0);
        }
       
        else
                {
                        d1=1;
                }
         

         if(s2==0)
        {
                delay(5);
                        if(s2==0)
                        {
                          d2=0;       
                        }
                        while(s2==0);
                        delay(5);
                        while(s2==0);
        }
       
        else
                {
                        d2=1;
                }
               
                 if(s3==0)
        {
                delay(5);
                        if(s3==0)
                        {
                          d3=0;       
                        }
                        while(s3==0);
                        delay(5);
                        while(s3==0);
        }
       
        else
                {
                        d3=1;
                }
               
                 if(s4==0)
        {
                delay(5);
                        if(s4==0)
                        {
                          d4=0;       
                        }
                        while(s4==0);
                        delay(5);
                        while(s4==0);
        }
       
        else
                {
                        d4=1;
                }
}

//延時子程序
void delay(z)// 延時1ms定時器
{
        uint a,b;
        for(a=z;a>0;a--)
                for(b=123;b>0;b--);
}
       
void display(num)
{               
        P0=led[num];
        dula=1;
        dula=0;
        delay(5);
}

//矩陣鍵盤子程序
scanjuzheng ()
{
//0123 掃描
        if(P2==0xff)
        {
                temp=0xfe;
        P2=temp;
        if((P2&temp)!=0xfe)
        {
                delay(5);
                if((P2&temp)!=0xfe)
                {
                        switch(P2&temp)
                        {
                        case 0xee: (num=0);
                        break;
                        case 0xde: (num=1);
                        break;
                  case 0xbe: (num=2);
                        break;
                        case 0x7e: (num=3);
                        break;
                        }               
                }
        }
        //4567 掃描
        temp=0xfd;
        P2=temp;
        if((P2&temp)!=0xfd)
        {
                delay(5);
                        if((P2&temp)!=0xfd)
                {
                switch(P2&temp)
                        {
                        case 0xed: (num=4);
                        break;
                        case 0xdd: (num=5);
                        break;
                  case 0xbd: (num=6);
                        break;
                        case 0x7d: (num=7);
                        break;
                        }
                }
        }
        //89AB 掃描
        temp=0xfb;
        P2=temp;
        if((P2&temp)!=0xfb)
        {
                delay(5);
                if((P2&temp)!=0xfb)                       
                {
                switch(P2&temp)
                        {
                        case 0xeb: (num=8);
                        break;
                        case 0xdb: (num=9);
                        break;
                  case 0xbb: (num=10);
                        break;
                        case 0x7b: (num=11);
                        break;
                        }               
                }
        }

        //CDEF 掃描
        temp=0xf7;
        P2=temp;
        if((P2&temp)!=0xf7)
        {
                delay(5);
                if((P2&temp)!=0xf7)
                {
                switch(P2&temp)
                        {
                        case 0xe7: (num=12);
                        break;
                        case 0xd7: (num=13);
                        break;
                  case 0xb7: (num=14);
                        break;
                        case 0x77: (num=15);
                        break;
                        }               
                }
        }
        temp=0xff;
        P2=temp;
        return num;
}
}
        void timer0() interrupt 1 //中斷程序 t0
        {
          TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                if(P2==0xff)             //用于判斷獨立鍵盤 沒有按下
                {
                display(scanjuzheng());       
                }
        }

ID:716711 發(fā)表于 2020-3-27 09:58
雖然這是多年前的問題了,但我百度確未解決問題,苦惱一晚上,借鑒了他人的思路。利用中斷解決了這個問題。
ID:164602 發(fā)表于 2017-7-25 08:14
應(yīng)該很容易。因為它們的檢測原理是不一樣的。獨立按鍵,是直接與低電平連接,按下鍵后,I/O口電平被拉低。
矩陣鍵盤,是通過分別對I/O口賦值,進行掃描,得到是哪個按鍵被按下。
所以,不用擔心它們會干擾,不然也不會那樣設(shè)計電路了。
當然,如果你同時按下了獨立按鍵和矩陣鍵盤的鍵,是會有問題的,你會同時按下嗎?

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91丝袜在线熟 | 国产精品久久av | 亚洲成av| 一区二区三区国产精品 | 怡红院免费的全部视频 | 日韩美av | 欧美日韩黄色一级片 | 台湾a级理论片在线观看 | 国产一区二区 | av在线免费观看网址 | 俺去俺来也www色官网cms | 国产精品久久久久久久久久久久冷 | av片免费| 在线国产欧美 | 亚洲一级淫片 | 337p日本欧洲亚洲大胆鲁鲁 | 国产精品久久久久aaaa樱花 | 精品少妇v888av | 久久国产麻豆 | 久久久久久久av麻豆果冻 | 欧美国产一区二区三区 | 成人网在线观看 | 91大神在线资源观看无广告 | 亚洲国产精品第一区二区 | 日本不卡视频在线播放 | 福利在线观看 | 亚洲a毛片 | www.久久精品视频 | 欧美日韩综合一区 | 久久99久久99精品免视看婷婷 | 国产精品久久久久一区二区三区 | 国产伦精品一区二区三区高清 | 蜜桃在线播放 | 国产精品av久久久久久久久久 | 羞羞视频一区二区 | 国产丝袜一区二区三区免费视频 | 欧美激情视频一区二区三区在线播放 | 蜜桃特黄a∨片免费观看 | 国产精品高潮呻吟久久 | 337p日韩 | 中文字幕韩在线第一页 |