0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:狂锤硬件 作者:顾 2023-06-28 11:40 次阅读

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

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

效果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());
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路图
    +关注

    关注

    10215

    文章

    10645

    浏览量

    511020
  • 数码管
    +关注

    关注

    31

    文章

    1827

    浏览量

    89949
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • 动态显示
    +关注

    关注

    0

    文章

    40

    浏览量

    11588
  • 静态显示
    +关注

    关注

    0

    文章

    19

    浏览量

    5935
收藏 人收藏

    评论

    相关推荐

    数码管静态显示动态显示有什么区别?

    郭天祥视频上的静态显示动态显示好像编程都差不多啊,都是位选控制显示的是哪个数码管,段选控制
    发表于 01-03 11:44

    C51单片机学习笔记(五)——数码管静态显示动态显示 精选资料推荐

    C51单片机学习笔记(五)——数码管静态显示动态显示文章目录C51单片机学习笔记(五)——数码管
    发表于 07-14 06:34

    #51单片机#数码管静态动态显示 精选资料分享

    数码管静态显示动态显示学习数码管静态动态显示
    发表于 07-14 08:13

    如何通过编程实现数码管动态显示

    如何通过编程实现数码管动态显示
    发表于 11-04 07:15

    数码管动态显示的基本原理与实现思路

    一、模块题目二、原理简述动态显示的基本原理与实现思路(转载)动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。在轮流
    发表于 01-11 06:32

    数码管静态显示方式与动态显示方式有何不同

    单片机系统中的LED数码管显示程序有哪几种方式啊?数码管静态显示方式与动态显示方式有何不同?
    发表于 01-18 07:47

    完成数码管动态显示方法

    开拓者FPGA开发板上有六个共阳极八段数码管,本实验将完成数码管动态显示数码管动态/静态
    发表于 01-18 10:25

    如何对数码管静态显示动态显示进行Proteus仿真呢

    数码管的原理是什么?其结构是怎样构成的?如何对数码管静态显示动态显示进行Proteus仿真呢?
    发表于 01-21 06:54

    动态数码管静态数码管介绍

    数字就根据图中a-g发光二极的亮来调节;比如要1亮,那就b、c二极发光,也就是1100 0000,转为16进制就是P0=0xf92.数码管静态
    发表于 01-24 06:32

    数码管静态显示动态显示的实现方法

    数码管静态显示动态显示数码管共阳和共阴段选和位选数码管静态
    发表于 03-01 07:34

    分享一个基本的数码管动态显示案例

    1、分享一个基本的数码管动态显示案例数码管动态显示原理在开展本章实验之前,我们需要先了解一下数码管
    发表于 08-01 15:21

    数码管动态显示)【C语言版】

    数码管动态显示)【C语言版】数码管动态显示)【C语言版】数码管动态显示)【C语言版】
    发表于 12-29 15:51 0次下载

    #51单片机#数码管静态动态显示

    数码管静态显示动态显示学习数码管静态动态显示
    发表于 11-14 19:51 20次下载
    #51单片机#<b class='flag-5'>数码管</b><b class='flag-5'>静态</b>与<b class='flag-5'>动态显示</b>

    【51单片机】数码管静态显示动态显示

    【51单片机】数码管静态显示动态显示数码管显示原理此次以点亮共阴
    发表于 11-17 12:21 9次下载
    【51单片机】<b class='flag-5'>数码管</b>的<b class='flag-5'>静态</b><b class='flag-5'>显示</b>和<b class='flag-5'>动态显示</b>

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

    “掌握数码管静态动态显示原理及编程方法。--综合案例”
    的头像 发表于 06-28 11:41 1003次阅读
    <b class='flag-5'>数码管</b>的<b class='flag-5'>静态</b>、<b class='flag-5'>动态显示</b>原理及<b class='flag-5'>编程</b><b class='flag-5'>方法</b>(2)