原创 第十八课 按键之四 矩阵按键之算法

2009-6-2 16:19 4107 8 9 分类: MCU/ 嵌入式

第十八课 按键之四 矩阵按键之算法


点击开大图


程序讲解


/*--------------------------------------------------------------*/
//4*4矩阵键盘的设计
//Time: 21:04 2009-4-28
//说明:由于开发板是端口复用,可能相关器件(A/D)对按键会有干扰,若有干扰,可以取下相关芯片!


/*--------------------------------------------------------------*/
//包含头文件
#include <AT89X52.H>



/*--------------------------------------------------------------*/
//键盘接口定义
#define key_port P2     


/*--------------------------------------------------------------*/
//延时5000+0us 函数定义
void delay5ms(void)
{
    unsigned char i,j;
    for(i=185;i>0;i--)
    for(j=12;j>0;j--);
}



/*--------------------------------------------------------------*/
//col对应key_port的高四位,row对应key_port的低四位
//按键ID号如下:
/*
┏━┳━┳━┳━┓ ┳
┃0 ┃ 1 ┃ 2 ┃3 ┃ ┃R0
┣━╋━╋━╋━┫ ╋
┃4 ┃ 5 ┃ 6 ┃7 ┃ ┃R1
┣━╋━╋━╋━┫ ╋
┃8 ┃ 9 ┃10┃11┃ ┃R2
┣━╋━╋━╋━┫ ╋
┃12┃13┃14┃15┃ ┃R3
┗━┻━┻━┻━┛ ┻
┣━╋━╋━╋━┫
   C0     C1    C2   C3
*/
/*--------------------------------------------------------------*/
//计算
unsigned char key_scan(void)
{
 unsigned char row, col, ok, key_code;


 key_port = 0x0f;             //此时P2=00001111,假若S1按下,则P2口数据变成
 if(key_port != 0x0f)        //00001110(不懂可参考上一课),此时满足if条件
 {
  for(row = 0; row < 4; row++)   //第一次循环 row = 0
  {
   key_port = ~(0x10 << row);    //即key_port =P2 = 11101111,因为S1按下了,故
   for(col = 0; col < 4; col++)       //key_port =P2 = 11101110
   {                                               //第一次循环 col = 0 
    ok = !(key_port & (0x01 << col));    //故ok = !(11101110&00000001)=1
    if(ok)                                                  //满足if条件
    {
     delay5ms();
     if(ok) key_code = 4*col + row;        //满足if条件 得到key_code =4*0 + 0=0
    }                                                       //故得到S1对应的键值为0
   }                                                        //大家可以依次类推得到S2,S3,S4...的键值
  }
  return (key_code);                             //返回得到的键值
 }
}



/*--------------------------------------------------------------*/
//主函数
void main(void)
{
 while(1)
 {
  P1 = ~key_scan();                 //显示按键键值
 }
}


1、本节重点。观念:当有按键按下对于单片机来说时间是很长的。


2、对比上节课的程序来说,实现同样的功能,但这节可的代码却减少了很多!希望大家能体会的算法的魅力!


相关程序:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/2/48f4c0f2-d6b5-41f0-8ea8-63e60e62ffe3.rar


 

文章评论1条评论)

登录后参与讨论

用户602342 2009-6-13 13:24

学习了,谢谢!!
相关推荐阅读
用户222124 2010-12-08 22:18
台达PLC监控
台达PLC监控网上有很多例子,自己也照着弄了个,挺方便的,分享下串口数据格式:COM1,9600,8,N,1  ...
用户222124 2010-06-27 16:36
基于NIOS II和FPGA无线小车控制系统的设计
   主控制台以Cyclone II系列的EP2C8Q208C8为核心,通过nRF24L01进行无线通讯,来控制以ATmega8为微处理器的两轮小车,可以实现小车按控制平台发送的控制信息来准确运动。所...
用户222124 2009-11-13 15:58
51开发板已经销售完了,谢谢大家的支持!
51开发板已经销售完了,谢谢大家的支持!...
用户222124 2009-09-28 16:13
51开发板十一大放送!!!赶快行动吧!!!
  51开发板十一大放送!  赶快行动吧!!!   开发板硬件介绍: http://group.ednchina.com/2031/24972.aspx  开发板实物图片总汇: http://grou...
用户222124 2009-09-13 19:02
nios II 实验五 数码管显示数字钟(定时器实现 外部中断调节)
#include "system.h"                      //包含基本的硬件描述信息#include "altera_avalon_timer_regs.h"    //定义内...
用户222124 2009-09-13 18:57
nios II 实验四 PIO外部中断
#include "system.h"                      //包含基本的硬件描述信息#include "altera_avalon_timer_regs.h"    //定义内...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条