七弦桐 发表于 2012-11-27 20:22:13

这个独立按键检测的程序怎么不行呢

本帖最后由 七弦桐 于 2012-11-28 13:48 编辑

程序:void keyscan(void)
{
    uchar temp;
    temp = P1IN;
    temp &= 0x0f;
   
    if(temp & 0x0f == 0x0e)
    {
      delay_ms(10);// 延时
      if(temp & 0x0f == 0x0e)
      {
            LCD_write_str(0,0,"l");// 液晶第一行第二个点阵显示l      
      }
    }
   
    if(temp & 0x0f == 0x0d)
    {
      delay_ms(10);// 延时
      if(temp & 0x0f == 0x0d)
      {
            LCD_write_str(1,0,"0");// 液晶第一行第二个点阵显示o      
      }
    }
   
    if(temp & 0x0f == 0x0b)
    {
      delay_ms(10);// 延时
      if(temp & 0x0f == 0x0b)
      {
            LCD_write_str(2,0,"v");// 液晶第一行第二个点阵显示v         
      }
    }
   
    if(temp & 0x0f == 0x07) // 检测到第一个按键按下
    {
      delay_ms(10);// 延时
      if(temp & 0x0f == 0x07)
      {
            LCD_write_str(3,0,"e"); // 液晶第一行第二个点阵显示e      
      }
    }
}试了好几个方法都没解决,有些郁闷,求解。。。
按键电路:



我的程序思路就是不断的检测P1低四位是否变成低电平

tns9728 发表于 2012-11-28 00:51:11

甚么型号的片子?P1初始化正确没有?

qiuchen 发表于 2012-11-28 09:05:19

P1IN & 0x0f
这句话之后,高四位就永远是0了。

sunliezhi 发表于 2012-11-28 09:15:25

if(P1IN & 0x0f== 0xfe)第一个错误,正如qiuchen所说。

      delay_ms(10);// 延时
      if(temp == 0xfd)      此处不妥, 应该和上面一样在延时之后要重读P1IN出来比较;0xfd错误同上。

daicp 发表于 2012-11-28 09:21:20

这年头还有用硬延时的?

用定时中断检测吧

七弦桐 发表于 2012-11-28 12:23:55

tns9728 发表于 2012-11-28 00:51 static/image/common/back.gif
甚么型号的片子?P1初始化正确没有?

绝对正确啊

七弦桐 发表于 2012-11-28 13:21:17

sunliezhi 发表于 2012-11-28 09:15 static/image/common/back.gif
if(P1IN & 0x0f== 0xfe)第一个错误,正如qiuchen所说。

      delay_ms(10);// 延时


改了代码了 程序还是不行啊有些郁闷啊   用51写的时候也没有遇到过问题。。。

qiuchen 发表于 2012-11-28 13:32:12

把新程序贴上来,然后说的稍微详细一点,看看能不能帮到你

七弦桐 发表于 2012-11-28 13:49:26

qiuchen 发表于 2012-11-28 13:32 static/image/common/back.gif
把新程序贴上来,然后说的稍微详细一点,看看能不能帮到你

新程序,程序思路和电路图都更新了{:smile:}

qiuchen 发表于 2012-11-28 13:56:19

七弦桐 发表于 2012-11-28 13:49 static/image/common/back.gif
新程序,程序思路和电路图都更新了

改了之后是什么现象呢?连仿真器仿真了吗?

七弦桐 发表于 2012-11-28 14:31:39

qiuchen 发表于 2012-11-28 13:56 static/image/common/back.gif
改了之后是什么现象呢?连仿真器仿真了吗?

改了之后还是不行的
液晶不能显示字符
但是下面的代码就能成功uchar key_check;
uchar key_checkin;
key_checkin=P1IN;                  //读取IO口状态,判断是否有键按下
key_checkin&= 0x0F;                          //读取IO口状态,判断是否有键按下
if(key_checkin!=0x0F)                    //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                          //键盘消抖,延时20MS
      key_checkin=P1IN;
      if(key_checkin!=0x0F)//---------------------------------------------------------
      {
          key_check=P1IN;
          switch (key_check & 0x0F)
            {
            case 0x0E:LCD_write_str(0,0,"l");break;
            case 0x0D:LCD_write_str(1,0,"0");break;
            case 0x0B:LCD_write_str(2,0,"v");break;
            case 0x07:LCD_write_str(3,0,"e");break;
            }
         
      }
      
   }

qiuchen 发表于 2012-11-28 14:35:47

七弦桐 发表于 2012-11-28 14:31 static/image/common/back.gif
改了之后还是不行的
液晶不能显示字符
但是下面的代码就能成功

你对照一下把,你的程序问题。

嘿嘿嘿1235 发表于 2012-11-28 17:57:35

扫描方法要一直循环检测的,有没有放在while(1)里面呢?我建议不妨用中断检测按键试试,比较方便
#pragma vector= PORT1_VECTOR
__interrupt void P1(void)
{
if (P1IFG&BIT0)//按键K0P1.0
{
    。。。。
    P1IFG &=~BIT0;//清除中断标志位
}
if (P1IFG&BIT1)//按键K1P1.1
{
    。。。。
    P1IFG &=~BIT1;//清除中断标志位
}
if (P1IFG&BIT2)//按键K2P1.2
{
   。。。。
    P1IFG &=~BIT2;   //清除中断标志位
}
if (P1IFG&BIT3)//按键K3P1.3
{
    。。。。
    P1IFG &=~BIT3;   //清除中断标志位
}
}

void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;//关狗
P1DIR &=~(BIT0+BIT1+BIT2+BIT3);//输入
P1IE |=BIT0+BIT1+BIT2+BIT3;//中断使能
P1IES=BIT0+BIT1+BIT2+BIT3;//中断边沿选择,下降沿
P1IFG &=~BIT0+BIT1+BIT2+BIT3;//中断标志 清零
_EINT();
while(1)
   {
    }
}

七弦桐 发表于 2012-11-28 18:46:10

嘿嘿嘿1235 发表于 2012-11-28 17:57 static/image/common/back.gif
扫描方法要一直循环检测的,有没有放在while(1)里面呢?我建议不妨用中断检测按键试试,比较方便
#pragma ...

恩我在主函数里面循环检测了呀
改天用中断谢谢试试这样还不占用CPU 挺不错的
页: [1]
查看完整版本: 这个独立按键检测的程序怎么不行呢