找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6152|回复: 10
打印 上一主题 下一主题
收起左侧

STC51C52单片机串行通信矩阵键盘P3和串口接收传输P3.0P3.1冲突怎么办?

[复制链接]
跳转到指定楼层
楼主
ID:307391 发表于 2018-5-3 18:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机串行通信矩阵键盘P3和串口接收传输P3.0P3.1冲突怎么办?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2018-5-3 20:14 | 只看该作者
应该很容易。因为它们的检测原理是不一样的。

矩阵键盘,是通过分别对I/O口赋值,进行扫描,得到是哪个按键被按下。
所以,不用担心它们会干扰,不然也不会那样设计电路了。

串口接收传输P3.0P3.1

矩阵键盘用P3.2-P3.7
回复

使用道具 举报

板凳
ID:321557 发表于 2018-5-3 20:22 | 只看该作者
换其他口接键盘
回复

使用道具 举报

地板
ID:111634 发表于 2018-5-3 21:51 | 只看该作者
本帖最后由 zl2168 于 2018-5-3 21:54 编辑

分开来啊!为什么要重复使用?I/O口不够吗?
要合并使用也是可以的,但比较复杂易出错。
回复

使用道具 举报

5#
ID:213173 发表于 2018-5-3 21:52 | 只看该作者
如果单片机还有其他两个空闲端口能用的话可以采用异组端口组成矩阵键盘的方式把P3.0、P3.1替换出来。比如P3.2~3.7+P2.5~2.6组成4*4矩阵键盘.
回复

使用道具 举报

6#
ID:321700 发表于 2018-5-3 22:39 | 只看该作者
没有办法,不能复用的
回复

使用道具 举报

7#
ID:97300 发表于 2018-5-3 23:39 | 只看该作者
不能复用的
回复

使用道具 举报

8#
ID:319871 发表于 2018-5-3 23:56 来自手机 | 只看该作者
矩阵按键的工作原理是赋值扫描,和串口通信的原理不同,一般不会干扰,如果干扰的话,就在按键检测时把串口中断关闭,检测完成再打开,如果还有别的
回复

使用道具 举报

9#
ID:307391 发表于 2018-5-4 12:53 | 只看该作者
wulin 发表于 2018-5-3 21:52
如果单片机还有其他两个空闲端口能用的话可以采用异组端口组成矩阵键盘的方式把P3.0、P3.1替换出来。比如P3 ...

为什莫换成P2^0-P2^3后,会乱码?
回复

使用道具 举报

10#
ID:307391 发表于 2018-5-4 13:28 | 只看该作者
wulin 发表于 2018-5-3 21:52
如果单片机还有其他两个空闲端口能用的话可以采用异组端口组成矩阵键盘的方式把P3.0、P3.1替换出来。比如P3 ...

直接把电路换了,及程序里的端口换了就行了吗?
回复

使用道具 举报

11#
ID:213173 发表于 2018-5-5 14:27 | 只看该作者
luxuan 发表于 2018-5-4 13:28
直接把电路换了,及程序里的端口换了就行了吗?

给你一个异组端口组成4*4矩阵键盘的示例程序,端口可以根据硬件电路任意设置。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit code0=P2^2;                                        //定义4*4键盘端口
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)                                        //写入8位数据
{   
    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位数据
{
        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()                                                //矩阵键盘扫描函数
{
        uchar num;                                                //临时变量
        static bit sign=0;                                //按键自锁标志
        static uint count=0;                        //消抖计数变量
        PX(0xf0);                                                //先给矩阵端口赋一个初值0xf0
        if(PD()!=0xf0)                                         //判断矩阵端口不等于所赋初值,说明有健按下
        {
                count++;                                                //消抖计数
                if((count>=100)&&(sign==0))//如果按键自锁标志为0
                {
                        sign=1;                                        //按键自锁标志置1,键不抬起,按其他键无效
                        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;                                                //按键自锁标志清0
                count=0;                                        //消抖计数清0
        }
}
void main()
{        
        while(1)               
        {
                key_scan();                                        //键盘扫描
                P1=key;                                                //LED低电平亮显示键值
        }                                                                               
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表