微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 向高手求助

向高手求助

时间:10-02 整理:3721RD 点击:
u8 Key_Down()//判断有无键按下
{
    u8 key_num,scan_code;
    scan_code = 0xC7;
    PORTB = scan_code;//逐行扫描的行全部为零,列全部为1,高2位与键盘无关,全为1
    key_num = PORTB;
    if((key_num&0x07)!=0x07)
    {
        key_down_state=1;
        if(key_down_time)//消抖
        {
           key_down_time=0;
           key_num = PORTB;
           if((key_num&0x07)!=0x07) return 1;
           else return 0;
        }
        else return 0;
     // return 1;   
    }
    else
    {
        return 0;
    }
   
}
u8 Scan_Key_Down()
{
    u8 i,scan_code,key_num;
    //scan_code = 0xf7; //逐行扫描的第一行清零
    //if(Key_Down())
    //{
        scan_code = 0xf7; //逐行扫描的第一行清零
        for(i=0;i<3;i++)
        {
           PORTB = scan_code;//逐行扫描的扫描码
           key_num = PORTB;
           if((key_num&0x07)!=0x07)
           {
               break;
           }
           scan_code=(scan_code<<1)|0x0f;
        }
       // key_num=~key_num;
        //return key_num;
    //}
    return key_num;
}
u8  Key_Manage(u8 key_code)
{
    u8 key_value;
     //while(Key_Down());//等待按键释放
      //{   
        switch(key_code)
        {
             case 0xf6://第一行第一列1111 0 110
                 key_value &= 0x00;
                 key_value |= 0x01;
                 break;
             case 0xf5://第一行第二列  1111 0 101
                 key_value &= 0x00;
                 key_value |= 0x02;
                 break;
             case 0xf3: //第一行第三列1111 0 011
                 key_value &= 0x00;
                 key_value |= 0x03;
                 break;
             case 0xee://第二行第一列 1110 1 110
                 key_value &= 0x00;
                 key_value |= 0x04;
                 break;
             case 0xed://第二行第二列   1110 1 101
                key_value &= 0x00;
                key_value |= 0x05;
                break;
             case 0xeb: //第二行第三列   1110 1 011
                 key_value &= 0x00;
                 key_value |= 0x06;
                 break;
             case 0xde://第三行第一列    1101 1 110
                 key_value &= 0x00;
                 key_value |= 0x07;
                 break;
             case 0xdd: //第三行第二列   1101 1 101
                 key_value &= 0x00;
                 key_value |= 0x08;
                 break;
             case 0xdb: //第三行第三列   1101 1 011
                 key_value &= 0x00;
                 key_value |= 0x09;
                 break;
           default:  key_value &= 0x00;   
        }
     //}
     return key_value;
}
u8 Scan_Key()
{
    u8 Key_Code;
    static u8 key_value;
    if(Key_Down())
    {
        Key_Code = Scan_Key_Down();
        while(Key_Down());
        key_value = Key_Manage(Key_Code);   
    }
    return key_value;
   
}
定时中断里面
  if(key_down_state)
       {
           key_down_count++;
           if(key_down_count>10)
           {
               
               key_down_count=0;
               key_down_state=0;
               key_down_time=1;
           }
                  
       }

主函数里面
  while(1)
    {
        Key_Value=Scan_Key();
        Seg_Display(2,(Key_Value/16)); //显示十位数
        Seg_Display(3,(Key_Value%16)); //显示个位数
}
上面的程序运行之后,是可以显示出键值,但是并不是每次弹起后显示的都是按键的键值,有时候会出现显示的00的情况
每个按键都是这样的情况

666666666666666666666666666

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top