找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2905|回复: 17
收起左侧

单片机数码管笔划跑马灯程序怎样实现?

  [复制链接]
ID:1044091 发表于 2022-9-23 23:28 | 显示全部楼层 |阅读模式
本人初学51单片机,最近在搞一个步进电机的小制作,主要功能就是用51控制A4988模块,驱动步进电机实现正反转,加减速,存储当前速度等功能。拜论坛各位前辈所赐,下了些代码拼到一块,磕磕绊绊倒也实现了主要功能。兴奋之余也想搞一点锦上添花的效果,就是让数码管笔划做出跑马灯的效果,用两位数码管,电机正转就正向跑马,反转就反向跑马(这是我们家压力锅上的效果,下有视频)。然而功力太浅,毫无头绪,故特来万能的51hei求助。在此先谢谢了!

51hei.gif
回复

使用道具 举报

ID:824490 发表于 2022-9-24 17:10 | 显示全部楼层
不规则的、万能的码表!
回复

使用道具 举报

ID:1044091 发表于 2022-9-24 17:21 | 显示全部楼层
笨方法搞了一段代码,可是实现不了反显的效果呢?



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

//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


uchar fan;
uint zheng;

void delayms(uint xms)
{
        uint i;
        uchar j;
        for(i=xms;i>0;i--)
          for(j=110;j>0;j--);
}

void main()
{
   while(1)
       {        
         for(fan=0;fan<4;fan++)
         {
         P0=0x01;              //7 上笔划从右往左  反转
         LSC=1;LSB=1;LSA=0;      
         delayms(500);

         P0=0x01;              //8    上笔划从右往左
         LSC=1;LSB=1;LSA=1;
         delayms(500);
      
         P0=0x20;              //8 左端左上笔划
         LSC=1;LSB=1;LSA=1;
         delayms(500);
      
         P0=0x10;               //1 左端左下笔划
         LSC=1;LSB=1;LSA=1;
         delayms(500);
      
         P0=0x08;               //8 下笔划 从左往右
         LSC=1;LSB=1;LSA=1;
         delayms(500);
      

         P0=0x08;              //7    下笔划 从左往右
          LSC=1;LSB=1;LSA=0;
         delayms(500);
                                 
         P0=0x04;               //1 右端右下笔划
         LSC=1;LSB=1;LSA=0;                          
         delayms(500);      
                  
         P0=0x02;                //1 右端右上笔划   
         LSC=1;LSB=1;LSA=0;                           
         delayms(500);
         }

         
           for(zheng=0;zheng<4;zheng++)
         { P0=0x01;              //7 上笔划从左往右      正转
         LSC=1;LSB=1;LSA=1;      
         delayms(500);

         P0=0x01;                //8  上笔划从右往左
         LSC=1;LSB=1;LSA=0;
         delayms(500);
      
          P0=0x02;               //1 右端右上笔划   
         LSC=1;LSB=1;LSA=0;                           
         delayms(500);

         P0=0x04;                //1 右端右下笔划
         LSC=1;LSB=1;LSA=0;                          
         delayms(500);  
        
         P0=0x08;              //7    下笔划 从右往左
          LSC=1;LSB=1;LSA=0;
         delayms(500);
                        
         P0=0x08;                //8 下笔划 从右往左
         LSC=1;LSB=1;LSA=1;
         delayms(500);
      
        
         P0=0x10;                //1 左端左下笔划
         LSC=1;LSB=1;LSA=1;
         delayms(500);
      

         P0=0x20;               //8 左端左上笔划
         LSC=1;LSB=1;LSA=1;
         delayms(500);
         }
        
      }
}




捕获.PNG
e9b8faf54eb8f9c8c116942d2e21d45f.gif





回复

使用道具 举报

ID:94031 发表于 2022-9-24 18:20 | 显示全部楼层
先想办法让指定的段亮起来,然后按顺序执行,就实现了数码管笔划跑马灯。
回复

使用道具 举报

ID:16255 发表于 2022-9-24 18:43 | 显示全部楼层
先显示 [ ] ,再逐段熄灭。
回复

使用道具 举报

ID:1044091 发表于 2022-9-24 20:26 | 显示全部楼层
遇到一个新问题:把代码带入主程序,也许是delay时间太长,主程序都不干活了,电机不转了调短delay时间,电机转了,显示效果又太差了
回复

使用道具 举报

ID:384109 发表于 2022-9-24 20:51 | 显示全部楼层
把现在代码里的显示数据取个反
回复

使用道具 举报

ID:213173 发表于 2022-9-24 21:05 | 显示全部楼层
无标题.jpg
示例程序 仿真.rar (126.08 KB, 下载次数: 14)



回复

使用道具 举报

ID:1007932 发表于 2022-9-24 21:15 | 显示全部楼层
你的想法没错,就是万能的状态机嘛,一个个写倒是没必要,又不是Verilog,完全可以用数组存储状态,然后循环调用
你的P0不复位确定不会影响下一个状态?
回复

使用道具 举报

ID:137736 发表于 2022-9-24 21:26 | 显示全部楼层
看原理图,找到每段对应代码,做个数组,按顺序读出数字中数字输出到端口。
回复

使用道具 举报

ID:1034262 发表于 2022-9-24 22:30 | 显示全部楼层
像显示数字那样,搞个字形,按数字那样显示。
回复

使用道具 举报

ID:1044091 发表于 2022-9-24 23:44 | 显示全部楼层
感谢各位前辈指导,尤其感谢8楼wulin大师,您这个代码容我好好消化下,脑子已经绕晕了
回复

使用道具 举报

ID:332444 发表于 2022-9-25 03:58 | 显示全部楼层
15,14,13,11,7,57,49,41,25,56
回复

使用道具 举报

ID:213173 发表于 2022-9-25 06:37 | 显示全部楼层
ningsy 发表于 2022-9-24 23:44
感谢各位前辈指导,尤其感谢8楼wulin大师,您这个代码容我好好消化下,脑子已经绕晕了

给你补充正反转显示,纠正s的数据类型。
示例程序 仿真.rar (126.79 KB, 下载次数: 14)

回复

使用道具 举报

ID:1044091 发表于 2022-9-25 13:05 | 显示全部楼层
wulin 发表于 2022-9-25 06:37
给你补充正反转显示,纠正s的数据类型。

多谢大师指导,感觉您代码里有好多技巧,C语言控制单片机已经用的得心应手了,我还得继续学习提高啊!
回复

使用道具 举报

ID:123289 发表于 2022-9-26 11:15 | 显示全部楼层
很简单的事:
台面上无论有多少个LED灯,只要你能将特定的一些LED灯,轮流亮、灭就达成了跑马了。
举一反三:滚字、闪动、闪光标、斜走字都一样。
下面教你一个通用的方式:
本例你有4个数码管,计8*4个LED灯。
1、用一个数组来表达每一个LED的明暗,本例:一个数组=4个字节,计32位,每位的0/1对应一个LED灯的暗/明。
2、将每一种显示状态用一个这个数组用表达:例如:全亮={FFH,FFH,FFH,FFH};全暗={00H,00H,00H,00H},如此你有100个状态,就建立100数组。
本例转一圈,共状态,建8个数组就行了。
3、写个程序,每间隔一段时间依序取出一组数据,送至IO口去显示LED……,循环重复。
以上思路简单、清晰、还易实现。显示机动灵活,修改数组就玩转了各种显示方式了。
如果是点阵LED,做个红心,弄个灯塔,摆个方阵,上移、下跳、斜跑……随意,全在数组中编辑(EXCEL表中排排,导入到数组中),程序都不用改动。
回复

使用道具 举报

ID:1044091 发表于 2022-9-26 14:17 | 显示全部楼层
yzwzfyz 发表于 2022-9-26 11:15
很简单的事:
台面上无论有多少个LED灯,只要你能将特定的一些LED灯,轮流亮、灭就达成了跑马了。
举一反 ...

谢大师指点,B站上有高手做了一个数码管跑马灯视频,正反流水、斜跑、追光等等很多复杂效果,很是酷炫。我刚学51,C语言基础不扎实,属于现学现卖的程度,现在是一看数组就头晕的状态

https://www.bilibili.com/video/BV1fJ411b7cU/?spm_id_from=333.337.search-card.all.click

回复

使用道具 举报

ID:384109 发表于 2022-9-26 14:40 | 显示全部楼层
最简单的是根据要显示的内容直接对显示变量进行位操作,就不用考虑数组了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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