找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机点阵程序怎样让移动后的箭头后面灯熄灭呢?

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
#include <reg51.h>
//定义74HC595控制管脚
sbit SCK=P3^6;
sbit RCK=P3^5;
sbit SER=P3^4;
unsigned char matrixLED1[8]={0x00,0x38,0x38,0x38,0xfe,0x7c,0x38,0x10};//LED点阵高电平端口数据
unsigned char temp[8];
unsigned char matrixLED0[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED点阵低电平端口数据
void delay(unsigned int a)
{
   while(a--);
   }
void col_data(unsigned char dat)
{
unsigned char i=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{SER=dat>>7;//!优先传输一个字节中的高位
dat<<=1;
SCK=0;
delay(1);
SCK=1;
delay(1); //上升沿时数据移位
}
RCK=0;
delay(1);
RCK=1;
}
void main()
{
unsigned char i,j,k;
while(1)
   {
for (i=0;i<15;i++)
   {
      if(i<8)
   {
      for(j=0;j<8;j++)  temp[j]=matrixLED0[j]<<(7-i);
         
      }
else
   {
      for(j=0;j<8;j++)
         temp[j]=(matrixLED0[j])&(0xff));

         }
for(k=0;k<5;k++)
   {
   for(j=0;j<8;j++)
      {
         P0=temp[j];
         col_data(matrixLED1[j]);//传送高电平端口数据
         delay(100);
         col_data(0x00);
         }
         }}}}


程序哪里可以让移动后后面的灯熄灭,不至于出现方块移动
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1001921 发表于 2022-1-14 18:00 | 只看该作者
我想让移动后无图案的数组清0,应该就能熄灭,但不知道怎么弄
回复

使用道具 举报

板凳
ID:517466 发表于 2022-1-14 19:49 | 只看该作者
你先搞清楚思路。显示滚动其实就是利用时间差,静态显示数据,形成动态的图案。这个时间差,你可以根据实验结果来调整。在某一个时刻A图,间隔一定时间后,显示B图;再次间隔一定时间显示C图......
具体就是这个思路。按照这个思路,如果想在箭头后清除画面,就是发送能让LED灭掉的数据而已。看你提供的电路图,应该是在显示箭头后的数据中,向P0口发送全1数据即可。即P0=0xFF;
回复

使用道具 举报

地板
ID:624769 发表于 2022-1-14 20:33 | 只看该作者
最简单的方法,就是把 8x8的箭头图,变成 16x8 ,其中8x8还是你原来的箭头,另外的8x8 为全0,然后让它 滚起来。
回复

使用道具 举报

5#
ID:1001921 发表于 2022-1-14 21:52 | 只看该作者
suncat0504 发表于 2022-1-14 19:49
你先搞清楚思路。显示滚动其实就是利用时间差,静态显示数据,形成动态的图案。这个时间差,你可以根据实验 ...

额。道理懂,但是我就是不太会改。我这就是扫描列,然后让列移动。
回复

使用道具 举报

6#
ID:213173 发表于 2022-1-15 08:36 | 只看该作者

  1. #include <reg51.h>
  2. //定义74HC595控制管脚
  3. sbit SCK=P3^6;
  4. sbit RCK=P3^5;
  5. sbit SER=P3^4;
  6. unsigned char matrixLED1[]={0x10,0x38,0x7c,0xfe,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//LED点阵高电平端口数据
  7. unsigned char temp[8];
  8. unsigned char matrixLED0[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED点阵低电平端口数据


  9. void delay(unsigned int a)
  10. {
  11.    while(a--);
  12. }
  13. void col_data(unsigned char dat)
  14. {
  15.         unsigned char i=0;
  16.         for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
  17.         {
  18.                 SER=dat>>7;//!优先传输一个字节中的高位
  19.                 dat<<=1;
  20.                 SCK=0;
  21.                 delay(1);
  22.                 SCK=1;
  23.                 delay(1); //上升沿时数据移位
  24.         }
  25.         RCK=0;
  26.         delay(1);
  27.         RCK=1;
  28. }
  29. void main()
  30. {
  31.         unsigned char i,j,k;
  32.         while(1)
  33.         {
  34.                 P0=0x00;
  35.                 col_data(matrixLED0[i]);
  36.                 P0=matrixLED1[i];
  37.                 i=++i%8;
  38.                 delay(100);
  39.                 j++;
  40.                 if(j>=100)
  41.                 {
  42.                         j=0;
  43.                         matrixLED1[16]=matrixLED1[0];
  44.                         for(k=0;k<16;k++)
  45.                                 matrixLED1[k]=matrixLED1[k+1];
  46.                 }
  47.         }
  48. }
复制代码



回复

使用道具 举报

7#
ID:517466 发表于 2022-1-15 09:20 | 只看该作者
这是我修改后的代码,没有使用595,用P2口代替了
#include <reg51.h>
//定义74HC595控制管脚
sbit SCK=P3^6;
sbit RCK=P3^5;
sbit SER=P3^4;
unsigned char rows[24]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x3e,0x7f,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void delay(unsigned int a)
{
   while(a--);
   }
void col_data(unsigned char dat) {
    unsigned char i=0;
    //循环8次即可将一个字节写入寄存器中
    for(i=0;i<8;i++) {
        SER=dat>>7;//!优先传输一个字节中的高位
        dat<<=1;
        SCK=0;
        delay(1);
        SCK=1;
        delay(1); //上升沿时数据移位
    }
    RCK=0;
    delay(1);
    RCK=1;
}

void main() {
    unsigned char i,j;
    while(1) {
        for(i=0;i<16;i++) {
            for(j=0;j<8;j++) {
                P2=rows[i+j];
                P0=(1<<j)^255;
                delay(1300);
                P0=255;
            }


        }

    }
}

回复

使用道具 举报

8#
ID:517466 发表于 2022-1-15 09:24 | 只看该作者
这是执行效果

demo.zip

346.96 KB, 下载次数: 3

流动箭头的演示

回复

使用道具 举报

9#
ID:517466 发表于 2022-1-15 09:31 | 只看该作者
如果想使用595,那么修改一下代码,增加595部分(红色文字代码)的处理即可:
                P2=rows[i+j];
                col_data(rows[i+j]);

                P0=(1<<j)^255;
电路修改为:

经测试,是一样的效果
回复

使用道具 举报

10#
ID:517466 发表于 2022-1-15 09:44 | 只看该作者
wulin提供代码,可能需要修改点阵LED的接线图,要把器件反转180度后,照图连接。这个需要特别注意。
回复

使用道具 举报

11#
ID:332444 发表于 2022-1-15 13:22 | 只看该作者
用得着写那么多?原本数据不用添加消隐值,重点提示2句完成P0=[cs];QuDong595((cs+d<8?[cs+d]:0x00));数据逐渐消失,数据逐渐出现cs+8-d
回复

使用道具 举报

12#
ID:332444 发表于 2022-1-17 11:53 | 只看该作者
代码简洁源于精妙严谨推敲,看电路写代码,看代码连接电路,看电路改代码,看代码改电路都是基础,初学单片机时,虽然自己有想法能写出来,也希望能多看看别人是如何写的,于是周游论坛,遍览群书,访师寻友只是看看,自己历练才能达到想要的结果。级联595演示只有一个8*8数据,数组不再添加任何值,实现数据出现数据消失,90度转向,实现4个方向花样。

1.gif (562.88 KB, 下载次数: 23)

1.gif
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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