Getting rid of BufferM[][] is pretty easy, if that's all you need to do. Since BufferM[ i][j] is set to BitMask[Message[ i]][j], all you have to do is replace the one instance of BufferM with BitMask, and replace the indices in that way:
void ConvertMsg(String Msg)
{
int MessageLen = Msg.length() + 1;
char Message[MessageLen]; // Can you do this?!?
Msg.toCharArray(Message, MessageLen);
int ni = 0;
// Scanning across the column
for (int i = 0; i <= MessageLen - 2; i++)
{
for (pxl_clmn = 0; pxl_clmn < 21; pxl_clmn++) // Row selection
{
if (pxl_clmn > 19) { //19 is the actual number of columns
pos++;
pxl_clmn = 0;
}
if (pos >= ( MessageLen - 3 ) * 8 - 2) {
pxl_clmn = 21;
}
for (int F = 0; F <= 150; F++) // F controls speed valid variables are 40 to 200
{
digitalWrite (rowArray[ pxl_clmn], HIGH); // Make anode HIGH to turn LED on
PORTL = BitMask[Message[pxl_row]][pxl_clmn + pos]; // Row value directly load to PORTL(pin 41 to 48)
digitalWrite (rowArray[pxl_clmn], LOW); // Turn off column
}
}
}
pos = 0;
}
You're using pxl_clm + pos to index into an array that's only declared as 8 characters big. pxl_clm can be 21? And that works?!?
Also, pxl_row doesn't seem to ever be set. Is it a constant?