找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管滚动,找不清位选和输出数码管的关系,求个程序思路

[复制链接]
跳转到指定楼层
楼主
20黑币
用51让8位数码管滚动显示0~f,初始显示0~7,依次左移,
用到38译码器来位选,我找不清位选和输出数码管的关系。。。卡了一天了
求大佬给个思路,

最佳答案

查看完整内容

给你一个示例程序,0~F循环左移。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-5-14 08:39 | 只看该作者
给你一个示例程序,0~F循环左移。


  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit led138c=P2^4;        //38译码器位选
  5. sbit led138b=P2^3;         //38译码器位选
  6. sbit led138a=P2^2;        //38译码器位选

  7. uchar code table[]={        //共阴极数码管段码0~F数组
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71};

  12. uchar data dis_buf[9];//显示缓存
  13. /********************************
  14.                         ms延时程序
  15. ********************************/
  16. void delayms(uint k)       
  17. {
  18.         uint i,j;
  19.         for(i=k;i>0;i--)
  20.                 for(j=110;j>0;j--);
  21. }
  22. /********************************
  23.                         移位程序
  24. ********************************/
  25. void shift()
  26. {
  27.         static uint count=0;
  28.         static j=8;
  29.         uchar i;

  30.         if(++count>=500)//移动速度:计数0.5秒
  31.         {                       
  32.                 count=0;       
  33.                 dis_buf[8]=table[j]; //显示缓存第9位赋值
  34.                 for(i=0;i<8;i++)                //显示缓存循序移位
  35.                 {
  36.                         dis_buf[i]=dis_buf[i+1];
  37.                 }
  38.                 j++;
  39.                 if(j>15)
  40.                         j=0;
  41.         }
  42. }
  43. /********************************
  44.                 数码管显示程序
  45. ********************************/
  46. void display()
  47. {
  48.         static uchar i=0;
  49.         P0=0x00;        //消隐
  50.         switch(i)
  51.         {
  52.                 case 0:led138a=0;led138b=0;led138c=0;break;               
  53.                 case 1:led138a=1;led138b=0;led138c=0;break;       
  54.                 case 2:led138a=0;led138b=1;led138c=0;break;       
  55.                 case 3:led138a=1;led138b=1;led138c=0;break;       
  56.                 case 4:led138a=0;led138b=0;led138c=1;break;       
  57.                 case 5:led138a=1;led138b=0;led138c=1;break;
  58.                 case 6:led138a=0;led138b=1;led138c=1;break;       
  59.                 case 7:led138a=1;led138b=1;led138c=1;break;       
  60.         }
  61.         P0=dis_buf[i];
  62.         i++;
  63.         i%=8;
  64. }
  65. /********************************
  66.                      主程序
  67. ********************************/
  68. void main()
  69. {
  70.         uchar i;
  71.         for(i=0;i<8;i++)//缓存载入初始值
  72.         {
  73.                 dis_buf[i]=table[i];
  74.         }
  75.         while(1)
  76.         {
  77.                 shift();
  78.                 display();
  79.                 delayms(1);
  80.         }
  81. }

复制代码




回复

使用道具 举报

板凳
ID:370657 发表于 2019-5-14 10:43 | 只看该作者
数码管的位选是控制8个数码管亮灭的。段选是控制一个数码管内部显示什么数字的。你对应38译码器的真值表,应该可以实现数码管滚动显示。
回复

使用道具 举报

地板
ID:158375 发表于 2019-5-14 13:01 | 只看该作者
弄个显示缓冲区,数码管就显示"显示缓冲区数据".
隔一定时间改变显示缓冲区数据,就实现了数码管显示数字的滚动.
回复

使用道具 举报

5#
ID:474216 发表于 2019-5-14 14:25 | 只看该作者
懒懒的627 发表于 2019-5-14 10:43
数码管的位选是控制8个数码管亮灭的。段选是控制一个数码管内部显示什么数字的。你对应38译码器的真值表, ...

嗯,谢谢,您说的这些我了解,我卡在了位选和段选的关系上,C语言不过关。难受啊。。
回复

使用道具 举报

6#
ID:474216 发表于 2019-5-15 10:57 | 只看该作者
wulin 发表于 2019-5-14 15:12
给你一个示例程序,0~F循环左移。

i%=8;。。。。。由衷感谢大佬帮我解惑!!!谢谢谢!!!
回复

使用道具 举报

7#
ID:474216 发表于 2019-5-15 10:59 | 只看该作者
笨笨兔 发表于 2019-5-14 13:01
弄个显示缓冲区,数码管就显示"显示缓冲区数据".
隔一定时间改变显示缓冲区数据,就实现了数码管显示数字的 ...

数据处理了后,达不到效果,哈哈哈,我太菜了C语言基础没打好,谢谢大佬的解答!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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