找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2151|回复: 3
收起左侧

51单片机 关于6*4键盘

[复制链接]
ID:258850 发表于 2018-6-24 17:20 | 显示全部楼层 |阅读模式
100黑币
需要用到单片机的P1口和P2.3、P2.4接口,我现在的想法是对根据4*4的矩阵键盘原理,将这十个IO口作为一个数据,然后类似矩阵键盘进行判断,但在数据结合时出现问题,有什么办法能结合数据呢?
我写的代码:
#define P2_3  P2^3
#define P2_4  P2^4

#define P_key P2_4<<9|P2_3<<8|P0   //用移位操作进行提示non-address/-constant initializer错误
考虑到是不是单片机的移位循环问题,想不出来如何解决。


最佳答案

查看完整内容

#include #define uint unsigned int #define uchar unsigned char sbit code0=P1^0; //定义6*4键盘端口 sbit code1=P1^1; sbit code2=P1^2; sbit code3=P1^3; sbit code4=P1^4; sbit code5=P1^5; sbit code6=P1^6; sbit code7=P1^7; sbit code8=P2^3; sbit code9=P2^4; uint key=0; //键值变量 uint PD() //读取10位数据 { uint i; i=code9; i=(i9; } void keyscan() ...
回复

使用道具 举报

ID:213173 发表于 2018-6-24 17:20 | 显示全部楼层
无标题.jpg

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit code0=P1^0;                                        //定义6*4键盘端口
sbit code1=P1^1;
sbit code2=P1^2;
sbit code3=P1^3;
sbit code4=P1^4;
sbit code5=P1^5;
sbit code6=P1^6;
sbit code7=P1^7;
sbit code8=P2^3;
sbit code9=P2^4;

uint key=0;                                                        //键值变量

uint PD()                                                        //读取10位数据
{
        uint i;
        i=code9;
        i=(i<<1)|code8;
        i=(i<<1)|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 PX(uint i)                                        //写入10位数据
{   
    code0=i&0x0001;
    code1=(i&0x0002)>>1;
    code2=(i&0x0004)>>2;
    code3=(i&0x0008)>>3;
    code4=(i&0x0010)>>4;
    code5=(i&0x0020)>>5;
    code6=(i&0x0040)>>6;
    code7=(i&0x0080)>>7;
    code8=(i&0x0100)>>8;
    code9=(i&0x0200)>>9;
}

void keyscan()                                                //矩阵按键扫描程序
{
        static bit sign=0;                        //按键自锁标志
        static uint count=0;                        //消抖计数变量                       
        uint num=0;                                                //临时变量
        PX(0x03f0);                                                //赋值PX 0000 0011 1111 0000
        if(PD()!=0x03f0)                                //检测有按键按下
        {
                count++;                                                //消抖计数
                if((count>=50)&&(sign==0))//根据主循环周期调整约10~20ms
                {                       
                        sign=1;                                        //按键自锁标志置1
                        num=PD();                                //保存PD值 0000 00xx xxxx 0000,x为0或1
                        num|=0x000f;                        //保存num按位或0x0f值0000 00xx xxxx 1111
                        PX(num);                                        //赋值PX 0000 00xx xxxx 1111
                        num=PD();                                //保存PD值0000 00xx xxxx xxxx
                        switch(num)
                        {
                                case 0x03ee: key= 1; break;//0000 0011 1110 1110
                                case 0x03de: key= 2; break;//0000 0011 1101 1110
                                case 0x03be: key= 3; break;//0000 0011 1011 1110
                                case 0x037e: key= 4; break;//0000 0011 0111 1110
                                case 0x02fe: key= 5; break;//0000 0010 1111 1110
                                case 0x01fe: key= 6; break;//0000 0001 1111 1110

                                case 0x03ed: key= 7; break;//0000 0011 1110 1101
                                case 0x03dd: key= 8; break;//0000 0011 1101 1101
                                case 0x03bd: key= 9; break;//0000 0011 1011 1101
                                case 0x037d: key=10; break;//0000 0011 0111 1101
                                case 0x02fd: key=11; break;//0000 0010 1111 1101
                                case 0x01fd: key=12; break;//0000 0001 1111 1101

                                case 0x03eb: key=13; break;//0000 0011 1110 1011
                                case 0x03db: key=14; break;//0000 0011 1101 1011
                                case 0x03bb: key=15; break;//0000 0011 1011 1011
                                case 0x037b: key=16; break;//0000 0011 0111 1011
                                case 0x02fb: key=17; break;//0000 0000 1111 1011
                                case 0x01fb: key=18; break;//0000 0001 1111 1011

                                case 0x03e7: key=19; break;//0000 0011 1110 0111
                                case 0x03d7: key=20; break;//0000 0011 1101 0111
                                case 0x03b7: key=21; break;//0000 0011 1011 0111
                                case 0x0377: key=22; break;//0000 0011 0111 0111
                                case 0x02f7: key=23; break;//0000 0010 1111 0111
                                case 0x01f7: key=24; break;//0000 0001 1111 0111
                        }
                }
        }
        else                                                        //键抬起
        {
                sign=0;                                        //按键自锁标志清0
                count=0;                                        //消抖计数清0
        }
}
void main()                                                //主函数
{
        while(1)
        {
                keyscan();                                //按键扫描程序
                P3=~key;                                        //LED低电平显示
        }
}

回复

使用道具 举报

ID:358699 发表于 2018-6-25 19:08 | 显示全部楼层
可以试试循环
回复

使用道具 举报

ID:258850 发表于 2018-7-7 16:23 | 显示全部楼层
wulin 发表于 2018-6-24 17:20
#include
#define uint unsigned int
#define uchar unsigned char

谢谢,解决问题了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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