về nguyên tắc khi lập trình, tất cả các hoạt dộng xử lý thì trình dịch đã xử lý trên C, đến khi nạp vào chip thì đó chỉ là những giá trị nhị phân 8 bit hoặc 16 bit....
nếu tất cả những gì trên C làn được thì mình cũng có thể tích hợp vào trong chương trình chạy của mình.
hôm nay mình xin trình bày về các cách lập trình để tối ưu tài nguyên của 8051:
1, sử dụng con trỏ thay vì dùng các mảng cố định.
mình xin đưa ra 2 cách để các bạn so sánh: (mình chỉ đưa ra phần chính)
cách 1:
char *chuoi ="EITVIET.COM"; // đây là khai báo kiểu chuỗi kí tự
char *chuoi2="tiennam191";
...............................................
void hienthi1()
{
......xử lý để hiển thị chuỗi "EITVIET.COM" lên LCD, Matrix,...
}
void hienthi2()
{
xử lý để hiển thị chuỗi "tiennam191" lên LCD, Matrix,,....
}
-> về cơ bản thì chúng ta viết ra 2 hàm này ko sai, nhưng vẫn tiêu phí của vđk kha khá bộ nhớ. mình nói như vậy vì các nguyên nhân sau. thứ nhất đây đều là định dạng kiểu chuỗi, chúng đều có thuộc tính về độ dài, mã của các kí tự và dùng chung file "string.h". thứ 2 chúng ta có thể dùng con trỏ để xử lý 2 chuỗi này trong 1 hàm chung.
mình xin đưa ra cách của mình :
#include <stdio.h>
#include <string.h>
unsigned int dodai,i;
void hienthi(char *chuoi) // chuoi sẽ trỏ đến chuỗi mình nhập vào.
{
dodai=strlen(chuoi); // hàm strlen(); sẽ đo độ dài 1 chuỗi, để sử dụng hàm này cần có thư viện string.h
for(i=0;i<dodai;i++) // độ dài chuỗi đã được đo bằng hàm strlen().
{
hienthi_kt(chuoi[i]); // trường hợp này mình dùng trong hiện thị lcd các bạn có thể thay bằng các cách hiện thị khác....
........................... // xử lý thêm các việc khác
}
}

khi sử dụng thì chúng ta nhập luôn chuỗi để ghi vào hàm.
ví dụ : hienthi("EITVIET.COM"); hienthi("tiennam191"); tóm lại các bạn có thể ghi bất kì chuỗi nào vào trong hàm để hiển thị.
qua kinh nghiệm của mình thì mình thấy mảng 1 chiều, 2 chiều,... cũng có thể áp dụng con trỏ, để xử lý.
Mình xin đưa ra ví dụ
Unsigned char sangdan[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
Unsigned char sangmot[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
Unsigned char I;
Void delay(unsigned int tre)
{
While(tre--);
}
Void hienthi(unsigned char *mang)
{
For(i=0;i<8;i++)
{
P0=P3=mang[i];
P1=P2=0x00;
Delay(1000);// trễ 1000*8 uS
}
}
Khi sử dụng chỉ cần gọi : hienthi(sangmot); hienthi(sangdan);
Đây là những kinh nghiệm khi lập trình của mình, hi vọng sẽ có ích cho các bạn.
phần 2: 1 chương trình led trái tim dùng con trỏ.bạn hãy mổ xẻ nó nhé. hi vọng các bạn sẽ phát triển code để có những hiệu ứng đẹp và thuật toán tối ưu hơn. 
#include <regx52.h>
#define tien 1
#define lui 0
unsigned char i,j,k,a,b,c,d,e,f;
unsigned char sm[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xff};
unsigned char sd[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00};
unsigned char td[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
unsigned char pr[]={0x0F,0x87,0xC3,0xE1,0xF0,0xF8,0xFC,0xFE,0xFF};
unsigned char nn[]={0xFE,0xFD,0xFA,0xF5,0xEA,0xD5,0xAA,0x55,0xAA};
unsigned char dn[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0x7E,0x7D,0x7B,0x77,0x6F,0x5F,0x3F,0x3E,
0x3D,0x3B,0x37,0x2F,0x1F,0x1E,0x1D,0x1B,
0x17,0x0F,0x0E,0x0D,0x0B,0x07,0x06,0x05,
0x03,0x02,0x01,0x00};
void delay(unsigned int time) { while(time--); }
unsigned char lb(unsigned char bi)
{
unsigned char j,r;
unsigned int tg;
for(j=0;j<8;j++) { r=(bi&0x01)?1:0;tg|=r;tg<<=1;bi>>=1; }
tg=tg/2;
return tg;
}

void hu1(unsigned char *ma,unsigned char l,unsigned char model,unsigned char ma1,unsigned char ma2,unsigned int tre)
{
for(i=0;i<l;i++) 
{
if(model==tien) { a=ma[i]; b=ma1; c=ma[i]; d=ma1; }
if(model==lui) { a=ma1; b=lb(ma[i]); c=ma1; d=ma[i]; }
delay(tre);
}
for(i=0;i<l;i++) 
{
if(model==tien) { a=ma2 ; b=ma[i]; c=ma2; d=lb(ma[i]); }
if(model==lui) { a=lb(ma[i]); b=ma2; c=lb(ma[i]); d=ma2; }
delay(tre);
}
}
void hu2(unsigned char *ma,unsigned char bd,unsigned char kt,unsigned char chieu,unsigned char dao,unsigned int tre)
{
for(i=bd;i<kt;i++) 
{
if(dao==lui) j=(kt-i-1);
if(dao==tien) j=i;
if(chieu==tien) {a=b=c= ma[j]; d=lb(ma[j]); }
if(chieu==lui ) {a=b=c= lb(ma[j]); d=ma[j]; }
delay(tre);

}
void hu3(unsigned char *ma,unsigned char l,unsigned char gt1,unsigned char chieu,unsigned char dao,unsigned int tre)
{
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=ma[j];b=c=d=~gt1;}
if(chieu==lui ){d=ma[j];a=c=b=~gt1;}
delay(tre);
}
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=gt1;b=ma[j];c=d=~gt1;}
if(chieu==lui ){d=gt1;c=lb(ma[j]);a=b=~gt1;}
delay(tre);
}
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=b=gt1;c=ma[j];d=~gt1;}
if(chieu==lui ){d=c=gt1;b=lb(ma[j]);a=~gt1;}
delay(tre);
}
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=b=c=gt1;d=lb(ma[j]);}
if(chieu==lui ){d=c=b=gt1;a=lb(ma[j]);}
delay(tre);
}
}
void do_nuoc(unsigned char model, unsigned int tre)
{
unsigned char bd=0,kt=0;
for(j=8;j>0;j--)
{
bd=kt;kt=kt+j;
for(i=0;i<9;i++) 

if(model==tien) { a=sm[i]; c=sm[i];} 
if(model==lui ) { b=lb(sm[i]); d=sm[i];} 
delay(tre);
}
for(i=bd;i<kt;i++) 

if(model==tien) {b=dn[i]; d=lb(dn[i]); }
if(model==lui ) {a=lb(dn[i]); c=lb(dn[i]); }
delay(tre);
}

for(i=0;i<36;i++) 

if(model==tien) {b=0x00;d=0x00;a=dn[i];c=dn[i];}
if(model==lui ) {a=0x00;c=0x00;b=lb(dn[i]);d=dn[i];}
delay(tre);
}
}
void nhapnhay(unsigned int tre)
{
for(i=0;i<3;i++) 
{
a=b=c=d=0x00;delay(tre);
a=b=c=d=0xff;delay(tre);
}
}
void main()
{
while(1) 
{
nhapnhay(30000);
hu1(sm,8,tien,0xff,0xff,20000);
hu1(sm,8,lui ,0xff,0xff,20000);
hu2(sm,0,8,tien,tien,20000);
hu2(sm,0,8,lui ,tien,20000);
hu2(sd,0,8,tien,tien,20000);
hu2(sd,0,8,tien,lui ,20000);
hu2(dn,0,36,lui ,tien,20000);
hu1(sd,8,tien,0xff,0x00,20000);
hu1(td,8,tien,0x00,0xff,20000);
hu1(sd,8,lui ,0xff,0x00,20000);
hu1(td,8,lui ,0x00,0xff,20000);
hu3(sd,8,0x00,tien,tien,20000);
hu3(td,8,0xff,lui ,tien,20000);
hu3(sd,8,0x00,lui ,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
do_nuoc(lui ,20000);
nhapnhay(30000);
hu2(dn,0,36,tien,tien,20000);
hu2(sd,0,8,tien,lui ,20000);
hu2(sd,0,8,tien,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
do_nuoc(tien,20000);
hu2(dn,0,26,tien,tien,20000);
hu2(pr,0,7,tien,tien,35000);
hu2(dn,14,26,lui,tien,20000);
hu2(pr,0,7,lui,tien,30000);
hu2(dn,14,36,tien,tien,20000);
hu2(sm,0,8,tien,tien,20000);
hu2(sm,0,8,lui ,tien,20000);
hu2(sd,0,8,tien,tien,20000);
hu2(sd,0,8,tien,lui ,20000);
hu2(dn,0,26,tien,tien,20000);
hu2(pr,0,7,tien,tien,35000);
hu2(dn,0,36,lui ,tien,20000);
hu2(pr,0,7,lui,tien,30000);
hu2(dn,14,36,tien,tien,20000);
nhapnhay(30000);
do_nuoc(tien,20000); 
hu1(sm,8,tien,0xff,0xff,20000);
hu1(sm,8,lui ,0xff,0xff,20000);
hu3(sd,8,0x00,tien,tien,20000);
hu3(td,8,0xff,lui ,tien,20000);
hu3(sd,8,0x00,lui ,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
hu1(sd,8,tien,0xff,0x00,20000);
hu1(td,8,tien,0x00,0xff,20000);
hu1(sd,8,lui ,0xff,0x00,20000);
hu1(td,8,lui ,0x00,0xff,20000);
hu3(sd,8,0x00,tien,tien,20000);
hu3(td,8,0xff,lui ,tien,20000);
hu3(sd,8,0x00,lui ,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
do_nuoc(lui ,20000);
hu2(dn,0,26,tien,tien,20000);
hu2(pr,0,7,tien,tien,35000);
hu2(dn,14,26,lui,tien,20000);
hu2(pr,0,7,lui,tien,30000);
}

}