数码管的静态、动态显示原理及编程方法(2)

描述

“掌握数码管的静态、动态显示原理及编程方法。--综合案例”

前言

电路图

我们继续来写一个代码,来综合这些效果

01电路图

电路图

02代码如下

#include < reg51.h >
#define u8  unsigned char
#define u16 unsigned  int
#define u32 unsigned long


sbit ADD = P3^0;
sbit SUB = P3^1;
sbit SET = P3^2;


bit key_mark = 0;
bit break_out = 0;
//共阴极
u8 Table_cc[]={
            0x3f,0x06,0x5b,0x4f,
            0x66,0x6d,0x7d,0x07,
            0x7f,0x6f,0x77,0x7c,
            0x39,0x5e,0x79,0x71
};


u8 state = 0;
u32 num2=0;
u32 num1 = 123456;


u8 d0,d1,d2,d3,d4,d5;


//函数的声明
void Delay(u16 k);
void KeyScan();
void Key();
void DigDisplay1();
void DigDisplay2();


/*****外部中断函数****************
时间:2023年4月29日
********************************/
void InitI0(){
  IE = 0x81;
  IT0 = 1;  //边沿检测
}


//外部中断0的作用:1.让效果的状态改变 2.break_out可以让效果1执行后,可以跳出效果1的循环
void InT0() interrupt 0{
  if(state++ > 2 )  {
       state == 0;
    break_out = 1;
  }  
}


//主函数
void main(){
  InitI0();
  while(1){


      if(state == 0)
      {
          DigDisplay1();
      }


      if(state == 1)
      {
        d0 = num1/100000;
        d1 = num1%100000/10000;
        d2 = num1%10000/1000;
        d3 = num1%1000/100;
        d4 = num1%100/10;
        d5 = num1%10;
        DigDisplay2();
      }
      else if(state == 2)
      {
        Key();
        d0 = num2/100000;
        d1 = num2%100000/10000;
        d2 = num2%10000/1000;
        d3 = num2%1000/100;
        d4 = num2%100/10;
        d5 = num2%10;
        DigDisplay2();
      }
      else 
        break_out = 0;
  }
}


//延时函数
void Delay(u16 k){
  u16 i,j;
  for(i=0;i< k;i++)
    for(j=0;j< 110;j++);
}


//按键扫描函数:用于判断是哪一个按键按下了
void KeyScan()
{
  if((!ADD || !SUB)&& key_mark == 0)
  {
    Delay(10);
    if(!ADD || !SUB)
    {
      key_mark = 1;
      Key();
    }
  }
  else if(ADD && SUB)
  {
     key_mark =0;
  }
}


//按键函数:用于数字的加减 
void Key()
{
  if(state == 2)
  {
    if(!ADD)
    {
        if(++num2 >65535)
          num2 = 0; 


    }
    else if(!SUB)
    {
      if(num2 == 0 )
        num2 == 65536;  
            num2--;
    }
  }
}


/*****静态显示函数****************
时间:2023年4月29日
功能:6位数码管循环显示数字0~F;
********************************/
void DigDisplay1()
{
  u8 i;
  for(i=0; i< 16; i++)
    {
      P1 = 0XC0;   //1100 0000  
      P2 = Table_cc[i];
      Delay(1000);  
      P1 = 0Xff;
      if(break_out)
        break;
    }
}


/*****动态显示函数****************
时间:2023年4月29日
功能:动态显示数字--用于效果2和效果3
********************************/
void DigDisplay2(){


  P1 = 0Xff;
  P2 = Table_cc[d0];
  P1 = 0Xfe;       // 1111 1110
  Delay(10);


  P1 = 0Xff;
  P2 = Table_cc[d1];
  P1 = 0Xfd;       // 1111 1101
  Delay(10);  


  P1 = 0Xff;
  P2 = Table_cc[d2];
  P1 = 0Xfb;       // 1111 1011
  Delay(10);


  P1 = 0Xff;
  P2 = Table_cc[d3];
  P1 = 0Xf7;       // 1111 0111
  Delay(10); 


  P1 = 0Xff;
  P2 = Table_cc[d4];
  P1 = 0Xef;       // 1110 1111
  Delay(10);  


  P1 = 0Xff;
  P2 = Table_cc[d5];
  P1 = 0Xdf;       // 1101 1111
  Delay(10);  


}

实验结果:

当我们打开电源时,效果1就开始执行了,我们按下SET键,等效果1完全执行完毕后,会自动跳入效果2。如果我们再次按下SET键,会进入到效果3,在这时,如果我们按下ADD键,可以执行数字的加;如果我们按下SUB键,可以执行数字的减。

一些未解决的问题:

首先 ,数字的加减,数字加和减,都不能准确的加1或者减1,都是加3或者减3,不符合我们代码写的效果,只是实现了加减而已;

其次 ,数字的减到0后,不能从65535开始,而是一个其他数;

然后 ,我们实现题目的方法,其实是可以直接使用按键去改变状态的,但是由于我自身的不足,我无法直接使用按键去修改状态,还需要借助外部中断0,去辅助我修改state。

最后 ,在不使用其他芯片的情况下,代码不够整洁,不是很美观。还有就是,在状态2下,数字偶尔还会有闪烁的情况,在状态3下,数字闪烁更严重了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分