找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 211|回复: 5
收起左侧

各位大师麻烦帮忙看下这个计数器程序

[复制链接]
ID:352736 发表于 2024-10-16 18:18 | 显示全部楼层 |阅读模式
各位大师麻烦帮忙看下这个计数器程序,前段时间发了一个仿制本贴一位大师的程序但最大只能计数到999,经过本贴一些大师的指点修改程序使计数器能正常计数0-9999,再次感谢各位大师的指点!另把修改后的程序发出来再麻烦各位大师帮忙看下怎么修改下程序使数码管显示消除无效0,数码管是共阴的,现在一开机显示4个0,现在想改一下使前面的十,百,千位显示的无效0消除。
#include <STC15.h>

#define uchar unsigned char
#define uint unsigned int


sbit FMQ=P5^5;//蜂鸣器

sbit K1=P3^2; //按键加
sbit K2=P3^3; //按键减
sbit K3=P5^4; //复位

bit flag_KEY=0; //按键松开标志位

sbit DS1=P3^4;//数码管第1位
sbit DS2=P3^5;//数码管第2位
sbit DS3=P3^6;//数码管第3位
sbit DS4=P3^7;//数码管第4位

unsigned char ScanTime=1;

unsigned int Num=0;


//共阴数码管段码表,段接P1.0-1.6,位接P3.4-3.7
unsigned char code SEG_Tab[]={      
        0x3F,/*0*/
        0x06,/*1*/
        0x5B,/*2*/
        0x4F,/*3*/
        0x66,/*4*/
        0x6D,/*5*/
        0x7D,/*6*/
        0x07,/*7*/
        0x7F,/*8*/
        0x6F,/*9*/
                0x3F,
};

/*---------------------数码管显示---------------------------------------*/        
void display()
{        //数码管初始化
        P1=0x00;//P1=00000000
        P3=0xFF;//P3=11111111

  switch(ScanTime)
        {
          //----------数码管第1位--------------               
                case 1:
                        if(Num==0)
                        {
                                P1=0x3F;
                        }
                        else
                        {
                                P1=SEG_Tab[Num/1000];
                        }

                                DS1=0;

                break;

          //-----------数码管第2位-------------               
                case 2:
                        if(Num==0)
                        {
                                P1=0x3F;
                        }
                        else
                        {
                                P1=SEG_Tab[Num/100%10];
                        }                        

                        DS2=0;

                break;

                //-----------数码管第3位-------------               
                case 3:  
                        if(Num==0)
                        {
                                P1=0x3F;
                        }
                        else
                        {
                                P1=SEG_Tab[Num/10%10];
                        }                        


                          DS3=0;                        
                break;

                //-----------数码管第4位-------------               
                case 4:  
                        if(Num==0)
                        {
                                P1=0x3F;
                        }
                        else
                        {
                                P1=SEG_Tab[Num%10];
                        }                        

                        DS4=0;               
                break;

         //------------------default---------------        
                default: break;        
        }

        //-----数码管循环------        
        ScanTime++;
        if(ScanTime>4)
        {
                ScanTime=1;//循环扫描        
        }
}

/*-------------------------------------
                            按键扫描
---------------------------------------*/        
void keyscan()
{
        if(K1==0)
        {
                if(flag_KEY==1)//按键只响应1次
                {
                        flag_KEY=0;

                      {if(Num==10000)Num=0;}            
                        {
                                Num++;
                        }
                }
        }


        else if(K2==0)
        {
                if(flag_KEY==1)//按键只响应1次
                {
                        flag_KEY=0;

                                 {if(Num==0)Num=10000;}
                        {
                                Num--;
                        }
                }
        }


                else if(K3==0)
        {
                if(flag_KEY==1)//按键只响应1次
                {
                        flag_KEY=0;


                        {
                                Num=0;
                        }
                }
        }

  else//按键松开
  {        
          flag_KEY=1;
  }          
    }








void delay_ms(unsigned int ms)// 延时子程序
{   
  unsigned int a,b;
  for(a=ms;a>0;a--)
  for(b=123;b>0;b--);
}
/*-------------------------------------
                            主函数
---------------------------------------*/        
void main()
{
         P1M1 = 0x00; P1M0 = 0xFF; //P1口推挽模式
         P3M0 |= 0xf0; P3M1 &= ~0xf0; //P3口推挽模式


        while(1)
        {
                display();
                keyscan();
                delay_ms(10);
                                 
        if(Num<=999)
{
if((Num%100/10 == 0)&&(Num%10 == 0))
{FMQ=0;}
else

{FMQ=1;}
}
else
{
if((Num%1000%100/10 == 0)&&(Num%10 == 0))
{FMQ=0;}
else

{FMQ=1;}
}
}
}

回复

使用道具 举报

ID:1133081 发表于 2024-10-17 06:03 | 显示全部楼层
先判断Num大小,再确定是否显示该位。例如:

        if(Num<1000)不显示千位
        else 显示千位

        if(Num<100)不显示百位
        else 显示百位

        if(Num<10)不显示十位
        else 显示十位

        通常个位常显示
回复

使用道具 举报

ID:161164 发表于 2024-10-17 11:42 | 显示全部楼层
  1. case 1:
  2.         if(Num<1000)
  3.         ...
  4. case 2:
  5.         if(Num<100)
  6.         ...
  7. case 3:
  8.         if(Num<10)
  9.         ...
复制代码
回复

使用道具 举报

ID:352736 发表于 2024-10-17 18:23 来自手机 | 显示全部楼层
WL0123 发表于 2024-10-17 06:03
先判断Num大小,再确定是否显示该位。例如:

        if(Num

谢谢大师指点!
回复

使用道具 举报

ID:352736 发表于 2024-10-17 18:24 来自手机 | 显示全部楼层
lkc8210 发表于 2024-10-17 11:42

谢谢大师指点!
回复

使用道具 举报

ID:352736 发表于 2024-10-18 19:39 来自手机 | 显示全部楼层
麻烦各位大师再帮我看下这段计数器的蜂鸣器程序,原来的设计是满100蜂鸣器响2秒作为提示,比如计数满100时蜂鸣器响2秒101时蜂鸣器关闭,200是响201关闭以此类推反向计数也一样,这段程序是一个大师给的,但是有一个问题就是计数器一上电个位为0时蜂鸣器一直响,没有响2秒就停的延时程序麻烦各位大师帮忙看下怎么改if(NUM<=999) { if((NUM%100/10 == 0)&&(NUM%10 == 0)) {FMQ=0;} else {FMQ=1;} } else { if((NUM%1000%100/10 == 0)&&(NUM%10 == 0)) {FMQ=0;} else {FMQ=1;} }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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