找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2340|回复: 0
打印 上一主题 下一主题
收起左侧

请大家指点下为什么*pkeyvalue=temp;这个值不是随着case变化的

[复制链接]
跳转到指定楼层
楼主
ID:89372 发表于 2015-9-4 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uint unsigned int
typedef unsigned char uchar8;
//¸ù¾Yó2¼t°′¼ü°′ÏÂËù¶Ôó|μÄÖ
#define key_value_1 0xe0
#define key_value_2 0xd0
#define key_value_3 0xb0
#define key_value_4 0x70
#define key_null 0xf0
//¶¨òå°′¼ü°′ÏÂμÄ·μ»ØÖμ
#define key_down 0x08
#define key_long 0x04
#define key_continue 0x02
#define key_up 0x01
//¶¨òå°′¼ü3¤°′£¬¶ì°′
#define key_long_num 200
#define key_continue_num 50
//¶¨òå°′¼üμÄ×′ì¬
#define key_state_init 0  //3õê¼×′ì¬
#define key_state_wobble 1 //Ïû¶¶
#define key_state_press 2 //¶ì°′
#define key_state_long 3 //3¤°′
#define key_state_continue 4 //ᬷ¢
#define key_state_release 5//°′¼üêí·Å
bit timecount=0;//½øèëÖD¶Ï±ê־λ
//¶¨òå°′¼üμÄIO¿ú
sbit key_1=P1^4;
sbit key_2=P1^5;
sbit key_3=P1^6;                  
sbit key_4=P1^7;
//uchar8 count=0;
void ys1ms(uint z)
{
  uchar8 y;
  while(z--)
    {
          for(y=0;y<115;y++)
          {
            ;
          }
        }
}
//éèÖÃÕaËĸöIO¿úÎa¶á×′ì¬
void key_csh(void)
{
  key_1=1;
  key_2=1;
  key_3=1;
  key_4=1;
}
//»ñè¡°′¼üÖμ
static uchar8 getkey_num(void)
{
  if(key_1==0) return key_value_1;
  if(key_2==0) return key_value_2;
  if(key_3==0) return key_value_3;
  if(key_4==0) return key_value_4;
  return key_null;
}
//°′¼üé¨Ãæ3ìDò
void  key_scan(uint *pkeyvalue)
{
  uint   temp=key_null;
  static uint keystate=key_state_init;
  static uint keytimecount=0;
  static uint keylastnum=key_null;//±£′æ°′¼üêí·ÅμÄÖμ
  temp=getkey_num();
  switch(keystate)
    {
   case key_state_init:
   {

     if(temp!=key_null)
           {
              keystate=key_state_wobble;
       
           }
   }
           break;
        case key_state_wobble:
              keystate=key_state_press;
           break;
        case key_state_press:
        {
             if(temp!=key_null)
                   {
                     keylastnum=temp;//±£′æ°′¼üÖ죬òÔ±ãÔúêí·Å°′¼üêÇ·μ»Ø°′¼üÖμ
                         temp|=key_down;//¼Ç¼°′¼ü°′ÏÂ
                                
                         keystate=key_state_long;
                         
                   }
                   else
                   {
                     keystate=key_state_init;//′Ëê±Ã»óD°′¼ü°′Ͼí·μ»Øμ½3õê¼×′ì¬
                   }
                 
        }
          break;
        case key_state_long:
        {
            if(temp!=key_null)//Ôù′ÎÅD¶Ï°′¼üêÇ·ñ»1′|óú°′ÏÂ×′ì¬
                   {
                      if(timecount==1)
                          {          
                            timecount=0;
                     if(++keytimecount>key_long_num)
                           {
                             keytimecount=0;
                                 temp|=key_long;//3¤°′°′¼üê¼tòÑ·¢éú
                                 keystate=key_state_continue;//½øèëᬷ¢×′ì¬

                           }
                           }
                   }
                 else
                 {
                   keystate=key_state_release;
                 }
     }
                        
           break;
    case key_state_continue:
        {
            if(temp!=key_null)
                   {
                        if(timecount==1)
                                {
                            if(++keytimecount>key_continue_num)
                           {
                                 keytimecount=0;
                                 temp|=key_continue;
                           }
                           }
                   }
                   else
                   {
                              keystate=key_state_release;
                   }
        }
           break;
        case key_state_release:
        {
          keylastnum|=key_up;
                temp=keylastnum;
                keystate=key_state_init;
        }
                break;
                default:
                break;
                }
         *pkeyvalue=temp;
                //P0=*pkeyvalue;
}
void main()
{
  uint keyvalue=key_null;
  IE=0x82;//¿a¶¨ê±Æ÷ÖD¶Ïóë×üÖD¶Ï
  TMOD=0x01;//éèÖö¨ê±Æ÷Îa·½ê½1
  TH0=0xee;
  TL0=0x00;
  TR0=1;//¿aÆô¶¨ê±Æ÷
  while(1)
  {
  key_scan(&keyvalue);
  P0=keyvalue;
  //if(keyvalue == (key_value_1 | key_down)) P0 = 0xff ;
  //else
  //P0=0XFE;
  /*if(keyvalue == (key_value_1 | key_long)) P0 = 0x00 ;
  if(keyvalue == (key_value_1 | key_continue)) { P0 ^= 0xf0;}
  if(keyvalue == (key_value_1 | key_up)) P0 = 0xa5 ;*/
  }
}
void time0_int() interrupt 1
{
  TH0=0xee;

  TL0=0x00;
  timecount=1;
}
这是源码,在每个case中我用P0=temp调试看到结果跟case中的temp值是一样的,为什么出了switch,将*pkeyvalue=temp;就不对了。我按了按键就等于0x0f或上我按下按键的那个值,搞得我现在好郁闷的。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表