自己写的一个行扫描led点阵移动显示程序

<span style="font-size: 24px; line-height: 1.5em; font-family: Arial;">行扫描的接法写个向上移动的程序很容易,列扫描的接法写个左右移动的程序很容易,只是通过字模的数组不同取法就可以实现</span><br style="font-family: Arial; font-size: 14px; line-height: 21.59375px;" /><span style="font-size: 24px; line-height: 1.5em; font-family: Arial;">但上面的接法明显不符合实际要求,行扫描的时候一般都是要左右移动显示,列扫描的时候一般是上下移动显示</span><br style="font-family: Arial; font-size: 14px; line-height: 21.59375px;" /><p><span style="font-size: 24px; line-height: 1.5em; font-family: Arial;">所以我们需要的是行扫描左右移动的程序,列扫描上下移动的程序,这样的程序要用到数组数据的移位操作,下面附上代码:</span></p>
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
#define num 16 //要显示的字模个数
sbit SH_CP=P2^7;
sbit DS=P2^5;
sbit ST_CP=P2^6;
/*硬件连接:74HC595:SH=P2^7;DS=P2^5;ST=P2^6;Q'接到下一个595的DS脚
            74HC154: A:P2^0;B:P2^1;C:P2^2;D:P2^3;*/
uchar code tab[ ]=  //字模:行列式、顺向、阴码
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x08,0x08,0x08,0x11,0x11,0x32,0x50,0x90,0x12,0x12,0x14,0x11,0x10,0x00,0x00,
0x00,0x80,0x80,0x80,0x38,0xC8,0x10,0x40,0x40,0x50,0x4C,0x44,0x40,0xC0,0x00,0x00,/*"你",2*/
0x00,0x00,0x08,0x08,0x10,0x2C,0x75,0x46,0x74,0x44,0x44,0x3C,0x24,0x00,0x00,0x00,
0x00,0x20,0x20,0x40,0x58,0xE8,0x08,0x88,0x48,0x48,0x08,0x08,0x28,0x10,0x00,0x00,/*"的",3*/
0x00,0x09,0x11,0x25,0x45,0x16,0x11,0x26,0x63,0xA5,0x25,0x25,0x29,0x20,0x00,0x00,
0x00,0x10,0x50,0x50,0xD0,0x2C,0xB8,0x48,0x28,0x28,0x10,0xA8,0x46,0x00,0x00,0x00,/*"微",4*/
0x00,0x08,0x0E,0x10,0x25,0x40,0x0F,0x02,0x03,0x3E,0x05,0x08,0x10,0x60,0x00,0x00,
0x00,0x40,0x78,0x80,0x20,0x80,0x00,0x00,0xF0,0x00,0x00,0x80,0x40,0x30,0x1C,0x00,/*"笑",5*/
0x00,0x0F,0x04,0x07,0x04,0x03,0x00,0x3F,0x01,0x09,0x0D,0x13,0x21,0xC0,0x00,0x00,
0xE0,0x20,0x40,0x40,0x40,0x80,0x70,0x80,0x00,0xE0,0x00,0x00,0x80,0x7E,0x00,0x00,/*"是",6*/
0x01,0x01,0x01,0x05,0x19,0x09,0x0F,0x38,0x0A,0x0C,0x38,0xCB,0x18,0x08,0x00,0x00,
0x00,0x00,0x20,0x10,0x00,0x70,0x80,0x90,0xA0,0x40,0xC0,0x24,0x14,0x0C,0x04,0x00,/*"我",7*/
0x03,0x0C,0x0B,0x08,0x07,0x00,0x7F,0x14,0x1D,0x14,0x1C,0x16,0x1D,0x64,0x04,0x00,
0xC0,0x40,0x40,0x40,0x80,0xF8,0x00,0x60,0xA0,0xA0,0x40,0xA0,0x18,0x0E,0x00,0x00,/*"最",8*/
0x00,0x00,0x27,0x14,0x09,0x82,0x44,0x10,0x17,0x21,0x22,0x64,0x48,0x00,0x00,0x00,
0x00,0x78,0x88,0x50,0x20,0x10,0x80,0xF0,0x80,0xC0,0xA0,0x98,0x8E,0x80,0x80,0x00,/*"深",9*/
0x00,0x00,0x08,0x08,0x10,0x2C,0x75,0x46,0x74,0x44,0x44,0x3C,0x24,0x00,0x00,0x00,
0x00,0x20,0x20,0x40,0x58,0xE8,0x08,0x88,0x48,0x48,0x08,0x08,0x28,0x10,0x00,0x00,/*"的",10*/
0x01,0x01,0x0F,0x02,0x04,0x3F,0x21,0x45,0x0F,0x11,0x7F,0x01,0x01,0x01,0x01,0x00,
0x00,0xE0,0x00,0x80,0x78,0x88,0x10,0xE0,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,/*"牵",11*/
0x00,0x08,0x08,0x08,0x0C,0x79,0x08,0x0D,0x18,0x28,0xC9,0x08,0x28,0x13,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0xC0,0x7C,0xC0,0x40,0x70,0xC0,0x40,0x7E,0x80,0x00,0x00,/*"挂",12*/
0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",14*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",14*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",14*/
};
uchar huancun[96]={0};//显示缓存数组,预留多16个用于预装载数据
void delay_ms(unsigned int ms)//延时函数
{
uchar j;
while(ms--)
for(j=0;j<123;j++);
}
void WriteByte(uchar dat)  //向595写入一个字节
{
uchar k;
for(k=0;k<8;k++)
{
  DS=dat&0x01;
  SH_CP=0;
  SH_CP=1;
  dat=dat>>1;
}
}
void main()
{
  uchar i,j,k,n,m,h,offset,temp;
  offset=8;//offset用于把预装载数据移位赋值给数组中的第64~80个数
  while(1)
  {
      for(j=0;j<2*num;j++)
      {
          for(k=0;k<16;k++)//给预留数装载字模数据
          {
            huancun[80+k]=tab[16*j+k];
           }
            for(m=0;m<8;m++)
            {  
               if(offset<1)offset=8;
               offset--;
               for(n=0;n<16;n++)//通过移位给缓存数组装载数据
                {
                 huancun[n]=huancun[n]<<1|(huancun[16+n]>>7&0x01);
                 huancun[16+n]=huancun[16+n]<<1|(huancun[32+n]>>7&0x01);
                 huancun[32+n]=huancun[32+n]<<1|(huancun[48+n]>>7&0x01);
                 huancun[48+n]=huancun[48+n]<<1|(huancun[64+n]>>7&0x01);
                 huancun[64+n]=huancun[64+n]<<1|(huancun[80+n]>>offset&0x01);
                 //重点:把预留的数赋值给第64~80个数,因为预留数是前面固定,此处要用变量offset作为移位量
                 }
                 for(h=0;h<80;h++)//显示数据次数,值越小移动速度越快
                 {
                  for(i=0;i<16;i++)//显示数据
                  {
                    WriteByte(huancun[64+i]);
                     WriteByte(huancun[48+i]);
                     WriteByte(huancun[32+i]);
                     WriteByte(huancun[16+i]);
                     WriteByte(huancun[i]);
                   P2 = temp;//74HC154行扫描扫描
                     ST_CP=0;
                     ST_CP=1;   //上升沿74HC595移位
                     delay_ms(1);
                     temp++;
                     if(temp==16)
                     temp=0;
                    }
                }
            }
        }
    }
}



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值