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

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

3天内不再提示

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

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

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

前言

图片

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

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下,数字闪烁更严重了。

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

    关注

    10320

    文章

    10718

    浏览量

    527950
  • 数码管
    +关注

    关注

    32

    文章

    1874

    浏览量

    90920
  • 编程
    +关注

    关注

    88

    文章

    3587

    浏览量

    93578
  • 动态显示
    +关注

    关注

    0

    文章

    40

    浏览量

    11651
  • 静态显示
    +关注

    关注

    0

    文章

    19

    浏览量

    5985
收藏 人收藏

    评论

    相关推荐

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

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

    完成数码管动态显示方法

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

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

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

    数码管动态显示实验

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

    数码管动态显示)【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次下载

    8个数码管静态显示_数码管动态显示

    本文主要介绍了几个数码管静态显示以及数码管动态显示程序,数码管由多个发光二极
    发表于 01-16 16:37 2w次阅读
    8个<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>

    数码管静态动态显示和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次下载

    #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>)

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

    “掌握数码管静态动态显示原理及编程方法。--不是综合案例”
    的头像 发表于 06-28 11:40 2532次阅读
    <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>(1)