找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5734|回复: 0
打印 上一主题 下一主题
收起左侧

单片机实验 数码管静态显示实验

[复制链接]
跳转到指定楼层
楼主
ID:146314 发表于 2016-11-5 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内容:循环显示十六进制数0~F
  1. #include "reg52.h"

  2. sbit EnWei                             =P2^7; //位码锁存器使能端
  3. sbit EnSeg                                =P2^6; //段码锁存器使能端

  4. #define DATAPORT                (P0)   //段/位码输出端口
  5. #define WEICODE                        (0x7f) //位码初始值
  6. #define OFFCODE                        (0xff) //定义熄灭码

  7. #define INCSPEED                (10) //显示内容变化速度

  8. unsigned char code SegTab[]={  //定义段码表(共阴极)
  9.                         0x3f,0x06,0x5b,0x4f,
  10.                         0x66,0x6d,0x7d,0x07,
  11.                         0x7f,0x6f,0x77,0x7c,
  12.                         0x39,0x5e,0x79,0x71
  13. };

  14. unsigned char DispBuf[8]={ //定义显示缓冲区
  15.                         0x00,0xff,0xff,0xff,
  16.                         0xff,0xff,0xff,0xff
  17. };

  18. //延时函数
  19. //x为延时时间,范围1~65535
  20. void xDelay(unsigned int x)
  21. {
  22. unsigned char y;

  23. for(;x>0;x--)
  24.   for(y=110;y>0;y--);
  25. }

  26. //数值分离函数,将要显示的数各数值位分离到DispBuf数组中
  27. //x为要显示的数,范围0~4294967295
  28. void GetDispBufValue(unsigned long x)
  29. {
  30. unsigned char Temp,i;

  31. i=0; //作为DispBuf数组的下标
  32. while(x>0)
  33.   {
  34.    Temp=x%10; //使x对10求余,取出最低位
  35.    x/=10;          //更改x的值,为下一轮作准备
  36.    DispBuf[i++]=Temp; //将取出的数值位存入显示缓冲
  37.   }          
  38. while(i<8) //如果x不足8位,将其余的位填上熄灭码
  39.   {
  40.    DispBuf[i++]=OFFCODE;
  41.   }
  42. }

  43. //显示函数
  44. //x要显示的值,范围0~4294967295
  45. void Display(unsigned long x)
  46. {
  47. unsigned char WeiCode=WEICODE,i;

  48. GetDispBufValue(x); //先将显示值的数值位分离出来
  49. for(i=0;i<8;i++) //循环刷新每一位数码管
  50.   {
  51.    if(DispBuf[i]!=OFFCODE)
  52.     {
  53.          DATAPORT=SegTab[DispBuf[i]]; //输出段码并锁存
  54.          EnSeg=1;
  55.          EnSeg=0;

  56.          DATAPORT=WeiCode;         //输出位码并锁存
  57.          EnWei=1;
  58.          EnWei=0;
  59.         }
  60.    WeiCode>>=1;         //为下一位数值准备位码
  61.    WeiCode|=0x80;
  62.    xDelay(5); //延时一会,使刚被点亮的位稳定
  63.   }

  64. DATAPORT=0x00; //熄灭最后一位被点亮的数码管
  65. EnSeg=1;
  66. EnSeg=0;
  67. }

  68. void main(void)
  69. {
  70. unsigned char IncSpeed=INCSPEED;
  71. unsigned long x=76543210;
  72. P2=0x00;

  73. while(1){
  74.   Display(x); //调用显示函数

  75.   //if(--IncSpeed==0)        //减到0时,为显示数值加1
  76.    //{
  77. //        IncSpeed=INCSPEED; //恢复初值,为下一轮作准备
  78.         //x++;  //显示数值加1
  79.    //}
  80. }
  81. }
复制代码


05实验五 静态显示.zip

16.67 KB, 下载次数: 9, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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