找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机矩形键盘

[复制链接]
跳转到指定楼层
楼主
我想问一下为什麽接线端口 从10到17   32到39   是怎麽对应的   Rp1是电阻吗  ?  有什麽作用  矩阵键盘的工作原理?  那边是高点位这16个键盘都是表示的什麽数字
   


#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;           这一行是什麽意思
sbit du = P2^6;
uchar code leddata[]={       这一行是什麽意思

                0x3F,  //"0"           这一行是什麽意思
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义

                         };
void delay(uint z)                       这一行是什麽意思
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}


uchar KeyScan()        //带返回值的子函数
{
        uchar cord_l,cord_h;//声明列线和行线的值的储存变量
        P3 = 0x0f;//0000 1111
        if( (P3 & 0x0f) != 0x0f)//判断是否有按键按下
        {
                delay(5);//软件消抖
                if( (P3 & 0x0f) != 0x0f)//判断是否有按键按下
                {
                          cord_h = P3 & 0x0f;// 储存行线值
                          P3 = cord_l | 0xf0;
                          cord_l = P3 & 0xf0;// 储存列线值
                          while( (P3 & 0xf0) != 0xf0 );//松手检测
                          return (cord_l + cord_h);//返回键值码
                }       
        }
               
}

void KeyPro()
{
        switch( KeyScan() )
        {
                 //第一行键值码
                case 0xee: P0 = leddata[0];                break;          这一行是什麽意思   
                case 0xde: P0 = leddata[1];                break;
                case 0xbe: P0 = leddata[2];                break;
                case 0x7e: P0 = leddata[3];                break;
               
                //第二行键值码
                case 0xed: P0 = leddata[4];                break;
                case 0xdd: P0 = leddata[5];                break;
                case 0xbd: P0 = leddata[6];                break;
                case 0x7d: P0 = leddata[7];                break;

                //第三行键值码
                case 0xeb: P0 = leddata[8];                break;
                case 0xdb: P0 = leddata[9];                break;
                case 0xbb: P0 = leddata[10];        break;
                case 0x7b: P0 = leddata[11];        break;

                //第四行键值码
                case 0xe7: P0 = leddata[12];        break;
                case 0xd7: P0 = leddata[13];        break;
                case 0xb7: P0 = leddata[14];        break;
                case 0x77: P0 = leddata[15];        break;
                //独立键盘
                case 0xfe: P0 = leddata[16];        break;
                case 0xfd: P0 = leddata[17];        break;
                case 0xfb: P0 = leddata[18];        break;
                case 0xf7: P0 = leddata[19];        break;
        }       
}

void main()
{
        we = 1;//打开位选
        P0 = 0;//八位数码管全显示
        we = 0;//锁存位选

        du = 1;//打开段选端
        P0 = leddata[22];
        while(1)
        {
               
                 KeyPro();//提取键值码并且送不同数值给数码管显示



矩阵.jpg (11.69 KB, 下载次数: 116)

矩阵.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:127330 发表于 2016-6-25 21:15 | 只看该作者
其实还可以加几个数码管的
回复

使用道具 举报

板凳
ID:111634 发表于 2016-6-26 14:12 | 只看该作者
本帖最后由 zl2168 于 2016-6-26 14:13 编辑

实例62  4×4矩阵式键盘


Proteus仿真一下,确认有效。
实例62 4×4矩阵式键盘.rar (44.79 KB, 下载次数: 17)



以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版

书中电路和程序设计有详细说明,程序语句条条有注解。




回复

使用道具 举报

地板
ID:111634 发表于 2016-6-26 14:14 | 只看该作者
本帖最后由 zl2168 于 2016-6-26 14:16 编辑

上述电路在许多单片机教材和技术资料中被介绍,但实际上该电路连接存在问题。当同一行有多键同时按下(带锁),且该行其中一键所在列又有多键同时按下时,会发生信号传递路径出错。例如,K1、K2、K8、K9同时按下,当P1.4行扫描输出低电平时,按理,仅有P1.2、P1.1会因K2、K1闭合而得到低电平列信号。但由于K2与K9同列且K8与K9同行,P1.4输出的低电平信号会通过K1→K9→K8传递到P1.0,产生低电平列信号,引起出错。同理,当P1.6行扫描输出低电平时,其低电平信号会通过K9→K1→K2传递到P1.2,产生低电平列信号,引起出错。不出错的条件是多键行与多键列不交叉。因此,这种矩阵式键盘电路适用于无锁按键时相对合理。



以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


回复

使用道具 举报

5#
ID:111634 发表于 2016-6-26 14:16 | 只看该作者
实例63  8279扩展8×8键盘和8位显示


Proteus仿真一下,确认有效。
实例63 8279扩展键盘和显示.rar (63.08 KB, 下载次数: 6)







以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

6#
ID:111634 发表于 2016-6-26 14:18 | 只看该作者
本帖最后由 zl2168 于 2016-6-26 14:25 编辑

实例64  74HC595+165扩展8×8键盘


Proteus仿真一下,确认有效。
实例64 74LS595 165扩展8×8键盘.rar (65.5 KB, 下载次数: 6)






回复

使用道具 举报

7#
ID:128038 发表于 2016-6-26 21:01 | 只看该作者
zl2168 发表于 2016-6-26 14:12
实例62  4×4矩阵式键盘

你好  
uchar KeyScan()        //带返回值的子函数
{
        uchar cord_l,cord_h;//声明列线和行线的值的储存变量
        P3 = 0x0f;//0000 1111我把这行变成了P3 = 0xf0;//0000 1111,单片机应该有什麽变化?  我试验了  没找到呀
du = 1;//打开段选端
        P0 = leddata[22];而且 我把这行22  改成了 P0 = leddata[2]但是单片机根本没变化  是怎麽回事?





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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