找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机怎么把独立键盘和矩阵按键分开,并在一个文件里使用

[复制链接]
跳转到指定楼层
楼主
ID:284187 发表于 2018-2-16 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如4*4按键的最后一行接口与独立按键的接口是一样的,怎么才能让独立按键行驶功能并在保证不影响矩阵按键的功能下进行
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:272269 发表于 2018-2-17 01:17 | 只看该作者
你用的矩阵的扫描是翻转的吗
如果是就在第二次翻转的时候加独立键盘
以下例子
                temp1=0xf0;
                 P3=temp1;
                 temp2=P3;
                 temp3=P3;
                 switch (temp2)
                 {
                    case 0xe0: l=0;break;
                        case 0xd0: l=1;break;
                        case 0xb0: l=2;break;
                        case 0x70: l=3;break;
                 }
                 temp1=0x0f;
                 P3=temp1;
                 temp2=P3;
                 switch (temp2)
                 {
                    case 0x0e: h=0;break;
                        case 0x0d: h=1;break;
                        case 0x0b: h=2;break;
                        case 0x07: h=3;break;
                    default :
                        switch (temp3)
                        {
                           case 0xe0: h=4;break;
                           case 0xd0: h=4;break;
                           case 0xb0: h=4;break;
                           case 0x70: h=4;break;
                       
                        }         
               
                 }
                 w=l+h*4;

到最后还是 w=l+h*4;这公式输出
只是把 独立键盘 创一些新的键值给它

只是在第二次选择的时候加上去的
temp1和temp2是用来赋值的 会改变的
而temp3是在temp2改变之后还保存着第一次的结果
方便运算独立键盘  之后在用键值搞功能就行

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:213173 发表于 2018-2-18 08:31 | 只看该作者
给你一个例程参考,有详细注释。硬件为4*4矩阵键盘接P3,4个独立按键接P3.4~P3.7,共20个按键。用LED显示键值,实际运用中要写按键服务程序,根据键值安排任务。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar key=0;
/************按键扫描程序**************/
void keyscan()                                       
{
        static bit sign=0,sign1=0;                        //按键有效标志
        static uint count=0,count1=0;                //消抖计数变量                       
        uchar num=0,num1=0;                                //临时变量
//矩阵按键部分
        P3=0x0f;                                                //赋值P3 0000 1111
        if(P3!=0x0f)                                //检测有按键按下
        {
                count++;                                //消抖计数
                if((count>=1000)&&(sign==0))        //100~1000,根据主循环周期调整约10~20ms
                {                       
                        sign=1;                                //按键有效标志置1
                        num=P3;                                //保存P3值0000 xxxx,x为0或1
                        num|=0xf0;                        //保存num按位或0xf0值1111 xxxx
                        P3=num;                                //再赋值P3 1111 xxxx
                        num=P3;                                //保存P3值 xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key= 1; break;
                                case 0xde: key= 2; break;
                                case 0xbe: key= 3; break;
                                case 0x7e: key= 4; break;
                                case 0xed: key= 5; break;
                                case 0xdd: key= 6; break;
                                case 0xbd: key= 7; break;
                                case 0x7d: key= 8; break;
                                case 0xeb: key= 9; break;
                                case 0xdb: key=10; break;
                                case 0xbb: key=11; break;
                                case 0x7b: key=12; break;
                                case 0xe7: key=13; break;
                                case 0xd7: key=14; break;
                                case 0xb7: key=15; break;
                                case 0x77: key=16; break;
                                default: break;
                        }
                }
        }
        else                                                //键抬起
        {
                sign=0;                                //按键有效标志清0
                count=0;                                //消抖计数清0
        }
//独立按键部分
        P3=0xff;                                                //P3复位
        if(P3!=0xff)                                //检测有按键按下
        {
                count1++;                                //消抖计数
                if((count1>=1000)&&(sign1==0))        //100~1000,根据主循环周期调整约10~20ms
                {                       
                        sign1=1;                                //按键有效标志置1
                        num1=P3;                                //保存P3值xxxx 1111,x为0或1
                        switch(num1)
                        {
                                case 0xef: key=17; break;
                                case 0xdf: key=18; break;
                                case 0xbf: key=19; break;
                                case 0x7f: key=20; break;
                                default: break;
                        }
                }
        }
        else                                                //键抬起
        {
                sign1=0;                                //按键有效标志清0
                count1=0;                                //消抖计数清0
        }
}
/************主函数************/
void main()
{
        while(1)
        {
                keyscan();                                //按键扫描程序
                P1=~key;                                //LED显示,低电平亮
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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