极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24202|回复: 10

高人将51点阵LED程序改为ARDUINO程序

[复制链接]
发表于 2014-12-15 20:12:24 | 显示全部楼层 |阅读模式
/*-----------------------------------------------
  名称:16x16点阵
  论坛:www.doflye.net
  编写:shifang
  修改:无
  硬件:LY-LED16x16A 点阵模块
------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h>


unsigned char code tab[]={//
                                       
//取模选择字节倒序 ,正序得出的字是反的,可以在软件中设置自动倒叙


/*--  文字:  汉  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xE4,0x1F,0x48,0x10,0x48,0x10,0x41,0x10,0x82,0x08,0x92,0x08,0x90,0x08,
0x08,0x05,0x08,0x05,0x07,0x02,0x04,0x02,0x04,0x05,0x84,0x08,0x44,0x10,0x30,0x60,

/*--  文字:  字  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x00,0x80,0x00,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,0x00,0x02,0x00,0x01,
0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,

/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x20,0xE4,0x23,0x28,0x22,0x28,0x2A,0xA1,0x2A,0xA2,0x2A,0xA2,0x2A,0xA8,0x2A,
0xA8,0x2A,0xA4,0x2A,0xA7,0x2A,0x84,0x20,0x44,0x21,0x44,0x22,0x24,0x28,0x10,0x10,

/*--  文字:  试  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x14,0x04,0x24,0x08,0x24,0x08,0x04,0xE0,0x7F,0x00,0x04,0x0F,0x04,0xE8,0x07,
0x88,0x04,0x88,0x08,0x88,0x08,0xA8,0x08,0x98,0x53,0xE8,0x50,0x40,0x60,0x00,0x40,

                        };
unsigned int code seg[]=
{
0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
};
/*------------------------------------------------
                硬件端口定义
------------------------------------------------*/
sbit LATCH_B = P2^6; //16行控制,行信号
sbit SRCLK_B= P2^5;
sbit SER_B  = P2^4;


sbit LATCH = P0^2;   //数据控制,列信号
sbit SRCLK= P0^1;
sbit SER= P0^3;

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
                发送字节程序
------------------------------------------------*/
void SendByte(unsigned char dat)
{   
  unsigned char i;
        
   for(i=0;i<8;i++)
        {
         SRCLK=0;
         SER=dat&0x80;
         dat<<=1;
         SRCLK=1;
         }
         
}

void SendByte1(unsigned char dat)
{   
  unsigned char i;
        
   for(i=0;i<8;i++)
        {
         SRCLK_B=0;
         SER_B=dat&0x80;
         dat<<=1;
         SRCLK_B=1;
         }
         
}


void SendSer(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{  
      SendByte(dat1);
      SendByte(dat2);
      SendByte(dat3);
      SendByte(dat4);
          LATCH=1;
      _nop_();
      LATCH=0;
}

/*------------------------------------------------
                发送位码字节程序
               使用另外一片单独595
------------------------------------------------*/
void SendSeg(unsigned int a)
{   

        
      SendByte1(a>>8);
      SendByte1(a);

      LATCH_B=1;    //锁存
      _nop_();
      LATCH_B=0;
         
         
}
/*------------------------------------------------
                   主程序
------------------------------------------------*/
void main()
{
unsigned char i;

while(1)
{


  for(i=0;i<16;i++){
        SendSer(0xff,0xff,0xff,0xff);//清屏
        SendSeg(seg[i]); //开通对应的行
        SendSer(~tab[2*i+33],~tab[32+2*i],~tab[2*i+1],~tab[2*i]);//显示该行数据


//DelayMs(1);
       }
     
  }
}
回复

使用道具 举报

 楼主| 发表于 2014-12-15 20:13:19 | 显示全部楼层
这是显示一块16*16点阵LED的程序,如果能改成16*64点阵就更好了
回复 支持 反对

使用道具 举报

发表于 2014-12-15 22:34:43 | 显示全部楼层
这不是还是51的程序吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-18 21:30:02 | 显示全部楼层
对呀,这就是51程序,我请高人改成ARDUINO版的程序,到底极客有木有高人呢
回复 支持 反对

使用道具 举报

发表于 2014-12-21 22:12:17 | 显示全部楼层
被忽悠了。。
回复 支持 反对

使用道具 举报

发表于 2014-12-21 22:13:29 | 显示全部楼层
《arduino伊始就上手》有相关介绍
回复 支持 反对

使用道具 举报

发表于 2014-12-22 20:32:15 | 显示全部楼层
看来我也是被忽悠过来的呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-24 23:32:05 | 显示全部楼层
自已改的,这块板子显示后两个字有重影,和别的所有板子接口方法不一样
/*-----------------------------------------------
名称:16x16点阵
论坛:www.doflye.net
编写:无名人士
修改:无
硬件:LY-LED16x16A 点阵模块
------------------------------------------------*/
unsigned char tab[]={               
  //取模选择字节倒序 ,正序得出的字是反的,可以在软件中设置自动倒叙

  /*--  文字:  汉  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x00,0x00,0xE4,0x1F,0x48,0x10,0x48,0x10,0x41,0x10,0x82,0x08,0x92,0x08,0x90,0x08,
  0x08,0x05,0x08,0x05,0x07,0x02,0x04,0x02,0x04,0x05,0x84,0x08,0x44,0x10,0x30,0x60,

  /*--  文字:  字  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x40,0x00,0x80,0x00,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,0x00,0x02,0x00,0x01,
  0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,

  /*--  文字:  测  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x00,0x20,0xE4,0x23,0x28,0x22,0x28,0x2A,0xA1,0x2A,0xA2,0x2A,0xA2,0x2A,0xA8,0x2A,
  0xA8,0x2A,0xA4,0x2A,0xA7,0x2A,0x84,0x20,0x44,0x21,0x44,0x22,0x24,0x28,0x10,0x10,

  /*--  文字:  试  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x00,0x14,0x04,0x24,0x08,0x24,0x08,0x04,0xE0,0x7F,0x00,0x04,0x0F,0x04,0xE8,0x07,
  0x88,0x04,0x88,0x08,0x88,0x08,0xA8,0x08,0x98,0x53,0xE8,0x50,0x40,0x60,0x00,0x40,

};
unsigned int seg[]=
{
  0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
};
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
#define RCLKB   2  //行锁存信号,数据传输完成后锁存
#define SRCLKB  3  //行时钟信号
#define SERB    4  //行信号,每次选通一行,高电平有效

#define RCLKA   5    //列锁存信号,数据传输完成后锁存
#define SRCLKA  6 //列时钟信号
#define SERC  7 //列信号,这里是红色点阵列信号

//#define SERA 8 // 列信号,这里是绿色点阵列信号,仅双色点阵时有效


void setup()
{
  pinMode(RCLKB, OUTPUT);
  pinMode(SRCLKB, OUTPUT);
  pinMode(SERB, OUTPUT);
  pinMode(RCLKA, OUTPUT);
  pinMode(SRCLKA, OUTPUT);
  pinMode(SERC, OUTPUT);
  //pinMode(SERA, OUTPUT);

}



/*------------------------------------------------
主程序
------------------------------------------------*/
void loop()
{
  unsigned char i;

// while(1)
//  {
//
  
    for(i=0;i<16;i++){
      SendSer(0xff,0xff,0xff,0xff);//清屏  
      SendSeg(seg[i]); //开通对应的行
      SendSer(~tab[2*i+33],~tab[32+2*i],~tab[2*i+1],~tab[2*i]);//显示该行数据
      // delayMicroseconds(100);
    }

//  }
}



//  发送字节程序
//------------------------------------------------*/

void SendByte(unsigned char dat)
{   
  unsigned char i;

  for(i=0;i<8;i++)
  {
    digitalWrite(SRCLKA,LOW);
    digitalWrite(SERC,dat & 0x80);
    dat<<=1;
    digitalWrite(SRCLKA,HIGH);
  }

}

void SendByte1(unsigned char dat)
{   
  unsigned char i;

  for(i=0;i<8;i++)
  {
    digitalWrite(SRCLKB,LOW);
    digitalWrite(SERB,dat & 0x80);
    dat<<=1;
    digitalWrite(SRCLKB,HIGH);
  }

}


void SendSer(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{  
  SendByte(dat1);
  SendByte(dat2);
  SendByte(dat3);
  SendByte(dat4);
  digitalWrite(RCLKA,HIGH);//锁存
delayMicroseconds(1);
  digitalWrite(RCLKA,LOW);//显示
}

/*------------------------------------------------
发送位码字节程序使用另外一片单独595
------------------------------------------------*/
void SendSeg(unsigned int a)
{   
  SendByte1(a>>8);
  SendByte1(a);
  digitalWrite(RCLKB,HIGH);    //锁存
  delayMicroseconds(1);
  digitalWrite(RCLKB, LOW);//显示

}



回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-24 23:33:14 | 显示全部楼层
根据这个原理,大家可以将51很多程序改为ARDUINO程序
回复 支持 反对

使用道具 举报

发表于 2020-7-12 22:41:25 | 显示全部楼层
很不错想法与做法,学习了!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 01:13 , Processed in 0.041311 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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