单片机
返回首页

STC89C52单片机驱动数码管动态显示

2016-04-15 来源:eefocus

//////////////////////////////////////////////////////////////////////////

 实现功能:  驱动开发板上的数码管,滚动显示1、2、3、4、5、6,实现数码管的
             动态显示
 实验板型号:BS-XYD-C52
 实验名称:  动态数码管的显示
 编写人:  谢应东
 编写日期:  2012-4-26      
 //////////////////////////////////////////////////////////////////////////
#include
#include  
                    
#define uchar unsigned char  //定义unsigned char 为 uchar
#define uint  unsigned int  //定义unsigned int 为 uint

sbit Duan=P2^6;     //定义数码管的段选使能端
sbit Wei =P2^7;        //定义数码管的位选使能端

#define Digital_tube_Wei_Enable Wei=1;  //开启控制数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0;     //关闭控制数码管的位选使能端

#define Digital_tube_Duan_Enable Duan=1; //开启控制数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0; //关闭控制数码管的段选使能端

#define Digital_tube_Duan P0    //定义数码管数据端口

uchar code Dis_table[]=      //将BCD码转换成数码管扫描码的数组
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
uchar code Dis_Position[]=  //定义数码管位选的数组
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//////////////////////////////////////////////////////////////////////////
函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
          iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
    iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
返回值: 
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
          式完成,所以如果改变了晶振的频率,请做相应的改变
//////////////////////////////////////////////////////////////////////////
void DelayMs(uint Delay_MS)
{
 uint iNumber,iValue;
 for(iNumber=0;iNumber   //用for语句实现单片机的延时
 {
     iValue=107;      //107这个数值是通过测定而得
     while(iValue--);
 }
}
//////////////////////////////////////////////////////////////////////////
函数名称:One_DigitalTube_display
函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
          在第一个数码管上显示0
参数介绍:uData:要显示的数字的BCD码数组
          uNumber:选择哪个数码管显示,即让某个特定数码管显示
返回值: 
注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
          要弄反了
//////////////////////////////////////////////////////////////////////////
void One_DigitalTube_display(uchar uData,uchar uNumber)

  Digital_tube_Duan_Enable;      //使能数码管的段选
  Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值
  Digital_tube_Duan_Disable;      //关闭数码管的段选
 
  Digital_tube_Wei_Enable;      //使能数码管的位选
  Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管
  Digital_tube_Wei_Disable;      //关闭数码管的位选
  DelayMs(1);         //调整时序,以实现稳定显示
}
//////////////////////////////////////////////////////////////////////////
函数名称:All_DigitalTube_display
函数功能:让6个数码管显示特定的内容
参数介绍:uData:显示内容数组地址
    uNumber:实现六个数码管的依次显示变量
返回值: 
注意事项:无
//////////////////////////////////////////////////////////////////////////
void All_DigitalTube_display(uchar *uData)
{
  uchar uNumber;
  for(uNumber=0;uNumber<6;uNumber++) //循环6次,6个数码管各亮一次
  {
   One_DigitalTube_display(uData[uNumber],uNumber);
 }
}
//////////////////////////////////////////////////////////////////////////
函数名称:Cycle_DigitalTube_display
函数功能:6个数码管从左到右依次滚动显示指定的内容(循环一次)
参数介绍:uData:显示内容数组地址
          uNumber1:实现数码管滚动的变量
    uNumber2:实现数码管扫描的变量
返回值: 
注意事项:无
//////////////////////////////////////////////////////////////////////////

void Cycle_DigitalTube_display(uchar *uData)
{
  uchar uNumber1,uNumber2;
  for(uNumber1=0;uNumber1<240;uNumber1++)   //滚动6次,每次内容显示40个循环
  {
    for(uNumber2=0;uNumber2<6;uNumber2++) //扫描6个数码管
   {
    One_DigitalTube_display(uData[(uNumber1/40+uNumber2)%6],uNumber2);
    DelayMs(3);   
                         
  }
  }
}
//////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:实现6个数码管循环滚动显示指定的内容
参数介绍:无
返回值: 
注意事项:无
//////////////////////////////////////////////////////////////////////////
void main()
{
    uchar uData[6]={1,2,3,4,5,6};//六个数码管滚动显示1,2,3,4,5,6
 while(1)
 {
  Cycle_DigitalTube_display(uData);  //调用循环显示函数
 }
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 一个简单的立体声平衡指示器电路

  • 电谐波图形均衡器示意图

    相关电子头条文章