找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3936|回复: 0
收起左侧

单片机控制数码管局部闪烁

[复制链接]
ID:350005 发表于 2018-6-20 10:57 | 显示全部楼层 |阅读模式
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  3. sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
  4. sbit LATCH2=P2^3;//                 位锁存

  5. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  6. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  7. unsigned char TempData[8]; //存储显示值的全局变量
  8. void Delay(unsigned int t); //函数声明
  9. void Display(unsigned char FirstBit,unsigned char Num);
  10. /*------------------------------------------------
  11.                     主函数
  12. ------------------------------------------------*/
  13. main()
  14. {
  15. unsigned int numA=999,numB=0;
  16. unsigned int j;
  17. bit FlashFlag;
  18. while(1)
  19.       {
  20.            j++;
  21.            if(j==20)  //检测当前数值显示了一小段时间后,
  22.               //需要显示的数值,实现数据显示的变化
  23.              {
  24.                   j=0;
  25.                   FlashFlag=!FlashFlag;
  26.                   numB++;
  27.                   if(numA>0)//用于显示0~999
  28.                     numA--;
  29.                   else
  30.                     numA=999;
  31.           if(numB==1000)
  32.                     numB=0;
  33.                  }
  34.            //递减的三位数码管,带消隐
  35.        //分解显示信息,如要显示68,则68/10=6  68%10=8  
  36.                     TempData[0]=dofly_DuanMa[numA/100];
  37.              TempData[1]=dofly_DuanMa[(numA%100)/10];
  38.              TempData[2]=dofly_DuanMa[(numA%100)%10];
  39.        //中间2位数码管不显示,赋值0
  40.           if(FlashFlag)
  41.             {
  42.          TempData[3]=0x40; //显示"-"
  43.              TempData[4]=0x40;
  44.                  }
  45.           else
  46.             {
  47.              TempData[3]=0;
  48.              TempData[4]=0;
  49.             }
  50.        //递增的三位数码管,带消隐
  51.            //分解显示信息,如要显示68,则68/10=6  68%10=8
  52.                     TempData[5]=dofly_DuanMa[numB/100];  
  53.              TempData[6]=dofly_DuanMa[(numB%100)/10];
  54.              TempData[7]=dofly_DuanMa[(numB%100)%10];

  55.            Display(0,8);//从第一位显示,共显示8位
  56.       }
  57. }
  58. /*------------------------------------------------
  59. 延时函数,含有输入参数 unsigned int t,无返回值
  60. unsigned int 是定义无符号整形变量,其值的范围是
  61. 0~65535
  62. ------------------------------------------------*/
  63. void Delay(unsigned int t)
  64. {
  65. while(--t);
  66. }
  67. /*------------------------------------------------
  68. 显示函数,用于动态扫描数码管
  69. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
  70. 如输入0表示从第一个显示。
  71. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
  72. ------------------------------------------------*/
  73. void Display(unsigned char FirstBit,unsigned char Num)
  74. {
  75.       unsigned char i;
  76.          
  77.           for(i=0;i<Num;i++)
  78.            {
  79.            DataPort=0;   //清空数据,防止有交替重影
  80.        LATCH1=1;     //段锁存
  81.        LATCH1=0;

  82.        DataPort=dofly_WeiMa[i+FirstBit]; //取位码
  83.        LATCH2=1;     //位锁存
  84.        LATCH2=0;

  85.        DataPort=TempData[i]; //取显示数据,段码
  86.        LATCH1=1;     //段锁存
  87.        LATCH1=0;

  88.            Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

  89.        }

  90. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表