可有人有兴趣帮忙写个程序??显示和按键复用的,我写二天没写出来!

2020-01-26 13:00发布

就二数码管+5个按键,按键复用段位

下面是protues
点击此处下载 ourdev_581898BCZ6IK.rar(文件大小:16K) (原文件名:单.rar)


/***********************************************************************
* 函数名称: GetKeyCode()
* 函数功能: 获得按键物理编码
        1列8行
**********************************************************************
unsigned char GetKeyCode(void)
{
        static unsigned char key_state, key_value, key_line;
    unsigned char key_return = 0;
        unsigned char i;
        unsigned char Key_temp=0;
        switch (key_state)
        {
                case 0:                                                                                //初始状态
                        key_line = 0x01;
                        for (i=0; i<8; i++)                                                // 扫描键盘
                        {       
                                P1=key_line;                                                // 输出行线电平                               
                    key_value = Key;                                        // 读列电平,
                                if (key_value == 0)                                        // 低电平.无键按下
                                {
                                        key_line <<= 1;                                        // 没有按键,继续扫描下一位
                                }       
                                else                                                                // 有按键,停止扫描,转消抖确认状态
                                {
                                        key_state=1;                                                                               
                                        break;                                                        //退出for循环
                                }
                        }
                        break;

                case 1:
                         P1=key_line;                                                        //将上次的值再次赋给P1口,再次检测Key
                         Key_temp=Key;                                                        //再次读列电平
                          if (key_value == Key_temp )                        //与状态0的相同,确认按键
                         {
                                switch (key_line)                                        // 键盘编码,返回编码值
                                {                                                       
                                        case 0x02:        key_return = KEY_1;        break;
                                        case 0x01:        key_return = KEY_2;        break;
                                        case 0X80:        key_return = KEY_3;        break;
                                        case 0X20:        key_return = KEY_4;        break;
                                        case 0X40:        key_return = KEY_5;        break;
                                        default         :        key_return = NO_KEY;break;
                                }
                                key_state++;                                // 转入等待按键释放状态
                        }
                        else        key_state=0;                        // 两次列电平不同返回状态0,(消抖处理)                                               
                        break;       
                                       
                case 2:                                                                // 等待按键释放状态       
                        if ( Key== 0)        key_state=0;
                        break;
        }
        return key_return;
}

按键检测部分,始终不行!~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
liaowei
2020-01-27 02:55
建议你就用这个,这个代码很好的,把它调试出来,以后按键就采用此方法

要学会一些调试的方法,单片机代码没有什么printf语句,但你也可以跟踪代码的执行。
假设你没有任何的仿真工具,你也可以设计一些跟踪点

case 1:
  
//在这里放一个点亮LED的语句, 如果这里都不进,那你再忙都没用

P1=key_line; //将上次的值再次赋给P1口,再次检测Key
Key_temp=Key; //再次读列电平
   if (key_value == Key_temp ) //与状态0的相同,确认按键
{
  //在这里放一个点亮另一LED的语句,如果执行到这里,那么说明是查表的问题

switch (key_line) // 键盘编码,返回编码值  
{
case 0x02: key_return = KEY_1; break;
case 0x01: key_return = KEY_2; break;
  case 0X80: key_return = KEY_3; break;
  case 0X20: key_return = KEY_4; break;
  case 0X40: key_return = KEY_5; break;
default  : key_return = NO_KEY;break;
}
key_state++; // 转入等待按键释放状态
}
else key_state=0; // 两次列电平不同返回状态0,(消抖处理)
break;


其他的地方你要放哪就放哪,只要能发现问题
不知道你明白我的意思没

一周热门 更多>