这个独立按键检测的程序怎么不行呢
本帖最后由 七弦桐 于 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低四位是否变成低电平 甚么型号的片子?P1初始化正确没有? P1IN & 0x0f
这句话之后,高四位就永远是0了。 if(P1IN & 0x0f== 0xfe)第一个错误,正如qiuchen所说。
delay_ms(10);// 延时
if(temp == 0xfd) 此处不妥, 应该和上面一样在延时之后要重读P1IN出来比较;0xfd错误同上。 这年头还有用硬延时的?
用定时中断检测吧 tns9728 发表于 2012-11-28 00:51 static/image/common/back.gif
甚么型号的片子?P1初始化正确没有?
绝对正确啊 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 static/image/common/back.gif
把新程序贴上来,然后说的稍微详细一点,看看能不能帮到你
新程序,程序思路和电路图都更新了{:smile:} 七弦桐 发表于 2012-11-28 13:49 static/image/common/back.gif
新程序,程序思路和电路图都更新了
改了之后是什么现象呢?连仿真器仿真了吗? 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;
}
}
} 七弦桐 发表于 2012-11-28 14:31 static/image/common/back.gif
改了之后还是不行的
液晶不能显示字符
但是下面的代码就能成功
你对照一下把,你的程序问题。 扫描方法要一直循环检测的,有没有放在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)
{
}
} 嘿嘿嘿1235 发表于 2012-11-28 17:57 static/image/common/back.gif
扫描方法要一直循环检测的,有没有放在while(1)里面呢?我建议不妨用中断检测按键试试,比较方便
#pragma ...
恩我在主函数里面循环检测了呀
改天用中断谢谢试试这样还不占用CPU 挺不错的
页:
[1]