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

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

    关注

    10215

    文章

    10645

    浏览量

    510999
  • 数码管
    +关注

    关注

    31

    文章

    1827

    浏览量

    89948
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92400
  • 动态显示
    +关注

    关注

    0

    文章

    40

    浏览量

    11587
  • 静态显示
    +关注

    关注

    0

    文章

    19

    浏览量

    5935
收藏 人收藏

    评论

    相关推荐

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

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

    #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次下载

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

    作用,使人的感觉好像各位数码管同时都在显示动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于
    发表于 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 9次下载
    【51单片机】<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 955次阅读
    <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)