打印

c51小问题请教

[复制链接]
2006|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,否则只判断一次,只能按住键再开机才能实现功能。程序写得不规范,多看看别人写的例程。

使用特权

评论回复
5
chen3bing| | 2010-4-13 07:48 | 只看该作者
消抖以前也要判断。

使用特权

评论回复
6
cauhorse| | 2010-4-13 08:37 | 只看该作者
楼主,你的程序如不写成死循环的方式检测IO状态的话,是不能正常工作地。

void main(void)
{
    //初始化代码若干
   while(1)
    {
        //检测代码
    }
}

使用特权

评论回复
7
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--);
}
}

使用特权

评论回复
8
mochou| | 2010-4-13 13:53 | 只看该作者
51单片机再研读研读。

使用特权

评论回复
9
ddtx| | 2010-4-13 13:56 | 只看该作者
没事,慢慢来,当年我也是这样来的。

使用特权

评论回复
10
ddtx| | 2010-4-13 13:58 | 只看该作者
一个是主循环,另外一个是消抖应该是读出端口以后消抖再读端口,如果端口没有改变则说明确定按键存在,如果第二次不存在了,就说明按键没有按下。

使用特权

评论回复
11
juelang|  楼主 | 2010-4-13 15:51 | 只看该作者
谢谢大家这样热心,问题解决了,呵呵

使用特权

评论回复
12
fangyan2010| | 2010-4-13 16:58 | 只看该作者
楼上几位大侠说得很对,消抖一定要做两次按键确认,主函数中应有循环。我也在这里学习了。谢谢

使用特权

评论回复
13
有意思| | 2010-4-13 22:58 | 只看该作者
延时5ms达不到消抖的目的,尤其是在EMC中大量存在尖峰脉冲时,给你个思路
 
#define KEY_TIME  10
unsigned char key_num =0;//键值
void keyscan(void)
{
    static unsigned char key[6]={0,0,0,0,0,0};//假设有6个按键
    if (KEY1STAT() == 0) {//0表示有键按下
        key[0]++;
        if (key[0] >= KEY_TIME) {
            key[0] = KEY_TIME;
        }
        return;
    } else {
        if (key[0] >= KEY_TIME) {
            key_num = 1;//键值
        }
        key[0] = 0;
    }
    //1,2,3,4。。。依次类推
}
基本思路是:连续判断按键状态,有键按下count++,无键count=0(或者--,这样可以消除误弹起),当count加到KEY_TIME时,说明有键按下,
可以使用10ms中断调用scan函数,通常手动按键的时间约为200ms,可根据灵敏度调节KEY_TIME的值







使用特权

评论回复
14
ddtx| | 2010-4-14 10:42 | 只看该作者
一般按键的消抖延时都在10MS以上,短了基本没用

使用特权

评论回复
15
qq8682| | 2010-4-14 14:58 | 只看该作者
一次性的!

使用特权

评论回复
16
juelang|  楼主 | 2010-4-24 09:44 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

110

帖子

1

粉丝