Chinaunix首页 | 论坛 | 博客
  • 博客访问: 630953
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:29:38

原文地址:矩阵键盘 作者:luozhiyong131

  1. /*********************************************
  2. 文件:矩阵键盘
  3. [ ];罗志勇、周彬炎、霍小波
  4. 描述:4*4矩阵键盘
  5.      keydown(void)函数读按键
  6.      key保存键值
  7. 时时:2011年1月13日
  8. **********************************************/

  9. #include <intrins.h>
  10.                 
  11. #define uchar unsigned char

  12. char key=0,key_temp;         //键值


  13. void key_delayNOP()     //短延时

  14. {    
  15.     _nop_();_nop_();_nop_();_nop_();
  16. }

  17. void key_delay(uchar key_x) //长延时函数 key_x*0.14MS

  18. {
  19.     uchar key_j;
  20.     while((key_x--)!=0)
  21.     {
  22.         for(key_j=0;key_j<125;key_j++);
  23.     }
  24. }

  25. /*等待按键松开*/
  26.  void waitkey()
  27.  {
  28.     P3=0xF0;        
  29.     key_delay(5);    
  30.     key_temp=P3;
  31.      if(key_temp!=0xF0)
  32.      {
  33.         key_temp = P3 ;    
  34.         key_temp &= 0xF0;
  35.      }
  36.  }

  37.  void keyscan(void)
  38.  {    
  39.     
  40.     /*扫描行号*/
  41.     P3=0x0F;         //低四位输入

  42.     key_delay(2);         //延时2ms

  43.     key_temp=P3;         

  44.     key_temp=key_temp&0x0F;        //取行号 0为有效值 屏蔽高4位(行号值)

  45.     key_temp=~(key_temp|0xF0); //转换行号变成相应的数值

  46.     if(key_temp==1)
  47.         key=1;
  48.     else if(key_temp==2)
  49.         key=2;
  50.     else if(key_temp==4)
  51.         key=3;
  52.     else if(key_temp==8)
  53.         key=4;
  54.     else
  55.         key=16;
  56.     
  57.     /*扫描列号*/
  58.     P3=0xF0;     //高四位输入

  59.     key_delay(2);
  60.     key_temp=P3;

  61.     key_temp=key_temp&0xF0;        //取列号 0为有效值    屏蔽低4位(列号值)

  62.     key_temp=~((key_temp>>4)|0xF0); //转换列号变成相应的数值

  63.     if(key_temp==1)
  64.         key=key+0;
  65.     else if(key_temp==2)
  66.         key=key+4;
  67.     else if(key_temp==4)
  68.         key=key+8;
  69.     else if(key_temp==8)
  70.         key=key+12;
  71.     else
  72.          key=16;
  73.     
  74.     waitkey(); //等待按键松开

  75.     
  76.     if(key>8)
  77.         key =(key-8)*(-1); //反转值

  78.     
  79.     
  80.  }

  81.  /*判断键盘是否有键按下*/
  82.  void keydown(void)
  83.  {
  84.    P3=0xF0;        //设置扫描值

  85.    key_delayNOP();    //短延时

  86.    if(P3!=0xF0)
  87.    {
  88.      keyscan();
  89.    }
  90.  }
阅读(122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~