标题:
请大家指点下为什么*pkeyvalue=temp;这个值不是随着case变化的
[打印本页]
作者:
单小雨
时间:
2015-9-4 15:29
标题:
请大家指点下为什么*pkeyvalue=temp;这个值不是随着case变化的
#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或上我按下按键的那个值,搞得我现在好郁闷的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1