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

    关注

    10340

    文章

    10720

    浏览量

    530215
  • 数码管
    +关注

    关注

    32

    文章

    1882

    浏览量

    91063
  • 中断
    +关注

    关注

    5

    文章

    898

    浏览量

    41470
  • 动态显示
    +关注

    关注

    0

    文章

    40

    浏览量

    11659
  • 静态显示
    +关注

    关注

    0

    文章

    19

    浏览量

    5989
收藏 人收藏

    评论

    相关推荐

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

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

    完成数码管动态显示方法

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

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

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

    数码管动态显示实验

    数码管动态显示实验一、实验目的在实际的单片机系统中,往往需要多位显示动态显示是一种最常见的多位显示方法
    发表于 03-23 10:45 1w次阅读

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

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

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

    数码管动态显示)【汇编+C语言版】,与前面的静态显示相呼应,多种集合,符合C语言和汇编爱好者学习。
    发表于 12-31 10:16 0次下载

    MIN数码管动态显示

    数码管动态显示,MIN数码管动态显示,MIN。
    发表于 05-03 10:48 9次下载

    数码管静态动态显示和74HC138及点阵的动态显示详细资料说明

    本文档的主要内容详细介绍的是数码管静态动态显示和74HC138及点阵的动态显示详细资料说明。
    发表于 04-12 18:27 5次下载
    <b class='flag-5'>数码管</b>的<b class='flag-5'>静态</b>与<b class='flag-5'>动态显示</b>和74HC138及点阵的<b class='flag-5'>动态显示</b>详细资料说明

    使用数码管动态显示123456的程序免费下载

    本文档的主要内容详细介绍的是使用数码管动态显示123456的程序免费下载。解释:数码管动态显示,其实就是一个快速的静态
    发表于 08-07 17:33 13次下载
    使用<b class='flag-5'>数码管</b><b class='flag-5'>动态显示</b>123456的程序免费下载

    数码管动态显示的原理概述

    作用,使人的感觉好像各位数码管同时都在显示动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于
    发表于 11-04 08:00 0次下载

    C51单片机学习笔记(五)——数码管静态显示动态显示

    C51单片机学习笔记(五)——数码管静态显示动态显示文章目录C51单片机学习笔记(五)——数码管
    发表于 11-14 10:21 6次下载
    C51单片机学习笔记(五)——<b class='flag-5'>数码管</b>的<b class='flag-5'>静态</b><b class='flag-5'>显示</b>和<b class='flag-5'>动态显示</b>

    #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 12次下载
    【51单片机】<b class='flag-5'>数码管</b>的<b class='flag-5'>静态</b><b class='flag-5'>显示</b>和<b class='flag-5'>动态显示</b>

    单片机AT89C51--6.数码管显示(含动态静态

    单片机AT89C51--6.静态数码管显示1. 数码管显示原理2.
    发表于 11-25 14:51 23次下载
    单片机AT89C51--6.<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 1708次阅读
    <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)