接4×4矩阵键盘

发布者:岭南布衣最新更新时间:2016-11-23 来源: eefocus关键字:4×4  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章

如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示


接4×4矩阵键盘 - hjx5548 - hjx5548的博客500)this.width=500'>300)this.width=300" border=0>

图4.14.1

2. 硬件电路原理图

接4×4矩阵键盘 - hjx5548 - hjx5548的博客500)this.width=500'>300)this.width=300" border=0>

图4.14.2

3. 系统板上硬件连线

(1.       把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;

(2.       把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

4.  程序设计内容

(1.       4×4矩阵键盘识别处理

(2.       每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

5. 程序框图

 接4×4矩阵键盘 - hjx5548 - hjx5548的博客500)this.width=500'>300)this.width=300" border=0>


 2楼 Juliet 发表于 2006-5-10 11:22:00
  设计中你是否遇到过这样的问题:你的产品上要求有几十个按键,处理器IO口很少,PCB的面积又有严格限制,或者你要严格控制成本,无法使用象7219那样的扩展芯片,怎么解决这个问题?


下面有个方法,大家都见过遥控器吧,上面不但有几十个按键,而且功能还挺多什么去抖动,同时按键处理都有了,最最重要的是控制芯片体积小,价格便宜(也就1,2块钱),外围器件少。。不过具体实现起来有点小麻烦,这类芯片的信号一般是PPM输出的,通常为了有更远的遥控距离,按键编码调制在一个38k左右的载波上。所以我们不得不再为这个方案多花上1块钱,加一个有烂运放做的低通滤波器,将载波滤除后在接到单片机的IO脚上,由于两个频率相差较多,这个滤波器并不难做。我使用LM324做的。其中有两级低通,一个比较器。

当你的示波器上出现一串可爱的几百赫兹的方波时,你的硬件就成功啦。既然只用一条IO就扩展了几十个按键,软件上自然会多费些事,此类芯片发码都是有引导头,同步部分,用户码,键码等部分组成,有三十多个位,具体可参照sc6121资料。下面时一个完整的接收程序,针对的芯片是sc6121,处理器89c51

///////////////////////////////////////////////////////////////////////////////

/*定时器1中断服务程序*/

/*

 每100us中断一次,定时检测HangSignal线上的电平状态,根据6121的砝码格式译出用户码键码.\\

 ib_KeyCode[0] 用户码低位

 ,ib_KeyCode[1]用户码高位

 ,ib_KeyCode[2]键码

 ,ib_KeyCode[3]键码的反码

*/

/////////////////////////////////////////////////////////////////////////////////////

 void HandIn()  interrupt 3 using 3 {

   unsigned char tempbit=0;

   bit Hbit;

   Hbit=HandSignal;                                                        /*采样信号线*/

   if (NewKey==FALSE){                                                     /*如果上一次按键事件已经北处理*/

 switch (ib_HandState){                                        /*根据接收状态散转*/

   case LEAD:                                                /*引导头接收情况*/                                            

               if (Hbit){                                              /*如果信号线是高电平*/ 

                 if ((ib_LowTime>MIN_LeadTime)&&(ib_LowTime

      ib_HandState=START;                                  /*正确进入同步头接收状态*/

                 else ib_HandState=RESTART;                                /*否则复位接收程序*/

        ib_LowTime=0;                                           /*清除低电平时间计数*/

   }

   else{                                                 /*如果信号是低电平*/ 

     ib_LowTime++;                                       /*增加低电平时间计数器*/

 if (ib_LowTime>MAX_LeadTime)                        /*判断低电平时间是否超时*/

                 ib_HandState=RESTART;                               /*是的话复位接收程序*/

   }

               break;

       case START:                                             /*同步头接收情况*/

               if(Hbit){                                         /*如果信号线是高电平*/ 

      ib_HighTime++;                                   /*高电平时间计数器加一*/

                  if (ib_HighTime>MAX_SynTime)                     /*如果高电平时间超长,复位接收程序*/

                  ib_HandState=RESTART;

                   }

      else{                                            /*如果信号线是低电平*/

                        if ((ib_HighTime>MIN_SynTime)&&(ib_HighTime

                    ib_HandState=WAIT_HIGH; 

                    else ib_HandState=RESTART;                               /*否则复位接收程序*/ 

                        ib_HighTime=0;   

   }

   

               break;

   case WAIT_HIGH:  /*等待数据位的上升沿的情况*/

                if (Hbit){                                                 /*如果检测到一个上升沿*/                     

                     if ((ib_LowTime>MIN_L_Time)&&(ib_LowTime

                          ib_HandState=WAIT_LOW;

      }

                         else ib_HandState=RESTART;                           /*否则复位接收程序*/

     ib_LowTime=0;

}

else{                                                  /*如果仍为低电平*/

  ib_LowTime++;                                        /*低电平时间计数器加一*/

  if (ib_LowTime>MAX_L_Time)                           /*如果低电平时间超长,则复位寄售程序*/

                      ib_HandState=RESTART;

}

   break;

   case WAIT_LOW:                                        /*等待数据下降沿的情况*/          

                 if (Hbit){                                            /*如果仍是高电平*/

                        ib_HighTime++;                                         /*高电平数据计数器加一*/ 

                    if (ib_HighTime>MAX_H_Time)                         /*如果高电平实际超长,则复位接收程序*/

                    ib_HandState=RESTART;

 }

 else{                                                 /*如果收到一个下降沿*/

                    ib_KeyCode[ib_KeyPoint]>>=1;                          /*接收数据字节右移一位*/

                    if ((ib_HighTime>MIN_B1TIME)&&(ib_HighTime

                    ib_KeyCode[ib_KeyPoint]+=0x80;

  }

                      ib_BitCount++;                                          /*接收数据位计数器加一*/

  if (ib_BitCount>7) {                                      /*如果接收满一个字节*/

     ib_BitCount=0;                                           /*清空位计数器*/

 ib_KeyPoint++;                                            /*指向下一个字节*/

 if (ib_KeyPoint>3)                                       /*如果接收完整个数据*/

 {

         //unsigned char i;

     NewKey=TRUE;                                                  /*置有新键按下标志*/

     //for (i=0;i<4;i++){

       //TI=0;

       //SBUF=ib_KeyCode;

       //while(!TI);

       //TI=0;

//}

                            //ib_HandState=RESTART;

 }

   }

                      ib_HighTime=0;                                              /*将高电平时间计数器清零*/

  ib_HandState=WAIT_HIGH;                        /*设定系统为等待上升沿状态*/

 }

               break; 

         default:break;

   }

   }

   if (ib_HandState==RESTART){                                                   /*如果程序处于复位状态*/

      ib_LowTime=0;                                                                   /*复位各项参数*/

      ib_HighTime=0;

      ib_HandState=LEAD; 

  ib_KeyCode[0]=0; ib_KeyCode[1]=0;

  ib_KeyCode[2]=0; ib_KeyCode[3]=0;

  ib_KeyPoint=0;

  ib_BitCount=0;

      NewKey=FALSE;

   }

 }

好多遥控器(无线,红外)发射数据都是PPM调制的,以上程序稍微改动后可以应用于各种PPM调制信号的场合。软件区提供了一个压缩包下载,其中有sc6121的中文数据手册,上面程序的头文件和初始化部分.


关键字:4×4  矩阵键盘 引用地址:接4×4矩阵键盘

上一篇:c51脉宽测量法实现无线遥控解码
下一篇:12864液晶显示C语言程序设计实例

推荐阅读最新更新时间:2024-03-16 15:21

GD32F3系列Cortex®-M4 MCU荣获“2017年度产品奖”
电子网消息,GD32F3系列Cortex®-M4 MCU荣获《今日电子》杂志评选的 “2017年度产品奖”( "Product of the Year" Awards)。   《今日电子》的姊妹刊物Electronic Products是北美最具影响力的电子类刊物之一。自1977年起,Electronic Products杂志将年度产品奖授当年最杰出的电子产品。借由Electronic Products杂志三十余年的评选经验,根据三方面标准来评价、讨论并最终确定获奖名单。
[半导体设计/制造]
画质更清晰 葡萄牙推广4K电视机顶盒
    想要观看到清晰的4K电视节目,具有一台4K机顶盒是必不可少的。在国外很多国家中,都进行了4K超高清电视的推广和试播工作。最近,来自外媒的消息显示,经营葡萄牙有线电视业务的沃达丰葡萄牙分公司宣布,将会在葡萄牙全国范围内全面推广4K超高清机顶盒。 沃达丰将为用户提供4K超清机顶盒   沃达丰葡萄牙分公司表示,从2016年4月份开始,就对4K超高清机顶盒进行了内部测试。在今后将要播出的4K电视节目方面,包括有娱乐节目、纪录片以及极限运动等内容。除此之外,沃达丰还表示,将会重点播出一些体育赛事,包括今年2016欧洲杯中一些精彩比赛,也会采用4K超高清方式进行直播,这对于葡萄牙的球迷来说,绝对可以称之为一场盛宴。   值
[家用电子]
TD-LTE巴塞罗那受宠:中移动何时推4G是关键
      编者按   中国移动主导的TD-LTE标准的4G网络的推进情况,备受全球关注。在刚刚于巴塞罗那开幕的世界移动通信大会上,中国主导的TD-LTE标准受到了爱立信等多家国际厂商的追捧。目前全球已经有14家运营商开始运营TD-LTE的4G网络。然而中国移动这家全球最大运营商,迟迟没有在中国正式运营TD-LTE网络,则在阻碍其成为全球标准。从近期中国移动在广州、深圳等地的4G网络试运营情况来看,TD-LTE在中国的推进仍然尚需时日。 (曾航)   TD-LTE巴塞罗那受宠 中国移动何时推4G是关键   本报记者 刘方远 卢爱芳 巴塞罗那报道   在巴塞罗那刚刚开幕的世界移动通信大会(Mobile World Congres
[手机便携]
移动布局4G网络 无线监控逐渐深入应用
今年下半年开始,中国移动全面启动4G网络建设。其中包括:2013年开始在国内100个城市进行TD-LTE我国4G技术 标准 设备采购,以及2013年建成TD-LTE基站规模超过20万个,即2013年新建基站18万个。据介绍,这一投资总额将达到约1800亿元。移动启动4G网络高清无线监控驶入快车道,相对于刚刚成熟的3G网络,4G在上传和下载速度都有较大的提升。无线应用对于安防无线监控的发展意义重大。 移动布局4G网络 据了解,到2012年底,中国移动将按计划完成建设TD-LTE基站2万个左右,这意味着2013年,中国移动将新建TD-LTE基站约18万个,如果按照每个100万元的建设成本计算,仅建设基站一项的投资,将达到1800亿
[安防电子]
大立光:客户订单下调或影响Q4财报
    光学镜头大厂大立光11日举行季度财报会,其中第3季单季每股税后纯益(EPS)达新台币62.41元,创同期新高纪录,同时也创下单季第3高纪录,仅次于2017年第4季的64.17元新台币及2016年第4季的63.06元新台币。 不过对于第4季展望,大立光CEO林恩平抛出震撼弹,“主要是因为所有客户订单都下调”,他保守预估,10月营收会比9月差一点,11月会差比较多,12月能见度则还看不到。 从历史经验来看,2016年及2017年,大立光第4季的营运表现都较第3季续扬,不过今年大立光却已坦言,第4季状况不会比第3季好,代表智能手机需求已有下滑迹象,镜头厂接下来只能靠新技术来稳定业绩。 大立光第3季产品出货比重还是以1000万像素
[手机便携]
英特尔CEO:可如期达成4年5代制程技术目标,Intel 3正准备量产
11 月 7 日消息,英特尔今天举办了 Intel Innovation Taipei 2023 科技论坛,英特尔 CEO 帕特・基辛格登台发表演讲。 他表示,英特尔可如期达成 4 年推进 5 世代制程技术的目标。 据称,Intel 7 制程技术目前已大规模量产,Intel 4 制程也已经量产,而 Intel 3 制程准备开始量产,Intel 20A 制程将如期于 2024 年量产,最终的 Intel 18A 制程已确定相关设计规则。 至于摩尔定律是不是到尽头,他明确回应称“没有”,他拿英特尔开发的玻璃基板表示,这可以将光学直接用在基板上,将是 Intel 18A 制程之后的产品,未来还有其他“很酷”的发展。他表示,目前这些新技术
[半导体设计/制造]
PCB旺季不旺,产值较第三季下滑4%
   印刷电路板第四季旺季不旺,甚至惨淡,但受惠于智能型手机、平板计算机、超轻薄笔记本电脑热销或兴起,台湾电路板协会(TPCA)、工研院产业经济与趋势研究中心(IEK)预估,本季两岸产值仅会较第三季下滑4%。   工业技术研究院产业经济与趋势研究中心资深产业分析师江柏风说,展望2012年电子产品朝向轻、薄的方向不变,预期高阶刷电路板(PCB)产品如高密度连接(HDI)板和软性印刷电路板(FPC)的需求持续增温,若新台币对美元维持1美元兑30.16元,产值将较2011年成长8.4%,上升至5,450亿元规模。    第四季是PCB传统旺季,但上市柜11月营收表现不振,PCB上游铜箔基板(CCL)、玻纤纱及布厂联茂、台光电、台
[工业控制]
TMS320C6201在MPEG-4视频解码器中的应用
摘要:TMS320C6201是美国TI公司生产的一种高性能数字信号处理器。本文介绍如何利用1片TMS320C6201数字信号处理器实现MPEG-4 SVP视频解码,并讨论解码器的结构,算法、存储器分配以及程序的优化等问题,最后给出该解码器总体特性表。 关键词:TMS320C6201 视频压缩 MPEG-4 VOP MB IDCT 运动补偿 引言 随着网络和多媒体技术的发展,视觉通信的重要性和需求急剧增加,如桌面视频会议、移动终端、基于因特网的视音频通信等。随之而来的是视频压缩技术的迅速发展和视频压缩标准的不断推出。国际运动图像编码专家组(MPEG)先后推出了MPEG-1、MPEG-2和MPEG-4.MPEG-4是由国际运动图
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved