打印

自己动手写的3*3按键程序

[复制链接]
2160|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hjs1618|  楼主 | 2013-5-2 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有耐心的工程师帮忙看看

用的是PIC单片机,RA1,RA2,RA 3接行线,RB3、RB4、RB5接列线(带上拉的功能)

程序如下:(10ms执行一次)
//============= ============= ===========
//矩阵按键驱动
//============================ ==========
uchar read_keyboard(void)
{  
static char key_state = 0, key_value, key_line;
uchar key_return = No_key,i,key_value_portb=0;
  switch (key_state)
  {
   case 0:
    key_line = 0b00001000; //0  B5 B4 B3 A3 A2 A1 0
    for (i=1; i<=3; i++)     // 扫描键盘
    {  
      PORTA &= ~key_line;     // 输出行线电平
      PORTA &= ~key_line;
      key_value_portb = PORTB;
   key_value_portb = PORTB;
   key_value_portb <<= 1;
         key_value = Key_mask & key_value_portb;  // 读列电平
      if (key_value == Key_mask)
       key_line >>= 1;    // 没有按键,继续扫描
      else
      {
       key_state++;      // 有按键,停止扫描
       break;        // 转消抖确认状态
      }
    }
    break;
   case 1:
   key_value_portb = PORTB;
    key_value_portb = PORTB;
   key_value_portb <<= 1;
   if (key_value == (Key_mask & key_value_portb))  // 再次读列电平,
   {
     switch (key_line | key_value)  // 与状态0的相同,确认按键
     {              // 键盘编码,返回编码值  
      case 0b01100010:
       key_return = KA1_B3; //9
       break;
      case 0b01010010:
       key_return = KA1_B4 ; //8
       break;
       case 0b00110010:
       key_return = KA1_B5; //7
       break;
       case 0b01100100:
       key_return = KA2_B3; //6
       break;
       case 0b01010100:
       key_return = KA2_B4; //5
    break;
      case 0b00110100:
       key_return = KA2_B5; //4   //4
       break;
       case 0b01101000:
       key_return = KA3_B3; // 3
       break;
       case 0b01011000:
       key_return = KA3_B4; // 2
       break;
      case 0b00111000:
       key_return = KA3_B5; // 1
       break;
      
     }
     key_state++;    // 转入等待按键释放状态
    }
    else
     {
      PORTA |= 0b00001110;
      key_state--;    // 两次列电平不同返回状态0,(消抖处理)
     }
    break;      
   case 2:          // 等待按键释放状态
    PORTA &= 0b11110001;   // 行线全部输出低电平
    PORTA &= 0b11110001;   // 行线全部输出低电平
    key_value_portb = PORTB;
    key_value_portb = PORTB;
    key_value_portb <<= 1;
    if ( (Key_mask & key_value_portb) == Key_mask)
    {key_state=0; PORTA |= 0b00001110;}// 列线全部为高电平返回状态0
    break;
  }
  return key_return;
}


这程序没调通,自己也看不出哪有问题!

相关帖子

沙发
hjs1618|  楼主 | 2013-5-3 08:50 | 只看该作者
没有人回复呀!

使用特权

评论回复
板凳
NE5532| | 2013-5-3 09:00 | 只看该作者
没有人会接“大单”,楼主要学会自己把程序分块来调,见侃单片机版面“程序调试黑宝书”

使用特权

评论回复
地板
hjs1618|  楼主 | 2013-5-3 15:44 | 只看该作者
没有人会接”大单“,俺自己接了!终于搞定了!

使用特权

评论回复
5
NE5532| | 2013-5-3 18:57 | 只看该作者
hjs1618 发表于 2013-5-3 15:44
没有人会接”大单“,俺自己接了!终于搞定了!

恭喜,好事。

使用特权

评论回复
6
dirtwillfly| | 2013-5-3 20:18 | 只看该作者
hjs1618 发表于 2013-5-3 15:44
没有人会接”大单“,俺自己接了!终于搞定了!

恭喜,问题解决了就好:lol

使用特权

评论回复
7
hjs1618|  楼主 | 2013-5-4 11:23 | 只看该作者
结贴,庆祝下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:单片机学习交流群:19131564  欢迎加入

13

主题

515

帖子

1

粉丝