c51小问题请教

[复制链接]
3106|15
 楼主| juelang 发表于 2010-4-12 22:22 | 显示全部楼层 |阅读模式
下面是我做的一个小程序
#include <reg52.h>
typedef unsigned char uchar;
int n=5000;
/******延时5ms,主要用于消除抖动******/
void xiaodou()
{
uchar i,j;
for(i=0;i<5;i++)
for(j=0;j<125;j++)
;
}
void mian()
{
xiaodou();
if(P1!=0xff)//P1口接一个按键再接地
{
  P2=0X00;
  while(n--);
}
}

电路接法很简单,就是P1口有接按键,然后接地,
我这个程序的目的是当P1口有按键按下时,
给P2口全部赋值为低电平,
可是当我的P1口按键按下时P2口却没有反应,这是
为什么呢,麻烦高手指点下
zdhlixiang2006 发表于 2010-4-12 22:25 | 显示全部楼层
:Lz你学过程序没?
 楼主| juelang 发表于 2010-4-12 23:21 | 显示全部楼层
学过,不过很菜,怎么了,到底是什么问题呀
xuyaqi 发表于 2010-4-13 07:08 | 显示全部楼层
本帖最后由 xuyaqi 于 2010-4-13 07:28 编辑

void mian()里应该有循环判断P1,否则只判断一次,只能按住键再开机才能实现功能。程序写得不规范,多看看别人写的例程。
chen3bing 发表于 2010-4-13 07:48 | 显示全部楼层
消抖以前也要判断。
cauhorse 发表于 2010-4-13 08:37 | 显示全部楼层
楼主,你的程序如不写成死循环的方式检测IO状态的话,是不能正常工作地。

  1. void main(void)
  2. {
  3.     //初始化代码若干
  4.    while(1)
  5.     {
  6.         //检测代码
  7.     }
  8. }
sytu_chyq 发表于 2010-4-13 11:10 | 显示全部楼层
这样可行不
void main()
{
uchar x;

while(1)
{
  if(P1!=0xff)//P1口接一个按键再接地
  {
   x = P1;
   xiaodou();
   if(P1 == x)
    P2=0X00;
  }
   while(n--);
}
}
mochou 发表于 2010-4-13 13:53 | 显示全部楼层
51单片机再研读研读。
ddtx 发表于 2010-4-13 13:56 | 显示全部楼层
没事,慢慢来,当年我也是这样来的。
ddtx 发表于 2010-4-13 13:58 | 显示全部楼层
一个是主循环,另外一个是消抖应该是读出端口以后消抖再读端口,如果端口没有改变则说明确定按键存在,如果第二次不存在了,就说明按键没有按下。
 楼主| juelang 发表于 2010-4-13 15:51 | 显示全部楼层
谢谢大家这样热心,问题解决了,呵呵
fangyan2010 发表于 2010-4-13 16:58 | 显示全部楼层
楼上几位大侠说得很对,消抖一定要做两次按键确认,主函数中应有循环。我也在这里学习了。谢谢
有意思 发表于 2010-4-13 22:58 | 显示全部楼层
延时5ms达不到消抖的目的,尤其是在EMC中大量存在尖峰脉冲时,给你个思路

  1. #define KEY_TIME  10
  2. unsigned char key_num =0;//键值
  3. void keyscan(void)
  4. {
  5.     static unsigned char key[6]={0,0,0,0,0,0};//假设有6个按键
  6.     if (KEY1STAT() == 0) {//0表示有键按下
  7.         key[0]++;
  8.         if (key[0] >= KEY_TIME) {
  9.             key[0] = KEY_TIME;
  10.         }
  11.         return;
  12.     } else {
  13.         if (key[0] >= KEY_TIME) {
  14.             key_num = 1;//键值
  15.         }
  16.         key[0] = 0;
  17.     }
  18.     //1,2,3,4。。。依次类推
  19. }
  20. 基本思路是:连续判断按键状态,有键按下count++,无键count=0(或者--,这样可以消除误弹起),当count加到KEY_TIME时,说明有键按下,
  21. 可以使用10ms中断调用scan函数,通常手动按键的时间约为200ms,可根据灵敏度调节KEY_TIME的值







ddtx 发表于 2010-4-14 10:42 | 显示全部楼层
一般按键的消抖延时都在10MS以上,短了基本没用
qq8682 发表于 2010-4-14 14:58 | 显示全部楼层
一次性的!
 楼主| juelang 发表于 2010-4-24 09:44 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部