| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6501 人关注过本帖
标题:请高手帮忙修改单片机加减计数器程序
只看楼主 加入收藏
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
帖子已经改过了,重新拷一下
2017-04-28 11:41
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
编译通过了,
现在的结果是这样显示
图片附件: 游客没有浏览图片的权限,请 登录注册
十位,百位和千位隐隐约约有笔画在闪动
按K1,K2或者K5的时候这样显示
图片附件: 游客没有浏览图片的权限,请 登录注册

放开按键恢复个位显示
2017-04-28 11:47
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
试试看,还不行我也没办法了。另外按键按下去要释放,不要按住不放。
程序代码:
#include<reg52.h>


#define uchar unsigned char
#define uint unsigned int

//=======================================================================
void sendbyte(uint Num);

 void delay( int ms);

 //=======================================================================
 unsigned char code LED_table[]={       //使用附带“51单片机工具箱”可以很容易编码
 0x3f,                             //"0"
 0x06,                             //"1"
 0x5b,                             //"2"            AAAA
 0x4f,                             //"3"           F    B
 0x66,                             //"4"           F    B
 0x6d,                             //"5"            GGGG
 0x7d,                             //"6"           E    C
 0x07,                             //"7"           E    C
 0x7f,                             //"8"            DDDD    H
 0x6f,                             //"9"
 0x00,                             //black
 0x80                             //dot
 };

#define black 10                // 空白
#define dot   11                // 小数点

//                   定义通信端口
//===========================================================================
 sbit COM3=P1^0;

 sbit COM2=P1^6;                //对应口线由硬件确定
 sbit COM1=P1^5;

 sbit COM0=P1^4;

 //===========================================================================


 sbit k1=P1^1;//定义加加
 sbit k2=P3^4;//定义减减
 sbit k3=P3^5;//定义设置
 sbit k4=P1^2;//定义设置
 sbit k5=P1^3;//定义清零
 sbit CLK=P3^0;//164模拟时钟端
 sbit DAT=P3^1;//164模拟数据端
 uint z = 0;

 
void delay(uint t)//延时函数
{
      uint x,y;
      for(x=t;x>0;x--)
      for(y=120;y>0;y--);
}

 
void sendbyte(uint b)//传送显示字节函数
{
      uchar num,c;
    COM0 = COM1 =COM2 = COM3 = 1;    //熄灭数码管

    COM3 = 0;
      num=LED_table[b%10];//个位
      for(c=0;c<8;c++)//依次传送8位
    {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
    }

    COM3 = 1;
     delay(30);
    COM2 = 0;
      num=LED_table[b%100/10];//十位
      for(c=0;c<8;c++)//依次传送8位
    {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
   }
    COM2 = 1;
     delay(30);
    COM1 = 0;
   num=LED_table[b%1000/100] | 0x20;//百位,加上小数点
   for(c=0;c<8;c++)//依次传送8位
   {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
   }
   COM1 = 1;
     delay(30);
   COM0 = 0;
   num=LED_table[b/1000];//千位
   for(c=0;c<8;c++)//依次传送8位
   {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
   }
   COM0 = 1;
}    


 void key()

 {
  if(k1==0)
  {
      delay(3);
      if(k1==0)
       {
           //TR0=0;
           z++;
           if(z==10000)
            z=0;
           //sendbyte(z);
       }
      while(!k1);//放开按钮
    }
  if(k2==0)
  {
      delay(3);
      if(k2==0)
       {
           //TR0=1;
           z--;
           if(z<0)
            z=0;
           //sendbyte(z);
       }
      while(!k2);//放开按钮
  }
  if(k5==0)
  {
      delay(3);
      if(k5==0)
       {
           //TR0=1;
           z=0;
           //sendbyte(z);
       }
      while(!k5);//放开按钮
  }
  sendbyte(z);
  delay(10);

 }

 void main()

 {
      TMOD=0X01;//定时器0定时方式1
      TH0=0XD8;//晶振12MHZ,定时10ms
      TL0=0XF0;
      EA=1;
      ET0=1;
      TR0=1;
      COM0 = COM1 =COM2 = COM3 = 0;    //点亮数码管
      sendbyte(0);
      while(1)
      key();
   

 }

 void time()interrupt 1//定时器中断
 {
      uint count;
      TH0=0XD8;
      TL0=0XF0;
      count++;
      if(count==100)//10毫秒X100=1秒
      {
       count=0;
       #if 0    //计时功能,不用
       z++;
       if(z==10000)
       {
       z=0;
       }
       sendbyte(z);//刷新显示
       #endif
      } 

 }

2017-04-28 11:53
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
现在不显示了,只是每过10秒钟在某位数字上很快的闪一下笔画,两笔,好像没规律

不管怎么说,非常感谢你!!浪费了这么多时间,非常的感谢!!!!
2017-04-28 12:06
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
我改了一下电路(尽管和实物不一样)
图片附件: 游客没有浏览图片的权限,请 登录注册

用23楼的代码,改COM3=0  ,现在能在个位上正确显示0--9的变动了,十位,百位和千位都没显示
2017-04-28 13:19
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
嗯,这就是我说的你连线乱的原因,现在a-g的连线就正常了。
好多年没碰数码管了,忘了数码管怎么显示四位了,不好意思。
2017-04-28 13:40
快速回复:请高手帮忙修改单片机加减计数器程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019698 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved