查看: 847|回复: 0
打印 上一主题 下一主题

led 08 接口单元板试验成功(含Arduino源码,连线图)

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-7 18:55:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直想搞搞LED屏玩玩,呵,正好捡了块单元板,顺手玩了一把:

(原文件名SCN1034.JPG)





用arduino驱动的,程序如下:

/*
  

  显示流程:
  1:传送595数据   
  2:关闭EN 1,关闭显示  
  3:切换行信息
  4:刷新595,STB
  5:开EN 0
  6:延时 (刷新率调整)

*/


#define RowA 2    //行信号,驱动138
#define RowB 3
#define RowC 4
#define RowD 5

int hc138en=6; //138 使能

//使用了硬件SPI,以下脚不能更改
#define R1 11          //数据出    MOSI
#define CLK 13         //时钟    SCK
#define STB 10         //595 刷新显示  SS
#define DATAIN  12     //数据入,读FLASH时有用  MISO

byte row=0;
byte hz[] =

{//智[16*16]横排
0x20,0x00,0x22,0x04,0x3F,0x7E,0x48,0x44,
0x08,0x44,0xFF,0xC4,0x10,0x44,0x14,0x7C,
0x22,0x44,0x42,0x10,0x9F,0xF8,0x10,0x10,
0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,
//和[16*16]横排
0x02,0x00,0x07,0x00,0x78,0x00,0x08,0x04,
0x0A,0xFE,0xFF,0x84,0x08,0x84,0x18,0x84,
0x1C,0x84,0x2A,0x84,0x2A,0x84,0x48,0x84,
0x88,0xFC,0x08,0x84,0x08,0x00,0x08,0x00,
//科[16*16]横排
0x04,0x10,0x0E,0x10,0xF8,0x90,0x08,0x50,
0x08,0x10,0xFE,0x90,0x08,0x50,0x1C,0x14,
0x1A,0x1E,0x29,0xF0,0x28,0x10,0x48,0x10,
0x88,0x10,0x08,0x10,0x08,0x10,0x08,0x10,
//技[16*16]横排
0x10,0x40,0x10,0x40,0x10,0x48,0x13,0xFC,
0xFC,0x40,0x10,0x40,0x10,0x40,0x13,0xF8,
0x1A,0x08,0x31,0x10,0xD1,0x10,0x10,0xA0,
0x10,0x40,0x10,0xB0,0x51,0x0E,0x26,0x04};



void spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  //return SPDR;                    // return the received byte
}


void hc138sacn(byte r){  //输出行线状态ABCD (A低,D高)
    digitalWrite(RowA,(r & 0x01));
    digitalWrite(RowB,(r & 0x02));
    digitalWrite(RowC,(r & 0x04));
    digitalWrite(RowD,(r & 0x08));
}
  
void hc595senddata(byte data){// 高位在前  反相(1亮0灭)
for (byte i=0; i<8;i++) {
     digitalWrite(CLK,0);
     if (data & 0x80) {
         digitalWrite(R1, 0);     
     } else {
         digitalWrite(R1, 1);
     }
     data=data<<1;
     digitalWrite(CLK,1);
}

}
  
  
void setup () {

    pinMode(RowA, OUTPUT);
    pinMode(RowB, OUTPUT);
    pinMode(RowC, OUTPUT);
    pinMode(RowD, OUTPUT); //138片选
    pinMode(hc138en, OUTPUT); //138 使能
  
    pinMode(R1, OUTPUT);//595 数据
    pinMode(CLK, OUTPUT); //595 时钟
    pinMode(STB, OUTPUT); //595 使能
    pinMode(DATAIN, INPUT); //595 使能

  
     //digitalWrite(hc138d, HIGH);
    Serial.begin(19200);

    //SPI硬件设置
    // SPCR = 01010000
    //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
    //sample on leading edge of clk,system clock/4 rate (fastest)
    SPCR = (1<<SPE)|(1<<MSTR);
    delay(10);
}
  
void loop () {
if (Serial.available() > 0) {
                // read the incoming byte:
                row = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(row, DEC);
        }

  for(row=0;row<16;row++){

      for (int i=0;i<4;i++){//8片595
         //硬件SPI  发送8字节耗时:22US         
         spi_transfer(~(hz[i*32+row*2]));  //硬件SPI      
         spi_transfer(~(hz[i*32+row*2+1]));  //硬件SPI   

         //软件SPI  发送8字节耗时:770US
         // hc595senddata(hz[i*32+row*2]);
         // hc595senddata(hz[i*32+row*2+1]);         

      }
         

      digitalWrite(hc138en, 1);  //关闭显示
      hc138sacn(row);            //换行
      digitalWrite(STB, 0);      //595刷新      
      digitalWrite(STB, 1);
      delayMicroseconds(500) ;   //节电用,
      digitalWrite(hc138en, 0);  //开启显示

      delayMicroseconds(500) ;  //刷新频率调,差不多60HZ,1/16间隔
   
  }  

}

接线图:


(原文件名:接线图.jpg)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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