久久久久久久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鲁一鲁一鲁一鲁 | 亚洲一区在线免费观看 | 久久精品国产一区二区电影 | 99精品国产一区二区青青牛奶 | 中文字幕亚洲专区 | 一区二区亚洲 | 免费看一级毛片 | 欧美 视频 | 欧美久久久久久 | 玩丰满女领导对白露脸hd | 欧美日韩综合视频 | 正在播放国产精品 | 操操操操操 | 一区二区在线不卡 | 精品国产乱码久久久久久影片 | 黄色a视频 | 国产女人第一次做爰毛片 | 午夜久久久久久久久久一区二区 | 免费在线日韩 | www.四虎.com | 天天操天天摸天天爽 | 日本一区二区在线视频 | 91精品久久久久 | 亚洲国产成人精品在线 | 一本色道精品久久一区二区三区 | 欧美lesbianxxxxhd视频社区 | 亚洲一区二区精品视频 | 欧美日韩精品免费观看 | 天天操天天射天天 | 免费一级欧美在线观看视频 | 日韩一级黄色片 | 日韩综合网 | 久久久成人网 | 欧美爱爱视频 | 国产成人精品综合 | 日本在线视频不卡 | 国产欧美日韩一区二区三区在线观看 | 爱爱无遮挡 | 精品一区二区三区四区五区 |