Go Down

Topic: LED DOT MATRIX 64x16 (Read 5026 times) previous topic - next topic

limel

Instead I make a dot matrix LED display, I decided to payment already made ??display.

http://www.canton-electronics.com/375mm-64x16-dot-matrix-led-display-for-arduino-uno-r3-mega2560-mcu-sign-project-p-753.html

I trusted the seller's promises: "With the display you get full documentantion and example sketch".

So far I have found that complete documentation is only one demo program which shows the pre-generated text. At my request the seller for additional documentation is a response "that is it".

Code: [Select]
//Author: cantone-electonics
//More information welcome to : http://www.canton-electronics.com
//Arduino 1.0.4
//Arduino uno R3
//64x16 Matrix LED

#define COL_PIXEL     64
#define ROW_PIXEL     16

int latchPin=8; //LT
int clockPin=12;//SK
int dataPin=11; //R1

int en_74138 = 2;
int la_74138 = 3;
int lb_74138 = 4;
int lc_74138 = 5;
int ld_74138 = 6;

unsigned int ROW_xPixel;
unsigned int ROW_num;
unsigned char Col_num_1;
unsigned char Col_num_2;
unsigned char Col_num_3;
unsigned char Col_num_4;
unsigned char Col_num_5;
unsigned char Col_num_6;
unsigned char Col_num_7;
unsigned char Col_num_8;


//Data code: Horizontal modulus ,Bytes reverse order
unsigned char  Bmp1[]=
{
/*------------------------------------------------------------------------------
;  Width X height (pixels): 64X16
;I Love You
------------------------------------------------------------------------------*/
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xc, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x3, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x30, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x3, 0xc0, 0x3, 0x3, 0x30, 0xf0, 0x0, 0xc0, 0xc,
0xf0, 0xc0, 0x0, 0x3, 0x0, 0xc, 0x0, 0x3, 0x30, 0xc, 0x3, 0x30, 0xc, 0x3, 0x0, 0x3, 0xc, 0xc3, 0x0, 0x3, 0x0, 0xc,
0x0, 0x3, 0xc, 0x30, 0x3, 0x30, 0x3, 0xc, 0x0, 0x3, 0x3, 0xcc, 0x0, 0x3, 0x0, 0xc, 0x0, 0x3, 0xc, 0x30, 0x3, 0x30,
0x3, 0xc, 0x0, 0x3, 0x3, 0xcc, 0x0, 0x3, 0x0, 0xc, 0x0, 0x3, 0xc, 0x30, 0x3, 0x30, 0xf, 0xc, 0x0, 0x3, 0x3, 0xcc,
0x0, 0x3, 0x0, 0xc, 0x0, 0x3, 0xc, 0x30, 0x3, 0x30, 0xf3, 0x3, 0x0, 0x3, 0x3, 0xcc, 0x0, 0x3, 0x0, 0xc, 0x0, 0x3,
0xc, 0x30, 0xc, 0xc, 0x3, 0x0, 0x0, 0x3, 0x3, 0xcc, 0x0, 0x3, 0x0, 0xc, 0x0, 0xc3, 0x30, 0xc, 0x30, 0x3, 0x3, 0xc,
0x0, 0x3, 0xc, 0xc3, 0x0, 0x3, 0xc0, 0xff, 0x0, 0xff, 0xc0, 0x3, 0xc0, 0x0, 0xfc, 0x3, 0x0, 0x3, 0xf0, 0x0, 0xff,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
};



unsigned char  Bmp2[]=
{
/*------------------------------------------------------------------------------
; Width X height (pixels): 16X16
;WELCOME 64 16
------------------------------------------------------------------------------*/
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x30, 0xf0, 0xfc, 0xff, 0x3c, 0x0,
0xf0, 0x3f, 0xf0, 0xf, 0x3c, 0x0, 0xcf, 0xff, 0x3f, 0x3c, 0xf0, 0xf0, 0xfc, 0xff, 0x3c, 0x0, 0xfc, 0x3f, 0xfc, 0x3f, 0x3c,
0x0, 0xcf, 0xff, 0x3f, 0x3c, 0xf0, 0xf0, 0x3c, 0x0, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x3c, 0x0, 0xcf, 0x3, 0x0, 0x3c, 0xfc,
0xf0, 0x3c, 0x0, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0xfc, 0xc0, 0xcf, 0x3, 0x0, 0x3c, 0xfc, 0xf0, 0x3c, 0x0, 0x3c, 0x0, 0xf,
0x0, 0xf, 0xf0, 0xfc, 0xf0, 0xcf, 0x3, 0x0, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0xfc, 0xf3, 0xcf,
0xff, 0x3f, 0xf0, 0xfc, 0x3c, 0xfc, 0xff, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x3c, 0x3f, 0xcf, 0xff, 0x3f, 0xf0, 0xfc, 0x3c,
0x3c, 0x0, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x3c, 0x3f, 0xcf, 0x3, 0x0, 0xf0, 0xfc, 0x3c, 0x3c, 0x0, 0x3c, 0x0, 0xf, 0x0,
0xf, 0xf0, 0x3c, 0x3f, 0xcf, 0x3, 0x0, 0xf0, 0xff, 0x3f, 0x3c, 0x0, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x3c, 0x3f, 0xcf, 0x3,
0x0, 0xf0, 0xff, 0x3f, 0x3c, 0x0, 0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x3c, 0x3f, 0xcf, 0x3, 0x0, 0xc0, 0xcf, 0xf, 0x3c, 0x0,
0x3c, 0x0, 0xf, 0x0, 0xf, 0xf0, 0x3c, 0xf, 0xcf, 0x3, 0x0, 0xc0, 0xcf, 0xf, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0x3f, 0xfc, 0x3f,
0x3c, 0xc, 0xcf, 0xff, 0x3f, 0x0, 0x3, 0x3, 0xfc, 0xff, 0xfc, 0xff, 0xf0, 0x3f, 0xf0, 0xf, 0x3c, 0xc, 0xcf, 0xff, 0x3f, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
};


void shiftOut(unsigned char dataOut)
{
 
   for(int i=0;i<=7;i++)
  {
     PORTB &=~(1<<(clockPin-8));//equate digitalWrite(clockPin,LOW);
     
    if(dataOut & (0x01<<i))  PORTB |=1<<(dataPin-8); //equate digitalWrite(dataPin,HIGH);
    else  PORTB &=~(1<<(dataPin-8));//equate digitalWrite(dataPin,LOW);
   
    PORTB |=1<<(clockPin-8);//equate digitalWrite(clockPin,HIGH);
   
  }
}

//Combine 2 bits/pixel to 1 bits/pixel
unsigned char Combine_2BitsTo1Bit(unsigned char num,unsigned char *BMP)
{
 
 unsigned char Col_num_tem_1;
 unsigned char Col_num_tem_2;
 unsigned int Col_num_tem = 0;
 unsigned char i=0;
 unsigned char Col_num_1bit = 0x00;
 
 Col_num_tem_1 = *(BMP+num);
 Col_num_tem_2 = *(BMP+num+1);
 
 Col_num_tem = Col_num_tem_1;
 Col_num_tem |= (Col_num_tem_2 << 8);
 
for(i=0;i<8;i++)
 {  
   if(Col_num_tem&(0x0003<<i*2)) Col_num_1bit |= (0x01<<i);
 }
 return ~Col_num_1bit;
}

//display one picture
void display_martix(unsigned char *BMP)
{
 //Display count
 unsigned int dis_cnt=256;
 unsigned int i;
 
  for(i=0;i<dis_cnt*16;i++)
  {
   
    digitalWrite(en_74138, HIGH);//Turn off display
 
    //Col scanning
   shiftOut(Col_num_1);
   shiftOut(Col_num_2);
   shiftOut(Col_num_3);
   shiftOut(Col_num_4);
   shiftOut(Col_num_5);
   shiftOut(Col_num_6);
   shiftOut(Col_num_7);
   shiftOut(Col_num_8);
 
   digitalWrite(latchPin, LOW);
   digitalWrite(latchPin, HIGH);
 
   //Row scanning
   // AVR Port Operation
   PORTD = ((ROW_xPixel << 3 ) & 0X78) | (PORTD & 0X87);//Write PIN 3 4 5 6 la_74138 lb_74138 lc_74138 ld_74138
   
   digitalWrite(en_74138, LOW);//Turn on display
 

   
   if(ROW_xPixel==15) ROW_xPixel=0; else ROW_xPixel++;
 
  /*
  // Single color,1 bits/pixel
  Col_num_1=~BMP[(COL_PIXEL/8)*ROW_xPixel];
  Col_num_2=~BMP[(COL_PIXEL/8)*ROW_xPixel+1];
  Col_num_3=~BMP[(COL_PIXEL/8)*ROW_xPixel+2];
  Col_num_4=~BMP[(COL_PIXEL/8)*ROW_xPixel+3];
  Col_num_5=~BMP[(COL_PIXEL/8)*ROW_xPixel+4];
  Col_num_6=~BMP[(COL_PIXEL/8)*ROW_xPixel+5];
  Col_num_7=~BMP[(COL_PIXEL/8)*ROW_xPixel+6];
  Col_num_8=~BMP[(COL_PIXEL/8)*ROW_xPixel+7];
*/
 
  //Single color,2 bits/pixel
  Col_num_1 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2,BMP);
  Col_num_2 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+2,BMP);
  Col_num_3 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+4,BMP);
  Col_num_4 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+6,BMP);
  Col_num_5 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+8,BMP);
  Col_num_6 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+10,BMP);
  Col_num_7 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+12,BMP);
  Col_num_8 = Combine_2BitsTo1Bit((COL_PIXEL/8)*ROW_xPixel*2+14,BMP);
 
 // delayMicroseconds(1000);
 
 }
 
}

void setup()
{
 pinMode(latchPin,OUTPUT);
 pinMode(clockPin,OUTPUT);
 pinMode(dataPin,OUTPUT);
 
 pinMode(en_74138,OUTPUT);
 pinMode(la_74138,OUTPUT);
 pinMode(lb_74138,OUTPUT);
 pinMode(lc_74138,OUTPUT);
 pinMode(ld_74138,OUTPUT);
 
 
 digitalWrite(en_74138, LOW);
 
 // AVR Port Settings
 DDRD |= 0x78; //Set PIN 3 4 5 6 output  
 
 
 
 
}




void loop()
{

 
display_martix(Bmp1);

display_martix(Bmp2);




}




I wanted to display date/time and temperature (with DS3231 AT24C32 IIC module precision Real Time Clock modules and DHT22/AM2302 Digital Temperature And Humidity Sensor). No idea how. =(

Unfortunately, later found that other sellers (similar products) added library for easier operation (programming).

I was wondering if anyone has used this display similar purposes and in what way?
Any help is welcome.


PaulRB

Hi limel,

If you do not get a response from someone who was purchased the display from another seller with better software, perhaps you should consider writing a new sketch. Experts on this forum will help if you show that you are willing to learn and do not ask for someone else to write the sketch for you.

The sketch you have been given is useful as a demonstration for how to drive the display, but not very useful for your application.

Here are my suggestions:


  • Consider the display as 2 lines of 16 characters. Plan how you would want to display time, date etc. on this grid

  • Consider what characters you will need: "0".."9" "/" "c" "%" etc.

  • Consider using the SPI pins on the Arduino and the SPI library for best performance

  • Consider using the timer2 library for refreshing the display, so that your main loop() code can use libraries to read the time, temp, humidity etc and use delay() while the display continues to be refreshed without flickering.



I hope these suggestions give you some ideas.

Paul

limel

@Paul,

First of all, thanks for the reply and your suggestions.

To clarify, I'm not looking for someone else to write the sketch for me.
I'm just looking for a library which would be easier to write sketch.

For example, when I write a sketch for TFT touch dispay  I first  find an appropriate library.
Then I start writing me sketch. I never start from "zero", I'm not expert.  ;)

With the help of  uncle "Google" I finally found the appropriate library for my led dot matrix diplay !
Is a library with a few simple functions to begin with display.
So if anyone needs a library for "Driver IC : 74HC245 74HC595  74HC138 74HC04 APM4953" look here:

http://www.instructables.com/id/Pixel-Shipped-Counter/?ALLSTEPS

https://github.com/Seeed-Studio/Ultrathin_LED_Matrix

petabyte

Hi limel!.
Firs of all, sorry for my English.

Could you manage the matrix with success?

Here in spain the adafruit are very expensive and i don't need colors. This matrix is ideal for me.
In your last link, i can see a better libraries with drawPoint, drawrect and drawimage functions  but the product is diferent, only 16x32 matrix. it worked  for "canton electronics" 16x64 display?
Can you scroll text?



xmgar

Hi limel ,

I'm also like you. Few weeks ago I bought the same led matrix display from canton-electronics. and for me it is impossible to understand the documentationI recieved.
I'm trying to make a scoreboard with that matrix display but after two weeks I'm thinking to buy another matrix display that has better library.
┬┐Did you get any library for that matrix?

I need help and I think you are the only one u can do it.
P.D: sorry for my english

Gate-Keeper

Hi Limel

Are you able to create animation for that board? I manage to create simple sketch for the board using an in house application. But, have not yet found a way to animate the text. If you have a sample sketch that animate some text, can you please share it with us?

If anyone is interested in in the application that I am using, please let me know.


petabyte

Hi Gate-Keeper !

i'm trying to understand how it works, but i can't do it. The sample code is a pain, and i don't know how to paint individual pixels.
Please, your code would help me!.


petabyte

i'm writting a library (or something like that) to print text in this led matrix.
I'm new in arduino, and the result won't be the best and quick code, but will work.
The "hello world" is done....when finished i'll post it here..

xmgar

Hi petabyte,

I' also have that matrix display but I still trying to print something. I would be gratefull to show your code.


petabyte

I'll do the code a little more readable and i'll post it here this weekend, i hope.

petabyte

here it is!.

It's not a library, and i'm new in arduino and c languaje. Therefore the code will not be the best, i'm sure, but it works and display text with diferents fonts, in the desired position.

The problem with the "canton electronic" function is that it sends to the matrix a buffer matrix with two bits per pixel and reversed bit weight. I can't understand it enough to modify it for working with a bit per pixel and non reversed bytes.
Therefore, i paint the text (and another effects) in a more confortable matrix called "canvas" with the function:

textToCanvas(unsigned char *font,int fontHeight, int fontWidth, String message, int row, int column)

only one function to all the text sizes. (only tried with 6x5, 8x8 and 16x16, could be errors with other measures).

After that, i translate the canvas to reversed doble bit with translateCanvasToBuffer(). It moves and translate the canvas to the buffer before send it to the matrix.
And finally i send the buffer to the matrix with the original "canton electronics" function. I have added two params to this function, and the setup code, moved to a function for calling it from the main ino project.

There are two versions of this  function , one for the arduino One, and another one for the arduino Mega. I only have an arduino mega, therefore i only tried the Mega version.
Despite this, you shouldn't have any problems with the UNO version. My code is equal in two cases, and i have done the same changes to the two "display_matrix" funtion versions.

I hope it works for you, and the code gives you ideas to paint another things to the matrix.

Dropbox link:

https://www.dropbox.com/l/yGdpSLWI9LWzN1RzJsoI4b?




xmgar

#12
May 06, 2014, 09:30 pm Last Edit: May 06, 2014, 10:08 pm by xmgar Reason: 1
Hi petabyte,

Your  code is very clear and it look well but I would like to know when write any word if that word can remain printed  untill I want to print other word.

Thanks for your code.

petabyte

#13
May 07, 2014, 12:46 pm Last Edit: May 07, 2014, 12:50 pm by petabyte Reason: 1
display_matrix(unsigned char *BMP, int delay_refresco, int sustain)

The sustain parameter is the time text will be visible in the matrix.
If you want to do another things with your code while the text is displayed......it's another question...and i think that you can't do that....

Seems that the matrix haven't persistence itself.The canton electronic function does a loop for mantain the send picture.
You could simulate it by using interrupts, or some thing like that , but the refresh will do for sure flickering problems.
I think this can be the reason for the very low price. Even so, we can buy a cheap 15$ arduino uno only to control the matrix, (sending texts from the main arduino via serial) and still get a very good total cost for a 64x16 matrix.
Now i don't need to do this, because my arduino will only display text and some draws and will not do another things, but may be an idea for you.

xmgar

OK, I will try to creat a library to make my project.
Thanks for your code.

Go Up