標(biāo)題: STC51C52單片機(jī)串行通信矩陣鍵盤(pán)P3和串口接收傳輸P3.0P3.1沖突怎么辦? [打印本頁(yè)]

作者: luxuan    時(shí)間: 2018-5-3 18:28
標(biāo)題: STC51C52單片機(jī)串行通信矩陣鍵盤(pán)P3和串口接收傳輸P3.0P3.1沖突怎么辦?
單片機(jī)串行通信矩陣鍵盤(pán)P3和串口接收傳輸P3.0P3.1沖突怎么辦?

作者: angmall    時(shí)間: 2018-5-3 20:14
應(yīng)該很容易。因?yàn)樗鼈兊臋z測(cè)原理是不一樣的。

矩陣鍵盤(pán),是通過(guò)分別對(duì)I/O口賦值,進(jìn)行掃描,得到是哪個(gè)按鍵被按下。
所以,不用擔(dān)心它們會(huì)干擾,不然也不會(huì)那樣設(shè)計(jì)電路了。

串口接收傳輸P3.0P3.1

矩陣鍵盤(pán)用P3.2-P3.7

作者: yunlong136    時(shí)間: 2018-5-3 20:22
換其他口接鍵盤(pán)
作者: zl2168    時(shí)間: 2018-5-3 21:51
本帖最后由 zl2168 于 2018-5-3 21:54 編輯

分開(kāi)來(lái)。槭裁匆貜(fù)使用?I/O口不夠嗎?
要合并使用也是可以的,但比較復(fù)雜易出錯(cuò)。

作者: wulin    時(shí)間: 2018-5-3 21:52
如果單片機(jī)還有其他兩個(gè)空閑端口能用的話(huà)可以采用異組端口組成矩陣鍵盤(pán)的方式把P3.0、P3.1替換出來(lái)。比如P3.2~3.7+P2.5~2.6組成4*4矩陣鍵盤(pán).
作者: suwenli    時(shí)間: 2018-5-3 22:39
沒(méi)有辦法,不能復(fù)用的
作者: pkwong    時(shí)間: 2018-5-3 23:39
不能復(fù)用的
作者: zero711    時(shí)間: 2018-5-3 23:56
矩陣按鍵的工作原理是賦值掃描,和串口通信的原理不同,一般不會(huì)干擾,如果干擾的話(huà),就在按鍵檢測(cè)時(shí)把串口中斷關(guān)閉,檢測(cè)完成再打開(kāi),如果還有別的
作者: luxuan    時(shí)間: 2018-5-4 12:53
wulin 發(fā)表于 2018-5-3 21:52
如果單片機(jī)還有其他兩個(gè)空閑端口能用的話(huà)可以采用異組端口組成矩陣鍵盤(pán)的方式把P3.0、P3.1替換出來(lái)。比如P3 ...

為什莫換成P2^0-P2^3后,會(huì)亂碼?
作者: luxuan    時(shí)間: 2018-5-4 13:28
wulin 發(fā)表于 2018-5-3 21:52
如果單片機(jī)還有其他兩個(gè)空閑端口能用的話(huà)可以采用異組端口組成矩陣鍵盤(pán)的方式把P3.0、P3.1替換出來(lái)。比如P3 ...

直接把電路換了,及程序里的端口換了就行了嗎?
作者: wulin    時(shí)間: 2018-5-5 14:27
luxuan 發(fā)表于 2018-5-4 13:28
直接把電路換了,及程序里的端口換了就行了嗎?

給你一個(gè)異組端口組成4*4矩陣鍵盤(pán)的示例程序,端口可以根據(jù)硬件電路任意設(shè)置。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit code0=P2^2;                                        //定義4*4鍵盤(pán)端口
sbit code1=P2^4;
sbit code2=P3^2;
sbit code3=P3^3;
sbit code4=P3^4;
sbit code5=P3^5;
sbit code6=P3^6;
sbit code7=P3^7;       
uchar key=0xff;                                                //鍵值變量初始值

void PX(uchar i)                                        //寫(xiě)入8位數(shù)據(jù)
{   
    code0=i&0x01;i>>=1;       
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;i>>=1;
    code5=i&0x01;i>>=1;
    code6=i&0x01;i>>=1;
    code7=i&0x01;
}

uchar PD()                                                        //讀取8位數(shù)據(jù)
{
        uchar i;
        i=code7;
        i=(i<<1)|code6;
        i=(i<<1)|code5;
        i=(i<<1)|code4;
        i=(i<<1)|code3;
        i=(i<<1)|code2;
        i=(i<<1)|code1;
        i=(i<<1)|code0;
        return i;
}

void key_scan()                                                //矩陣鍵盤(pán)掃描函數(shù)
{
        uchar num;                                                //臨時(shí)變量
        static bit sign=0;                                //按鍵自鎖標(biāo)志
        static uint count=0;                        //消抖計(jì)數(shù)變量
        PX(0xf0);                                                //先給矩陣端口賦一個(gè)初值0xf0
        if(PD()!=0xf0)                                         //判斷矩陣端口不等于所賦初值,說(shuō)明有健按下
        {
                count++;                                                //消抖計(jì)數(shù)
                if((count>=100)&&(sign==0))//如果按鍵自鎖標(biāo)志為0
                {
                        sign=1;                                        //按鍵自鎖標(biāo)志置1,鍵不抬起,按其他鍵無(wú)效
                        num=PD();                                //讀PD()值保存 xxxx 0000,x為0或1
                        num|=0x0f;                                //num按位或0x0f值xxxx 1111
                        PX(num);                                //num代入PX
                        num=PD();                                //再讀PD()值保存
                        key=num;                                //輸出鍵值
                }
        }
        else                                                         //按鍵抬起
        {
                sign=0;                                                //按鍵自鎖標(biāo)志清0
                count=0;                                        //消抖計(jì)數(shù)清0
        }
}
void main()
{        
        while(1)               
        {
                key_scan();                                        //鍵盤(pán)掃描
                P1=key;                                                //LED低電平亮顯示鍵值
        }                                                                               
}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1