ABC8636694 发表于 2013-2-27 15:41:52

大神们来看看数码管的程序那里错了

我想用按键控制7段数码管的两位数计数 按一次计数加1 现在 我已经程序写好了 可是就是个位的数码管老是闪烁 能不能消除
这是程序
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uintunsigned int
sbit cs1=P3^5;
sbit cs2=P3^6;
sbit wr=P3^7;
sbit anjian=P1^0;
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint shuzi;
void delay(uint s)
{
    uint j,z;
        for(j=s;j>0;j--)
        for(z=128;z>0;z--);
}
void display();
void jianpan();

void main()
{
   while(1)
       {
       jianpan();
       display();
       }
}
void display()
{
                //uint q;
                //unsigned char k;
                P2=0xfe;
                wr=0;
                cs2=0;
                wr=1;
                cs2=1;
                //k=_crol_(k,1);               
                P2=seg;       
                wr=0;
                cs1=0;
                wr=1;
                cs1=1;
                delay(2);
                P2=0xfd;
                wr=0;
                cs2=0;
                wr=1;
                cs2=1;
                //k=_crol_(k,1);               
                P2=seg;       
                wr=0;
                cs1=0;
                wr=1;
                cs1=1;
                delay(2);               
               
}

void jianpan()
{
   if(anjian==0)
   {
           delay(200);
        if(anjian==1)shuzi++;

   }
}

ABC8636694 发表于 2013-2-27 15:43:08

补充一下 按键按着的时候不计数 松开才加1 可是按住的时候数码管就闪烁

sleet1986 发表于 2013-2-27 15:44:19

时间间隔问题,缩短显示之前的时间

i_kkyu 发表于 2013-2-27 15:46:02

你不停的刷新,当然狂闪了。或者是接近全亮。
如果是不是真正的产品的话,在display调用加个延时。

ABC8636694 发表于 2013-2-27 15:46:17

你是说加延时吗

ABC8636694 发表于 2013-2-27 15:47:05

sleet1986 发表于 2013-2-27 15:44 static/image/common/back.gif
时间间隔问题,缩短显示之前的时间

你是说加延时吗

shower.xu 发表于 2013-2-27 15:49:19

本帖最后由 shower.xu 于 2013-2-27 15:50 编辑

void delay(uint s)
{
    uint j,z;
      for(j=s;j>0;j--)
      {
             for(z=100;z>0;z--);
            display();
          }
}

修改下试试

display()里的delay(2); 注释掉

sleet1986 发表于 2013-2-27 15:51:59

ABC8636694 发表于 2013-2-27 15:47 static/image/common/back.gif
你是说加延时吗

jianpan()里面的延时长了,可以修改按键函数,不采用这样的延时

lcw_swust 发表于 2013-2-27 15:52:43

jianpan占用时间太长
void jianpan(void)
{
char anjian1;
static char anjian0;
anjian1=anjian;
if((anjian1==0)&&(anjian0!=0))shuzi++;
anjian0=anjian1;
}

ABC8636694 发表于 2013-2-27 16:01:07

lcw_swust 发表于 2013-2-27 15:52 static/image/common/back.gif
jianpan占用时间太长
void jianpan(void)
{


void jianpan(void)
{
char anjian1;
static char anjian0;
anjian1=anjian;
if((anjian1==0)&&(anjian0!=0))shuzi++;
anjian0=anjian1;
}

这个能解释下吗 我试了 可以 不过我看起来好乱

ABC8636694 发表于 2013-2-27 16:02:50

lcw_swust 发表于 2013-2-27 15:52 static/image/common/back.gif
jianpan占用时间太长
void jianpan(void)
{


还有 你这样改 有时按住的时候会连续跳几个数 不是原来的按住 起来的时候加1

lcw_swust 发表于 2013-2-27 16:04:48

ABC8636694 发表于 2013-2-27 16:01 static/image/common/back.gif
void jianpan(void)
{
char anjian1;


anjian1表示当前键值
anjian0表示上一次的键值
if((anjian1==0)&&(anjian0!=0))就是指(当前键值为0且上一次的键值不为0)

lcw_swust 发表于 2013-2-27 16:08:51

ABC8636694 发表于 2013-2-27 16:02 static/image/common/back.gif
还有 你这样改 有时按住的时候会连续跳几个数 不是原来的按住 起来的时候加1 ...

这应该是按键的抖动造成的,在开关上并个小电容试试。
或者增加查询间隔,比如
char i;
while(1)
         {
         jianpan();
      for(i=0;i<10;i++) display();
         }
或者在按键函数内加入软件滤波

wye11083 发表于 2013-2-27 18:45:34

毛,用一个很长的函数运行,不要加循环延时,用循环标志来控制延时。否则你这延一点那延一点,还怎么能运行?

yklstudent 发表于 2013-2-27 20:05:17

用定时器去调用显示
那样感觉会好恨多

mimifu 发表于 2013-2-27 20:14:17

建议看看手把手教单片机的书
页: [1]
查看完整版本: 大神们来看看数码管的程序那里错了