搜索
bottom↓
回复: 15

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

[复制链接]

出0入0汤圆

发表于 2013-2-27 15:41:52 | 显示全部楼层 |阅读模式
我想用按键控制7段数码管的两位数计数 按一次计数加1 现在 我已经程序写好了 可是就是个位的数码管老是闪烁 能不能消除
这是程序
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint  unsigned 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[shuzi%10];       
                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[shuzi/10];       
                wr=0;
                cs1=0;
                wr=1;
                cs1=1;
                delay(2);               
                 
}

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

   }
}

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

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

出0入0汤圆

 楼主| 发表于 2013-2-27 15:43:08 | 显示全部楼层
补充一下 按键按着的时候不计数 松开才加1 可是按住的时候数码管就闪烁

出0入0汤圆

发表于 2013-2-27 15:44:19 | 显示全部楼层
时间间隔问题,缩短显示之前的时间

出0入0汤圆

发表于 2013-2-27 15:46:02 | 显示全部楼层
你不停的刷新,当然狂闪了。或者是接近全亮。
如果是不是真正的产品的话,在display调用加个延时。

出0入0汤圆

 楼主| 发表于 2013-2-27 15:46:17 | 显示全部楼层
你是说加延时吗

出0入0汤圆

 楼主| 发表于 2013-2-27 15:47:05 | 显示全部楼层
sleet1986 发表于 2013-2-27 15:44
时间间隔问题,缩短显示之前的时间

你是说加延时吗

出0入0汤圆

发表于 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); 注释掉

出0入0汤圆

发表于 2013-2-27 15:51:59 | 显示全部楼层
ABC8636694 发表于 2013-2-27 15:47
你是说加延时吗

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

出0入0汤圆

发表于 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;
}

出0入0汤圆

 楼主| 发表于 2013-2-27 16:01:07 | 显示全部楼层
lcw_swust 发表于 2013-2-27 15:52
jianpan占用时间太长
void jianpan(void)
{

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

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

出0入0汤圆

 楼主| 发表于 2013-2-27 16:02:50 | 显示全部楼层
lcw_swust 发表于 2013-2-27 15:52
jianpan占用时间太长
void jianpan(void)
{

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

出0入0汤圆

发表于 2013-2-27 16:04:48 | 显示全部楼层
ABC8636694 发表于 2013-2-27 16:01
void jianpan(void)
{
char anjian1;

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

出0入0汤圆

发表于 2013-2-27 16:08:51 | 显示全部楼层
ABC8636694 发表于 2013-2-27 16:02
还有 你这样改 有时按住的时候会连续跳几个数 不是原来的按住 起来的时候加1 ...

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

出0入442汤圆

发表于 2013-2-27 18:45:34 | 显示全部楼层
毛,用一个很长的函数运行,不要加循环延时,用循环标志来控制延时。否则你这延一点那延一点,还怎么能运行?

出0入0汤圆

发表于 2013-2-27 20:05:17 | 显示全部楼层
用定时器去调用显示
那样感觉会好恨多

出0入0汤圆

发表于 2013-2-27 20:14:17 | 显示全部楼层
建议看看手把手教单片机的书
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 18:21

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

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