找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1538|回复: 8
收起左侧

单片机数码管滚动显示,滚动的程序怎么做?求思路

[复制链接]
ID:995903 发表于 2021-12-30 22:28 | 显示全部楼层 |阅读模式
51单片机控制数码管滚动显示8个数就是01234567
      70123456
      67012345
       ...
  1. #include "reg52.h"
  2. sbit LSA=P2^2;
  3. sbit LSB=P2^3;
  4. sbit LSC=P2^4;
  5. unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. void delay(unsigned int i)
  7. {
  8.         while(i--);
  9. }
  10. void main()
  11. {
  12.         while(1)
  13.         {
  14.                 unsigned char i;
  15.                 for(i=0;i<8;i++)
  16.                 {
  17.                    switch(i)
  18.                         {
  19.                                 case 0: LSC=1;LSB=1;LSA=1;break;
  20.                                 case 1: LSC=1;LSB=1;LSA=0;break;
  21.                                 case 2: LSC=1;LSB=0;LSA=1;break;
  22.                                 case 3: LSC=1;LSB=0;LSA=0;break;
  23.                                 case 4: LSC=0;LSB=1;LSA=1;break;
  24.                                 case 5: LSC=0;LSB=1;LSA=0;break;
  25.                                 case 6: LSC=0;LSB=0;LSA=1;break;
  26.                                 case 7: LSC=0;LSB=0;LSA=0;break;
  27.                         }
  28.                 P0=seg[i];
  29.                 delay(50);
  30.                
  31.                 }
  32.         }
  33. }
复制代码
这写完了数码管显示八个数
滚动显示八个数怎么样写?思路是怎样的

回复

使用道具 举报

ID:161164 发表于 2021-12-31 00:46 | 显示全部楼层
简单数学问题
2021-12-31_004440.png


回复

使用道具 举报

ID:277550 发表于 2021-12-31 10:02 | 显示全部楼层
用数组,循环改变
回复

使用道具 举报

ID:584814 发表于 2021-12-31 10:39 | 显示全部楼层
分析:共有8位只显示8数位置循环,也就是说第8位下次代替第1而第1之后都白后移,
方法很多最简单的就是用余数,每次循环后数的倍数+1与8整除取余数就是新位置,P0=seg[i];中的i
所以修改一下程序就可以,可以再加个外循环,这个变量+i后和8取余数就OK
例:......
                unsigned char i , j ; //修改,增加 j 变量
                for(j = 0 ; i < 8 ; j ++) //增加循环
                { //新增
               ......
                P0=seg[ ( i + j ) % 8 ]; //修改,取余数
                }  //新增
......
回复

使用道具 举报

ID:213173 发表于 2022-1-1 10:07 | 显示全部楼层
  1. #include "reg52.h"
  2. sbit LSA=P2^2;
  3. sbit LSB=P2^3;
  4. sbit LSC=P2^4;
  5. unsigned char code seg[]={
  6.         0x3f,0x06,0x5b,0x4f,
  7.         0x66,0x6d,0x7d,0x07,
  8.         0x7f,0x6f,0x77,0x7c,
  9.         0x39,0x5e,0x79,0x71};
  10. unsigned char data dis_buf[8];

  11. void delay(unsigned int i)
  12. {
  13.         while(i--);
  14. }

  15. void main()
  16. {
  17.         unsigned char i,j,k,t;

  18.         for(k=0;k<8;k++)
  19.                 dis_buf[k]=seg[k];//初始显示缓存

  20.         while(1)
  21.         {
  22.                 P0=0x00;//消隐
  23.                 P2&=0xe3;//清位码
  24.                 P2|=7-i<<2;//送位码
  25.                 P0=dis_buf[i];//送段码
  26.                 delay(550);        //延时,保持显示一段时间
  27.                 i=++i%8;//0~7循环
  28.                 t++;
  29.                 if(t>=250)//
  30.                 {
  31.                         t=0;
  32.                         j=++j%16;//0~15循环
  33.                         for(k=0;k<8;k++)
  34.                                 dis_buf[k]=seg[(k+j)%16];//导入缓存
  35.                 }
  36.         }
  37. }
复制代码
回复

使用道具 举报

ID:332444 发表于 2022-1-1 10:49 | 显示全部楼层
回复

使用道具 举报

ID:999096 发表于 2022-1-1 21:38 | 显示全部楼层
位选循环切换,左移一位,
回复

使用道具 举报

ID:995903 发表于 2022-1-3 19:54 | 显示全部楼层
xianfajushi 发表于 2022-1-1 10:49
https://blog.csdn.net/xianfajushi/article/details/106419914

谢谢谢谢
回复

使用道具 举报

ID:979299 发表于 2022-1-3 22:16 | 显示全部楼层
来个最简间的思路
#include<reg52.h>
#define DataPort P0 //定义段数据端口
#define SegPort  P2 //定义位数据端口

unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                                                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
                                                                0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
unsigned char code dofly_WeiMa[]={0,1,2,3,4,5,6,7};

void Delay(unsigned int t);

main()
{
        unsigned char i=0,num;
        unsigned int j;
        while(1)
        {
                SegPort=dofly_WeiMa[i]; //取位码
                DataPort=dofly_DuanMa[num+i]; //取段码
                Delay(200);
                i++;j++;
                if(8==i)   
                i=0;
                if(j==500)
                {
                        j=0;
                        num++;
                        if(num==16)
                        num=0;
                }
        }
}

void Delay(unsigned int t)
{
        while(--t);
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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