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

描述

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

实现数码管的静态及动态显示:

效果1(静态显示):6位数码管循环显示数字0~F;

效果2(动态态显示):6位数码管同时显示数字1~6;

效果3(按键检测):用中断或查询方式进行按键检测,实现数码管显示值的加减,最大值为65535;

01电路图

我们的电路图如下:

动态显示

02效果

代码如下:

/************
时间:2023/04/26
作者:顾
效果1(静态显示):6位数码管循环显示数字0~F;
**************/
#include < reg51.h >


//*****声明函数和变量、引脚的定义
#define u8  unsigned char
#define u16 unsigned int



u8 Table_cc[]={
            0x3f,0x06,0x5b,0x4f,
            0x66,0x6d,0x7d,0x07,
            0x7f,0x6f,0x77,0x7c,
            0x39,0x5e,0x79,0x71
};


/*****延时函数********************
时间:2023年4月26日
功能:延时110*10 = 1100μs = 1.1ms
**********************************/
void Delay(u16 k){
  u16 i,j;
  for(i=0;i< k;i++)
    for(j=0;j< 1100;j++);
}




/*****显示函数****************
时间:2023年4月26日
功能:
      数码管显示函数
********************************/
void Display(u16 n){
  //显示秒个位
  P1 = 0XC0;   //1100 0000
  P2 = Table_cc[n];
  Delay(100);  
}




/*****主函数****************
时间:2023年4月26日
********************************/
void main(){
  u8 i;
  while(1){
    for(i=0;i< 16;i++)
    {
      Display(i);
    }
  }
}

03效果2

代码如下:

方法一

/************
时间:2023/04/26
作者:顾
效果2(动态态显示):6位数码管同时显示数字1~6;(30分)
**************/
#include < reg51.h >


//*****声明函数和变量、引脚的定义
#define u8  unsigned char
#define u16 unsigned int

u8 t[6]= {17,17,17,17,17,17};


u8 Table_cc[]={
            0x3f,0x06,0x5b,0x4f,
            0x66,0x6d,0x7d,0x07,
            0x7f,0x6f,0x77,0x7c,
            0x39,0x5e,0x79,0x71,
            0x00
};


/*****延时函数********************
时间:2023年4月26日
功能:延时110*10 = 1100μs = 1.1ms
**********************************/
void Delay(u16 k){
  u16 i,j;
  for(i=0;i< k;i++)
    for(j=0;j< 110;j++);
}




/*****显示函数****************
时间:2023年4月26日
功能:
      数码管显示函数
********************************/
void Display(u8 h,u8 m,u8 s){

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



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



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



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




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



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




/*****主函数****************
时间:2023年4月26日
********************************/
void main(){


  while(1){
      Display(12,34,56);
  }
}

方法二:

/************
时间:2023/04/26
作者:顾
效果2(动态态显示):6位数码管同时显示数字1~6;(30分)
**************/
#include < reg51.h >


//*****声明函数和变量、引脚的定义
#define u8  unsigned char
#define u16 unsigned int
#define u32 unsigned long


u8 t[6]= {0,0,0,0,0,0};
u32 num = 123456;


u8 Table_cc[]={
            0x3f,0x06,0x5b,0x4f,
            0x66,0x6d,0x7d,0x07,
            0x7f,0x6f,0x77,0x7c,
            0x39,0x5e,0x79,0x71,
};


/*****延时函数********************
时间:2023年4月26日
功能:延时110*10 = 1100μs = 1.1ms
**********************************/
void Delay(u16 k){
  u16 i,j;
  for(i=0;i< k;i++)
    for(j=0;j< 110;j++);
}




/*****显示函数****************
时间:2023年4月26日
功能:
      数码管显示函数
********************************/
void Display(u32 n){

  t[0] = n/100000;
  t[1] = n%100000/10000;
  t[2] = n%10000/1000;
  t[3] = n%1000/100;
  t[4] = n%100/10;
  t[5] = n%10;

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

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

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

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

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

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


}




/*****主函数****************
时间:2023年4月26日
********************************/
void main(){


  while(1){
      Display(num);
  }
}

04效果3

/************
时间:2023/04/26
作者:顾
效果2(动态态显示):6位数码管同时显示数字1~6;(30分)
**************/


#include < reg51.h >


//*****声明函数和变量、引脚的定义
#define u8  unsigned char
#define u16 unsigned int

#define Key1Press 1
#define Key2Press 2

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


bit sec;  //秒标志
bit key_mark=0; //键标志


u8 cnt,state;
u8 t[6]= {0,0,0,0,0,0};
u16 num=65534;


u8 Table_cc[]={
            0x3f,0x06,0x5b,0x4f,
            0x66,0x6d,0x7d,0x07,
            0x7f,0x6f,0x77,0x7c,
            0x39,0x5e,0x79,0x71
};


/*****延时函数********************
时间:2023年4月26日
功能:延时110*10 = 1100μs = 1.1ms
**********************************/
void Delay(u16 k){
  u16 i,j;
  for(i=0;i< k;i++)
    for(j=0;j< 110;j++);
}




/*****按键函数****************
时间:2023年4月26日
功能:
    Key1Press 1 SET 设置键 ********
    Key2Press 2 ADD 数字加 ********
    Key3Press 3 SUB 数字减 ********
********************************/
void Key(u8 K)
{  
  static u8  KeyPress;
  KeyPress = K;
  if(KeyPress == 1 )
  {
     num = num+10;
     if(num > 65535)
        num=0;                   
   }
   else if(KeyPress == 2)
   {
      if(num  == 0)
          num=65535;
         //num--;
         num = num-10;
     }
}
/*****按键扫描函数****************
时间:2023年4月26日
功能:函数返回键值
【判断按键是否按下,如果按下
则key_mark置1,说明按键已经按下】 
********************************/
u8 Key_read(){
  if(!ADD)
  {
    Delay(10);
    if(!ADD && key_mark == 0 )
    {
      key_mark = 1;
      return Key1Press;
    }
  }
  else if(!SUB)
  {
    Delay(10);
    if(!SUB && key_mark == 0 )
    {
      key_mark = 1;
      return Key2Press;
    }
  }
   else if(ADD && SUB )
     {
         key_mark = 0;
     }
    return 0;
}


/*****定时器函数****************
时间:2023年4月26日
功能:实现1s定时
********************************/
void InitT0(){
  TMOD = 0x01;
  IE = 0x82;
  TH0 = -50000 > > 8;
  TL0 = -50000;
  TR0 = 1;

}


void T0ser() interrupt 1{
  TH0 = -50000 > > 8;
  TL0 = -50000 ;
  if(++cnt == 20)
  {
     sec = 1;
     cnt = 0;
  }  
}


/*****走时函数****************
时间:2023年4月26日
功能:
      时间正常走时
********************************/
u16 TimeGo(){
    if(sec)
    {
        sec = 0;
        if(++num > 65535)
      {
          num = 0;
        }
      }
    return num;
}


/*****显示函数****************
时间:2023年4月26日
功能:
      数码管显示函数
********************************/
void Display(u16 n){

  t[0] = n/100000;
  t[1] = n%100000/10000 ;
  t[2] = n%10000/1000;
  t[3] = n%1000/100;
  t[4] = n%100/10;
  t[5] = n%10;

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

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

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

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

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

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


}






/*****主函数****************
时间:2023年4月25日
********************************/
void main(){
  InitT0();
  while(1){
      Key(Key_read()) ;
//      TimeGo(num);
      Display(TimeGo());
  }
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

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

×
20
完善资料,
赚取积分