搜索
bottom↓
回复: 13

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

[复制链接]

出0入0汤圆

发表于 2012-11-27 20:22:13 | 显示全部楼层 |阅读模式
本帖最后由 七弦桐 于 2012-11-28 13:48 编辑

程序:
  1. void keyscan(void)
  2. {
  3.     uchar temp;
  4.     temp = P1IN;
  5.     temp &= 0x0f;
  6.    
  7.     if(temp & 0x0f == 0x0e)
  8.     {
  9.         delay_ms(10);// 延时
  10.         if(temp & 0x0f == 0x0e)
  11.         {
  12.             LCD_write_str(0,0,"l");// 液晶第一行第二个点阵显示l        
  13.         }
  14.     }
  15.    
  16.     if(temp & 0x0f == 0x0d)
  17.     {
  18.         delay_ms(10);// 延时
  19.         if(temp & 0x0f == 0x0d)
  20.         {
  21.             LCD_write_str(1,0,"0");// 液晶第一行第二个点阵显示o      
  22.         }
  23.     }
  24.    
  25.     if(temp & 0x0f == 0x0b)
  26.     {
  27.         delay_ms(10);// 延时
  28.         if(temp & 0x0f == 0x0b)
  29.         {
  30.             LCD_write_str(2,0,"v");// 液晶第一行第二个点阵显示v         
  31.         }
  32.     }
  33.    
  34.     if(temp & 0x0f == 0x07) // 检测到第一个按键按下
  35.     {
  36.         delay_ms(10);// 延时
  37.         if(temp & 0x0f == 0x07)
  38.         {
  39.             LCD_write_str(3,0,"e"); // 液晶第一行第二个点阵显示e      
  40.         }
  41.     }
  42. }
复制代码
试了好几个方法都没解决,有些郁闷,求解。。。
按键电路:



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-28 00:51:11 | 显示全部楼层
甚么型号的片子?P1初始化正确没有?

出0入0汤圆

发表于 2012-11-28 09:05:19 | 显示全部楼层
P1IN & 0x0f
这句话之后,高四位就永远是0了。

出0入4汤圆

发表于 2012-11-28 09:15:25 | 显示全部楼层
if(P1IN & 0x0f== 0xfe)第一个错误,正如qiuchen所说。

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

出0入0汤圆

发表于 2012-11-28 09:21:20 | 显示全部楼层
这年头还有用硬延时的?

用定时中断检测吧

出0入0汤圆

 楼主| 发表于 2012-11-28 12:23:55 | 显示全部楼层
tns9728 发表于 2012-11-28 00:51
甚么型号的片子?P1初始化正确没有?

绝对正确啊

出0入0汤圆

 楼主| 发表于 2012-11-28 13:21:17 | 显示全部楼层
sunliezhi 发表于 2012-11-28 09:15
if(P1IN & 0x0f== 0xfe)第一个错误,正如qiuchen所说。

        delay_ms(10);// 延时

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

出0入0汤圆

发表于 2012-11-28 13:32:12 | 显示全部楼层
把新程序贴上来,然后说的稍微详细一点,看看能不能帮到你

出0入0汤圆

 楼主| 发表于 2012-11-28 13:49:26 | 显示全部楼层
qiuchen 发表于 2012-11-28 13:32
把新程序贴上来,然后说的稍微详细一点,看看能不能帮到你

新程序,程序思路和电路图都更新了  

出0入0汤圆

发表于 2012-11-28 13:56:19 | 显示全部楼层
七弦桐 发表于 2012-11-28 13:49
新程序,程序思路和电路图都更新了

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

出0入0汤圆

 楼主| 发表于 2012-11-28 14:31:39 | 显示全部楼层
qiuchen 发表于 2012-11-28 13:56
改了之后是什么现象呢?连仿真器仿真了吗?

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

出0入0汤圆

发表于 2012-11-28 14:35:47 | 显示全部楼层
七弦桐 发表于 2012-11-28 14:31
改了之后还是不行的
液晶不能显示字符
但是下面的代码就能成功

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

出0入0汤圆

发表于 2012-11-28 17:57:35 | 显示全部楼层
扫描方法要一直循环检测的,有没有放在while(1)里面呢?我建议不妨用中断检测按键试试,比较方便
#pragma vector= PORT1_VECTOR
__interrupt void P1(void)
{
  if (P1IFG&BIT0)//按键K0  P1.0
  {
    。。。。
    P1IFG &=~BIT0;  //清除中断标志位
  }
  if (P1IFG&BIT1)//按键K1  P1.1
  {
    。。。。
    P1IFG &=~BIT1;  //清除中断标志位
  }
  if (P1IFG&BIT2)//按键K2  P1.2
  {
   。。。。
    P1IFG &=~BIT2;   //清除中断标志位
  }
  if (P1IFG&BIT3)//按键K3  P1.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)
   {
    }
}

出0入0汤圆

 楼主| 发表于 2012-11-28 18:46:10 | 显示全部楼层
嘿嘿嘿1235 发表于 2012-11-28 17:57
扫描方法要一直循环检测的,有没有放在while(1)里面呢?我建议不妨用中断检测按键试试,比较方便
#pragma ...

恩  我在主函数里面循环检测了呀  
改天用中断谢谢试试  这样还不占用CPU 挺不错的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 08:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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