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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

矩陣鍵盤和獨立鍵盤共用單片機P3口應如何實現分別控制?

[復制鏈接]
跳轉到指定樓層
樓主
矩陣鍵盤和獨立鍵盤共用單片機P3口時,分別給其寫程序是否會互相干擾?
想實現獨立鍵盤對數碼管進行位選  矩陣鍵盤進行段選應該怎么寫程序呢?
以及怎樣才能實現像輸入計算器時那種數碼管的動態顯示方式呢??
求大神拯救……
附帶學習板原理圖……

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

使用道具 舉報

沙發
ID:164602 發表于 2017-7-25 08:14 | 只看該作者
應該很容易。因為它們的檢測原理是不一樣的。獨立按鍵,是直接與低電平連接,按下鍵后,I/O口電平被拉低。
矩陣鍵盤,是通過分別對I/O口賦值,進行掃描,得到是哪個按鍵被按下。
所以,不用擔心它們會干擾,不然也不會那樣設計電路了。
當然,如果你同時按下了獨立按鍵和矩陣鍵盤的鍵,是會有問題的,你會同時按下嗎?
回復

使用道具 舉報

板凳
ID:716711 發表于 2020-3-27 09:58 | 只看該作者
雖然這是多年前的問題了,但我百度確未解決問題,苦惱一晚上,借鑒了他人的思路。利用中斷解決了這個問題。
回復

使用道具 舉報

地板
ID:716711 發表于 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());       
                }
        }

回復

使用道具 舉報

5#
ID:716711 發表于 2020-3-27 10:07 | 只看該作者
思路:利用中斷 掃描矩陣鍵盤,矩陣鍵盤每次掃描完,又把P2 口賦高電平,主程序檢測獨立鍵盤,兩者互不干擾。 利用我的程序需要將 P0 口接 六位共陰極液晶顯示, P1口接流水燈。  不知道發圖片,可以肯定的是能夠實現,我的程序100% 仿真成功。
回復

使用道具 舉報

6#
ID:979186 發表于 2021-11-8 17:01 | 只看該作者
lgz1860 發表于 2020-3-27 09:58
雖然這是多年前的問題了,但我百度確未解決問題,苦惱一晚上,借鑒了他人的思路。利用中斷解決了這個問題。

解決問題了,十分感謝這個兄弟,確實是好多年前的問題了,但是在網上也沒找到解決辦法。
回復

使用道具 舉報

7#
ID:313048 發表于 2021-11-8 17:14 | 只看該作者
先檢測獨立的,然后檢測矩陣的,挺簡單的還是。
回復

使用道具 舉報

8#
ID:332444 發表于 2021-11-9 08:37 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色av免费网站 | 亚洲三级在线 | 久热精品在线观看视频 | 成人av在线播放 | 国产综合久久久久久鬼色 | 欧美一级二级视频 | 欧美日韩一区二区三区四区五区 | 精品国产欧美一区二区三区不卡 | 99精品网| 亚洲男人网 | 91综合网 | 亚洲激精日韩激精欧美精品 | 国产精品福利在线观看 | 男女性毛片 | 久久一区二区三区电影 | 亚洲国产成人久久综合一区,久久久国产99 | 成人在线观看免费 | 一级在线| 国产精品久久 | 亚洲人a| 欧美日韩一区二区三区不卡视频 | a级毛片免费高清视频 | 在线看亚洲 | 在线国产一区 | 青青草亚洲 | 亚洲国产精品福利 | 亚洲精品日韩在线 | 久久久久国色av免费观看性色 | 欧美区在线观看 | 国产成人精品免费 | 九九精品在线 | 久久人人爽人人爽 | 色综合激情 | 国产偷录叫床高潮录音 | 国产大学生情侣呻吟视频 | 天天av天天好逼 | 五月婷婷 六月丁香 | 夜夜爽99久久国产综合精品女不卡 | h肉视频 | 国产区一区| 久久最新 |