Ðăng Nhập

View Full Version : giúp em với về ledmatrix


dungbk49
13-12-2008, 10:27 AM
#include "E:\D cu\INFO\project-pic\matrix\matrix.h"
//#include<font.c>
#use delay(clock=20000000)
#define hang PORTD
#define cot PORTC
#byte PORTD =0x08
#byte PORTC =0x07
#byte trisc =0x87
#byte trisd =0x88
unsigned char chuA[]={
0b00010000,
0b00011000,
0b00010100,
0b00011100,
0b00010010,
0b00011010,
0b00010110,
0b00011110 ,

0b00100000,
0b00101000,
0b00100100,
0b00101100,
0b00100010,
0b00101010,
0b00100110,
0b00101110,


0b01000000,
0b01001000,
0b01000100,
0b01001100,
0b01000010,
0b01001010,
0b01000110,
0b01001110,

0b10000000,
0b10001000,
0b10000100,
0b10001100,
0b10000010,
0b10001010,
0b10000110,
0b10001110,
};
unsigned char font[]={
255,255,255,255,
// 255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255
131,191,191,191,255,
131,187,185,130,249,255,
131,235,235,247,255,
255,255,255,
239,131,171,187,199,255,
130,255,
129,42,169,255,
131,247,239,131,255,
255,255,255,
251,131,251,255,
131,190,188,131,249,255,
255,255,255,
183,131,191,
199,187,187,199,255,
255,255,
255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255


};



void Display(unsigned char timer1,unsigned char k) {
unsigned char i,j,m,n;
set_tris_d(0);
set_tris_c(0);


for(i=0;i<timer1;i++)
{
m = 0;

for(j=0;j<32;j++)
{

Cot = chuA[j];
hang = 0xff;

// n=j;
if(j >=k)
{

hang = font[m];

m ++;
}
// delay();

}

}
}

void main()
{
unsigned char index;
unsigned char i,j,k=32,m,n;


while(1)
{

Display(900,k);


// Thuc hien dich chu
//for(j=0;j<32;j++)
// {
// font[j] = font[j+1];
// }
k=k-1;

if(k==0){

while(1)
{
Display(900,k);
for(m=0;m<64;m++)
{
font[m]=font[m+1];
// hang = font[m];
// for(m=0;m<16;m++)
}
hang = 0xff;
}
}
}
}


các anh giúp em với em mô phỏng nhưng chưa được như ý lắm
các pro giúp em được không

dungbk49
13-12-2008, 10:30 AM
đây là file mô phỏng của em

dungbk49
13-12-2008, 10:39 AM
file của em đây

dungbk49
13-12-2008, 10:41 AM
các anh sẽ giúp em chứ

dungbk49
14-12-2008, 12:08 PM
#include "E:\D cu\INFO\project-pic\matrix\matrix.h"
//#include<font.c>
#use delay(clock=20000000)
#define hang PORTD
#define cot PORTB
#byte PORTD =0x08
#byte PORTB =0x06
#byte trisb =0x86
#byte trisd =0x88
///////////////////////////////maquetcot////////////////////////////////////////
unsigned char chuA[]={
0b00010000,
0b00011000,
0b00010100,
0b00011100,
0b00010010,
0b00011010,
0b00010110,
0b00011110 ,

0b00100000,
0b00101000,
0b00100100,
0b00101100,
0b00100010,
0b00101010,
0b00100110,
0b00101110,


0b01000000,
0b01001000,
0b01000100,
0b01001100,
0b01000010,
0b01001010,
0b01000110,
0b01001110,

0b10000000,
0b10001000,
0b10000100,
0b10001100,
0b10000010,
0b10001010,
0b10000110,
0b10001110,
};
unsigned char font[]={
255,255,255,255,
// 255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255
131,191,191,191,255,
131,187,185,130,249,255,
131,235,235,247,255,
255,255,255,
239,131,171,187,199,255,
130,255,
129,42,169,255,
131,247,239,131,255,
255,255,255,
251,131,251,255,
131,190,188,131,249,255,
255,255,255,
183,131,191,
199,187,187,199,255,
255,255,
255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255

};
void Display(unsigned char timer1,unsigned char k) {
unsigned char i,j,m,n;
set_tris_d(0);
set_tris_b(0);

for(i=0;i<timer1;i++)
{
m = 0;
for(j=0;j<32;j++)
{

Cot = chuA[j];
hang = 0xff;

// n=j;
if(j >=k)
{
hang = font[m];
m ++;
}
// delay();

}

}
}

void main()
{
unsigned char index;
unsigned char i,j,k=32,m,n;


while(1)
{

Display(900,k);


// Thuc hien dich chu

k=k-1;

if(k==0){

while(1)
{
Display(900,k);
for(m=0;m<64;m++)
{
font[m]=font[m+1];
// hang = font[m];
// for(m=0;m<16;m++)
}
hang = 0xff;
}
}
}
}

em xin lỗi lần trước em post code không đúng, em sửa lại như trên

dungbk49
14-12-2008, 12:12 PM
lần này em gửi file mô phỏng chứ không gửi file ảnh như lần trước nữa. Em dùng proteus v7.1 sp2. không anh nào giúp em à.

tungtot_vl
16-12-2008, 09:40 AM
mạch của bạn báo lôic con 16f877a.
bạn nên bỏ con này và lấy con 16f877 ra và nối lại các dây thì chạy tốt. tôi đã thử rồi, như các chữ hiển thị của bạn bị sai cả rồi (sai code)
bạn xem file này rồi vẽ lại cho gọn nhé

dungbk49
17-12-2008, 01:00 PM
chào anh tungtot_vl cám ơn anh đã giúp đỡ em, anh có thể gửi file mã nguồn về bảng quang cáo mà anh đã làm cho em tham khảo được không anh, mail em là bka_dung@yahoo.com, cám ơn anh nhiều

tungtot_vl
17-12-2008, 05:06 PM
code phải đi liền với phần cứng của nó. nếu bạn đã biết cách làm LMD thì không cần phải xem code của người khác đâu. bạn chỉ cần xem các hiệu ứng của họ rồi tự tìm ra giải thuật để viết code cho mình. tuy nhiên các kiểu hiệu ứng còn tùy thuộc vào phần cứng của bạn có hỗ trợ được hay không. phần cứng của tôi là quét hàng. data được đưa ra 595 như trong mạch mô phỏng.

dungbk49
17-12-2008, 06:17 PM
anh tungtot_vl ơi em hỏi trong mạch của anh có tới 16 hàng, trong khi mạch của em chỉ có 8 hàng, vậy giải thuật có gì khác không anh.

tungtot_vl
18-12-2008, 08:19 AM
nói chung không có gì khác cả chỉ là quét 16 hay quét 8 thôi. đương nhiên số điểm ảnh càng nhiều thì càng tốn thêm nhiều dung lượng bộ nhớ để lưu data. còn về giải thật không có gì thay đổi, chỉ là mở rộng thêm từ 8 nên 16 thôi.

dungbk49
21-12-2008, 12:21 PM
anh ơi em đã làm như anh thay bằng con pic16f877 nhưng không dc, nếu dùng 3 bảng (8x24) thì chạy được anh ạ, còn dùng 4 bảng (8x32) thì khi mô phỏng anh nhìn trong file mô phỏng em gửi nó bị làm sao ấy, đảm bảo với anh code mã font là đúng không sai đâu anh ạ, anh giúp em với.

dungbk49
24-12-2008, 11:49 PM
Không có anh nào giúp em à, em bí quá

tungtot_vl
25-12-2008, 10:13 AM
phần mềm bạn viết không có giải thích và hơi khó hiểu, còn phần cứng thỉ lại phức tạm nên kéo theo phầm mềm cũng phức tạp theo.
theo tôi bạn nên sửa lại phần cứng đơn giản hơn để sau này còn mở rộng bảng lớn hơn. hơn nữa cách quét 138 chỉ là cách cơ bản của những ai mới tập làm quang báo thôi, còn muốn làm tốt hơn bạn nên dùng 595.
phần cứng: ở các chân E2, E3 của 138 bạn có thể nối mass.
các chân A, B, C nên nối với port E (3 chân) để dễ quét hơn bằng cách: for(i = 0;i<8;i++) {porte = i}// giải mã cho 138.
các chân E1 của 138 bạn có thể nối với bất khì port nào của VDK. tốt nhất là nối theo thứ tự các ic 138 vào lần lượt của các chân R0,R1... của VDK để dễ viết code
chúc thành công.

tungtot_vl
25-12-2008, 10:30 AM
bạn ko cần dùng timer để quét led đâu. nên dùng delay thì đơn giản hơn. nếu cảm thấy led còn bị giật thì có thể giảm delay xuống cho phù hợn là được. nếu bạn cải cách phần cứng như tôi nói thì có thể dùng cách sau để hiển thị led
int chon_ic[4] = {0x01, 0x02,0x04,0x08};
void display()
{ int a,b,i;
for(a = 0;a<30;a++) // điều chỉnh tốc độ dịch chữ
{ for(b = 0;b<4;b++)
{ portb = chon_ic[b]; // chọn ic 138 để quet
for(i-0;i<8;i++) {porte = i; delay_ms(1);} // quet 138
}
}
}
tại vị trí cần hiển thị chữ lên led bạn chỉ cần gọi hàm này là được.
còn một điều rất quan trọng là trình mô phỏng rất hạn chế khi quét led, vì nếu thời gian quét càng nhỏ thì đồi hỏi tốc độ xử lý của máy tính càng cao, không đáp ứng được tốc độ quét của vxl do đó cũng có thể hiển thị sai (có thể bị giật hoặc không chạy).

dungbk49
27-12-2008, 05:04 PM
anh tungtot_vl cám ơn anh đã nhiệt tình giúp em quá nhiều rồi, em đã thử làm theo hướng của anh, em mới chỉ làm cho nó hiển thị thôi anh ạ, còn thực hiện dịch chữ thì chưa, nhưng nó giật mạnh quá anh ạ, có giải pháp nào ko anh.

tungtot_vl
29-12-2008, 02:07 PM
việc giật nhiều hay ít tùy thuộc vào cấu hình pc của bạn và tốc độ quét quang báo. tuy nhiên cầu hình pc thì chắc bạn không thể nâng cao hơn được. chỉ còn cách là bạn điều chỉnh tốc độ quét sao cho đạt được mức giật thấp nhất là được. vì nó là trình mô phỏng nên có khác với mạch thực tế. mạch thực tế nếu tốc độ quét càng cao thì ảnh càng mịn (ít giật), nhưng trong mô phỏng thì chưa hẳng như thế. do đó chỉ còn cách là bạn tự điều chỉnh tốc độ quét để đạt được mức giật thấp nhất thôi. tốt nhất là bạn nên làm mạch thực tế để kiểm tra và lắm rỏ hơn về phần cứng

dientudong
31-12-2008, 12:13 PM
Nhờ các bạn xem giúp mình mạch điều khiển led đơn sáng tắt khi nhấn nút. sao mình không cần nhấn mà nó đã hoạt động.

dungbk49
03-01-2009, 01:19 AM
anh tungtot_vl ơi, em làm theo hướng của anh nhưng khi tiến hành dịch chữ thì em không làm được anh ạ, em đã thử áp dụng thuật toán của em đã làm trước đây áp dụng vào cách của anh nhưng ko thể được em bó tay rồi. Hơn nữa trong hàm Display() nếu khai báo là unsigned char m=1 thì nó hiển thị đúng ý đồ (như trong file em gửi kèm) nhưng em muốn chỉ cần trong hàm Display() khai báo là: unsigned char m và trong hàm main khai báo là unsigned char m=1 là đạt được mục đích rồi. Nhưng thực tế lại không như em muốn mà bắt buộc trong hàm Display() phải khai báo là unsigned m=1 thì mới được.
- Hơn nữa em lại chưa làm được phần dịch chữ em chịu thua rồi. Anh giúp em phần dịch chữ được không anh

tungtot_vl
03-01-2009, 08:47 AM
Nhờ các bạn xem giúp mình mạch điều khiển led đơn sáng tắt khi nhấn nút. sao mình không cần nhấn mà nó đã hoạt động.

trong lệnh if của bạn thiếu 1 dấu = phải ghi là if(ra0==1).
vì lệnh if nằm trên vòng lặp white nên khi chay chương trình chương trình chỉ chạy 1 lần lệnh ì trong vòng hàm main nên khi mở mô phỏng lên thì nó đã thực hiển lệnh if rồi trong khi đó bạn chưa kịp nhấn switch nên khi bạn nhấn switch để thục hiện lệnh thì nó không có tác dụng. vì vậy khi bạn nhấn giữ switch và khi đó đồng thời chương trình đang thực hiện lệnh if thì chương trình của bạn mới có tác dụng.
bạn nên bỏ lệnh if phía dưới vòng lặp white thì hiệu quả hơn

nguyenhung1811
03-01-2009, 04:42 PM
nhờ các bạn chỉ giúp mình giải thuật hiển thị chữ và phương pháp chạy chữ với. mình dùng 595 để quét led ma trận ... nhưng đang bí về giai thuật hiển thị chữ. ... ai có tài liệu thì cho mình xin link với nhé. cảm ơn

nguyennam8888
10-01-2009, 02:53 PM
chào các anh , em viết chương trình cho bảng quang báo 16*32 , dùng 4 con 595 để dich data ra cột , còn hàng thì sử dung 2 con 74ls138, em đang gặp rắc rối ở chỗ cho nó chạy chữ tử trái qua phải, các " cao thủ " nào chỉ cho em .
#include "D:\Hoctap\baitapchoPIC\ledmatran.h"

const unsigned int8 K[]={

0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,32,0,56,142,227,0,
0 ,0,80,0,68,81,20,1,
32,40,34,130,68,81,20,1,
64,36,82,134,64,81,20,1,
128,34,138,138,32,81,228,1,
0,33,250,146,16,81,4,1,
128,34,138,162,8,81,4,1,
64,36,138,194,4,81,20,1,
32,200,137,130,124,142,227,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,

0,68,144,44,34,130,28,0,
0,202,144,34,82,134,34,0,
0,81,145,33,138,138,2,0,
0,95,146,225,251,146,2,0,
0,81,148,34,138,162,58,0,
0,81,152,36,138,194,34,0,
0,81,144,40,138,130,60,0,
0,0,0,0,0,0,0,0,

};

int8 i,r;
void main()
{
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);



set_tris_b(0b11110000);
set_tris_c(0x00);
////////////////////////////// hiển thị đata trên 4 matrix
while(1)
{

for(i=0;i<16;i++)
{
spi_write(K[i*4+3])
spi_write(K[i*4+2]);
spi_write(K[i*4+1]);
spi_write(K[i*4+0]);
output_high(pin_C2);
output_low(pin_c2);
delay_us(1300);
output_b(i+32);

}
}

longtu
10-01-2009, 06:40 PM
Viêc hiển tren led matran có 2 công việc chính: 1 là quét hàng, 2 là hien thị dữ liệu.
Việc quét hàng, theo mình nen dùng ngắt Timer để thực hiện, vì khi đó công việc quét hàng đã sảy ra môt cách tự động, khi đó mình không cần quan tấm đến quét hàng nữa mà công việc bay giò là tìm cách hiển thị trên màn hinh led mà thôi.

Để hiển thị trên màn hình led được dễ dàng, bạn nên coi các led là những điểm ảnh(pixel) -->viêc hiển thị trên màn hình led là tìm cách thay đổi giá trị của các điểm ảnh này.

Chính vì vậy, khi làm dến led matran hay là lam quang báo, các bạn nen viết các hàm cơ bản sau:
*point(x,y)//cho phép sáng 1 điểm có tọa độ là (x,y)trên màn hình led
*line(x1,y1,x2,y2)// cho phép sáng 1 đoan thẳng có tọa độ điểm đầu là (x1,y1) và tọa độ điểm cuối (x2,y2).
*area(x1,y1,x2,y2)//cho phep sang 1 vung.

Nếu ban làm duoc như vây thì việc "vẽ" gì lên trên màn hình led hoàn toàn dễ dàng.

Một vài góp ý chia sẽ.

Thân,

nguyennam8888
11-01-2009, 08:28 PM
Viêc hiển tren led matran có 2 công việc chính: 1 là quét hàng, 2 là hien thị dữ liệu.
Việc quét hàng, theo mình nen dùng ngắt Timer để thực hiện, vì khi đó công việc quét hàng đã sảy ra môt cách tự động, khi đó mình không cần quan tấm đến quét hàng nữa mà công việc bay giò là tìm cách hiển thị trên màn hinh led mà thôi.

Để hiển thị trên màn hình led được dễ dàng, bạn nên coi các led là những điểm ảnh(pixel) -->viêc hiển thị trên màn hình led là tìm cách thay đổi giá trị của các điểm ảnh này.

Chính vì vậy, khi làm dến led matran hay là lam quang báo, các bạn nen viết các hàm cơ bản sau:
*point(x,y)//cho phép sáng 1 điểm có tọa độ là (x,y)trên màn hình led
*line(x1,y1,x2,y2)// cho phép sáng 1 đoan thẳng có tọa độ điểm đầu là (x1,y1) và tọa độ điểm cuối (x2,y2).
*area(x1,y1,x2,y2)//cho phep sang 1 vung.

Nếu ban làm duoc như vây thì việc "vẽ" gì lên trên màn hình led hoàn toàn dễ dàng.

Một vài góp ý chia sẽ.

Thân,
em chưa hiểu mấy , em thấy trên diễn dàn hình như là không ai sử dụng các hàm để viết , bác chĩ rõ cho em hiểu thêm bẳng một ví dụ cụ thể đươc không

longtu
12-01-2009, 08:56 AM
Bạn coi màn hình led hiển thị của bạn là các điểm ghép lại. Bây giờ bạn tìm cách điều khiển từng điểm sáng đó đi. Nghĩa là bạn muốn điểm nào sáng hay tắt cũng đựoc. Trước hết bạn cứ tìm hiều như vây đã nhé. Khi nào làm xong chuyện này, mình sẽ goi ý them nhé.

Thân,

longtu
12-01-2009, 09:04 AM
Bạn tham khảo doan code nay nhé:

//cho phep sang 1 diem tren man hình
//cho toa do diem can sang (x,y)
//unsigned char buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT];
void point(int8 x,int8 y)
{
unsigned char *pt;
int8 mask=0b00000001;
int16 j;
mask = mask << (y%8);
pt=&buff_mh[0][0];
// j=(y/6*BITMAP_WIDTH_BIT+x);//hang nay minh ghi nham la chia cho 6
j=(y/8*BITMAP_WIDTH_BIT+x); //Minh sua lại hang này là chia cho 8
pt+=j;
*pt|= mask;
}

Thân,

tungtot_vl
12-01-2009, 11:31 AM
anh tungtot_vl cám ơn anh đã nhiệt tình giúp em quá nhiều rồi, em đã thử làm theo hướng của anh, em mới chỉ làm cho nó hiển thị thôi anh ạ, còn thực hiện dịch chữ thì chưa, nhưng nó giật mạnh quá anh ạ, có giải pháp nào ko anh.

máy hôm nay bận quá không giúp bạn được.
bài của bạn viết khó hiểu quá, vì tôi không hiểu cách trình bày của bạn.
tôi có viết một đoạn code tương thích với phần cứng của bạn. bạn chạy thủ xem thế nào nhé.
cách này viết hơi khó một tí nhưng nó rất thuận lợi để bạn thực hiện các hiệu ứng 1 cách dễ dàng. chúc vui vẽ
#include <16F877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#device 16F877a*=16 ADC=8
#use delay(clock=4000000)
#use fast_io(a)
#byte porta=0x05
#use fast_io(b)
#byte portb=0x06
#use fast_io(c)
#byte portc=0x07
#use fast_io(d)
#byte portd=0x08
#use fast_io(e)
#byte porte=0x09
int8 const font[] = {131,191,191,191,255,
131,187,185,130,249,255,
131,235,235,247,255,
255,255,255,
239,131,171,187,199,255,
130,255,
129,42,169,255,
131,247,239,131,255,
255,255,255,
251,131,251,255,
131,190,188,131,249,255,
255,255,255,
183,131,191,
199,187,187,199,255,
255,255};

int const ic[] = {0x01,0x02,0x04,0x08};
int ht[32]; // ram cho man hinh
void codinh();
void dinhtrai();
void display();
//============================
void codinh()
{ int a,b,c;
for(a=0;a<32;a++)
{ ht[a] = font[a]; }
for(b=0;b<20;b++)// delay
{display();}
}

//=========================
void dinhtrai()
{ int a,b,c;
for(a=0;a<32;a++)
{ ht[a] = 0xff; } // xoa man hinh
for(a=0;a<32;a++)
{ ht[31] = font[a];
display();
for(b=0;b<32;b++)
{ ht[b-1] = ht[b]; }

}
for(a=0;a<32;a++)
{ ht[31] = 0xff;
for(b=0;b<32;b++)
{ ht[b-1] = ht[b]; }
display();
}
}
//========================================
void display()
{ int a,b,i;
for(a=0;a<20;a++) // toc do dich
{
for(b=0;b<4;b++) // chon ic quet
{ portb = ic[b];
for(i=0;i<8;i++)
{
portd = ht[b*8+i];
porte = i;
delay_us(1000);
}
}
}

}
void main()
{
set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_e(0x00);
while(1)
{
codinh();
dinhtrai();
delay_ms(2000);

}

}

tungtot_vl
12-01-2009, 11:39 AM
[QUOTE=nguyennam8888;22058]chào các anh , em viết chương trình cho bảng quang báo 16*32 , dùng 4 con 595 để dich data ra cột , còn hàng thì sử dung 2 con 74ls138, em đang gặp rắc rối ở chỗ cho nó chạy chữ tử trái qua phải, các " cao thủ " nào chỉ cho em .

lmd cơ bản không có gì khó nhưng do chúng ta làm phức tạp chương trình quá nên khó tìm ra cách để thực hiện các hiệu ứng thôi.
trong ccs có các hàm:
rotate_left();
rotate_right();
shift_left();
shift_right();
dùng để dịch các byte trong mãng. nếu bạn muốn dịch trái hay phải một cách đơn giản thì nên sử dụng các hàm này

nguyennam8888
13-01-2009, 03:45 PM
[QUOTE=nguyennam8888;22058]chào các anh , em viết chương trình cho bảng quang báo 16*32 , dùng 4 con 595 để dich data ra cột , còn hàng thì sử dung 2 con 74ls138, em đang gặp rắc rối ở chỗ cho nó chạy chữ tử trái qua phải, các " cao thủ " nào chỉ cho em .

lmd cơ bản không có gì khó nhưng do chúng ta làm phức tạp chương trình quá nên khó tìm ra cách để thực hiện các hiệu ứng thôi.
trong ccs có các hàm:
rotate_left();
rotate_right();
shift_left();
shift_right();
dùng để dịch các byte trong mãng. nếu bạn muốn dịch trái hay phải một cách đơn giản thì nên sử dụng các hàm này

nếu như vậy là dich cả byte chứ, 4 lệnh trên em chưa biết cách sử dụng nó , trong tài liệu CCS tiếng việt cũng không nói nhiều về nó ,Bác chỉ cụ thể cho em đươc không

nguyennam8888
13-01-2009, 03:49 PM
Bạn tham khảo doan code nay nhé:

//cho phep sang 1 diem tren man hình
//cho toa do diem can sang (x,y)
//unsigned char buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT];
void point(int8 x,int8 y)
{
unsigned char *pt;
int8 mask=0b00000001;
int16 j;
mask = mask << (y%8);
pt=&buff_mh[0][0];
j=(y/6*BITMAP_WIDTH_BIT+x);
pt+=j;
*pt|= mask;
}

Thân,

anh , em không hiểu mấy,buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT] là sao, nó có tác dụng gí
pt=&buff_mh[0][0];
j=(y/6*BITMAP_WIDTH_BIT+x);
em cũng không hiểu
mong anh chỉ em cụ thể với , em mới bắt đầu thôi mà

longtu
14-01-2009, 07:15 AM
anh , em không hiểu mấy,buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT] là sao, nó có tác dụng gí
pt=&buff_mh[0][0];
j=(y/6*BITMAP_WIDTH_BIT+x);
em cũng không hiểu
mong anh chỉ em cụ thể với , em mới bắt đầu thôi mà

buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT] :mình coi ma trận led là màn hình Leds, thì đây chính là bộ đệm màn hình Leds(buffer_manhinh) đó, khi mình thay đổi dữ liệu trên bộ đệm này tức là mình đã thay đổi sự hiện thị trên màn hình Leds. Ban tìm hiểu thêm về mảng trong C nhé.

pt=&buff_mh[0][0];//Đây là cách lấy điạ chỉ cho con trỏ. Bạn tìm hiểu thêm về con trỏ trong C nhé.

Thân,

tungtot_vl
14-01-2009, 09:32 AM
[QUOTE=tungtot_vl;22094]

nếu như vậy là dich cả byte chứ, 4 lệnh trên em chưa biết cách sử dụng nó , trong tài liệu CCS tiếng việt cũng không nói nhiều về nó ,Bác chỉ cụ thể cho em đươc không

khi thục hiện lệnh thì nó dịch một bit.
tùy theo chuơng trình của bạn như thế nào mà bạn sử dụng nó cho thích hợp
shift_right(mang,so byte,1 hoặc 0); dich các bit trong mãng sang phải 1 bit sau đó chèn vào giá trị đầu tiên là 1 hoặc 0
shift_left(mang,so byte,1 hoặc 0)
rotate_right(mang,so byte); xoay phải các bit trong mang
rotate_left(mang,so byte);
ví dụ:
mang[2] có các bit là: 0b11110000,0b00001111;
shift_left(mang,2,1); ==>khi đó các bit trong mang là: 0b11100000,0b00011111;
shift_left(mang,2,0); ==>khi đó các bit trong mang là: 0b11100000,0b00011110;
rotate_left(mang,2);==>khi đó các bit trong mang là: 0b11100000,0b00011111;
rotate_right(mang,2);==>khi đó các bit trong mang là: 0b11111000,0b00000111;
các hàm này khi ứng dụng cho dịch trái hay phải thì còn tùy thuộc vào code bạn viết nhé

nguyennam8888
14-01-2009, 10:08 AM
[QUOTE=nguyennam8888;22125]

khi thục hiện lệnh thì nó dịch một bit.
tùy theo chuơng trình của bạn như thế nào mà bạn sử dụng nó cho thích hợp
shift_right(mang,so byte,1 hoặc 0); dich các bit trong mãng sang phải 1 bit sau đó chèn vào giá trị đầu tiên là 1 hoặc 0
shift_left(mang,so byte,1 hoặc 0)
rotate_right(mang,so byte); xoay phải các bit trong mang
rotate_left(mang,so byte);
ví dụ:
mang[2] có các bit là: 0b11110000,0b00001111;
shift_left(mang,2,1); ==>khi đó các bit trong mang là: 0b11100000,0b00011111;
shift_left(mang,2,0); ==>khi đó các bit trong mang là: 0b11100000,0b00011110;
rotate_left(mang,2);==>khi đó các bit trong mang là: 0b11100000,0b00011111;
rotate_right(mang,2);==>khi đó các bit trong mang là: 0b11111000,0b00000111;
các hàm này khi ứng dụng cho dịch trái hay phải thì còn tùy thuộc vào code bạn viết nhé

bây giở giả sừ em có một mảng gồm 4 byte :K[4]= {0b11010101,0b01011011,0b01111000,0b11100011};
em muốn dich phai byte thứ 4 trong mảng với bít đầu tiên của byte thứ 3 trong mảng thì phải làm như thế nào

tungtot_vl
14-01-2009, 11:13 AM
[QUOTE=tungtot_vl;22143]
bây giở giả sừ em có một mảng gồm 4 byte :K[4]= {0b11010101,0b01011011,0b01111000,0b11100011};
em muốn dich phai byte thứ 4 trong mảng với bít đầu tiên của byte thứ 3 trong mảng thì phải làm như thế nào

cái này thì không thực hiện được rồi. vì hàm trên chỉ thực hiện cho số byte là hằng số và bắt đầu từ vị trí byte đầu tiên trong mãng. do đó không thể dịch riêng cho byte số 4 được mà phải dịch cho toàn bộ mãng hoặc dịch các byte đầu tiên trong mãng thì được.
do đó bạn muốn dùng các hàm này để dịch chữ cho LMD thì tốt nhất bạn nên chia mãng hiển thị chữ của bạn ra làm nhiều mãng nhỏ rồi dịch các mãng nhỏ đó
vì bạn dùng 595 để gửi data do đó mỗi data ra 595 là một byte nằm ngang của màn hình hiển thị. nên khi bạn dich byte này sang phải hay sang trái thì màn hình hiển thị sẽ dịch 1 hàng.
nếu bạn dùng LMD 8 hàng thì nên chi làm 8 mãng, mỗi mãng là 1 hàng. do đó dịch mãng 1 sang 1 bước thì các điểm ảnh của màn hình hàng 1 cũng dịch sang 1 bước. do đó khi bạn dịch cả 8 mãng sang một bước thì toàn bộ màn hình cũng dịch sang 1 bước. làm như thế thì bạn đã dịch chữ được sang một bước rồi đó hi hi. cứ như thế lập lại cho đến hết màn hình là được. đơn giản mà phải không

nguyennam8888
14-01-2009, 12:22 PM
em hiểu rồi, nhưng nếu với nhiều hàng thì em có thể đổi mảng data từ mảng một chiều sang mảng hai chiều cũng được phải không, như thế có ổn không anh

tungtot_vl
14-01-2009, 05:28 PM
toàn bộ font tôi điều dùng mãng 1 chiều cả
ví dụ chữ A chiếu 8 byte đầu tiên, chữ B chiếm 8 byte tiếp theo.. trong một mãng.
còn các màn hình hiển thị sẽ chia làm 8 mãng, mỗi mãng lá 1 hàng.
ta chỉ cần lấy data từ font lần lượt cho vào các mãng.
để lấy chữ A ta lấy: mang1[0] = font[0]; mang2[0] = font[1];.. mang8[0] = font[7]; như vậy ta đã lấy chữ A trong font ra để hiển thị trên màn hình và khi đó dùng các lệnh dịch trên để dịch các mãng 1-8 thì chữ A sẽ dịch qua. Do đó trong mãng font bạn có thể chứa bao nhiêu ký tự đã mã hóa sẳn vẫn được, chỉ cần dùng ký tự nào là ta tìm đến vị trí của ký tự đó để lấy nó ra.

nguyennam8888
14-01-2009, 11:20 PM
toàn bộ font tôi điều dùng mãng 1 chiều cả
ví dụ chữ A chiếu 8 byte đầu tiên, chữ B chiếm 8 byte tiếp theo.. trong một mãng.
còn các màn hình hiển thị sẽ chia làm 8 mãng, mỗi mãng lá 1 hàng.
ta chỉ cần lấy data từ font lần lượt cho vào các mãng.
để lấy chữ A ta lấy: mang1[0] = font[0]; mang2[0] = font[1];.. mang8[0] = font[7]; như vậy ta đã lấy chữ A trong font ra để hiển thị trên màn hình và khi đó dùng các lệnh dịch trên để dịch các mãng 1-8 thì chữ A sẽ dịch qua. Do đó trong mãng font bạn có thể chứa bao nhiêu ký tự đã mã hóa sẳn vẫn được, chỉ cần dùng ký tự nào là ta tìm đến vị trí của ký tự đó để lấy nó ra.

rotate_left(mang1[0], 1);
sao nó lại báo lỗi hả anh, báo ở chỗ số 1 ấy

nguyennam8888
14-01-2009, 11:22 PM
buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT] :mình coi ma trận led là màn hình Leds, thì đây chính là bộ đệm màn hình Leds(buffer_manhinh) đó, khi mình thay đổi dữ liệu trên bộ đệm này tức là mình đã thay đổi sự hiện thị trên màn hình Leds. Ban tìm hiểu thêm về mảng trong C nhé.

pt=&buff_mh[0][0];//Đây là cách lấy điạ chỉ cho con trỏ. Bạn tìm hiểu thêm về con trỏ trong C nhé.

Thân,

j=(y/6*BITMAP_WIDTH_BIT+x);cái hàng này em không hiểu

nguyennam8888
15-01-2009, 02:12 AM
bác lại giúp em nha, chương trình em viết giống gợi ý mà vẫn không ổn

tungtot_vl
15-01-2009, 07:41 AM
rotate_left(mang1[0], 1);
sao nó lại báo lỗi hả anh, báo ở chỗ số 1 ấy

nên viết là: rotate_left(mang1, 1);

longtu
15-01-2009, 12:27 PM
j=(y/6*BITMAP_WIDTH_BIT+x);cái hàng này em không hiểu
Tôi giả xử bạn có màn hình led là 16x16, khii đó bạn khai báo Buff_mh như sau:
#define BITMAP_HEIGHT_BYTE] 2
#define BITMAP_WIDTH_BIT 16
unsigned char buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT]
...
Bây giờ giả xử bạn chọn tọa độ (0,0) là điểm led tại góc trái-phía duoi màn hình led. Bây giờ bạn muốn điểm có tọa độ là (0,0) sáng lên, ban chỉ cần goi hàm point(0,0);

void point(int8 x,int8 y)
{
unsigned char *pt;
int8 mask=0b00000001;
int16 j;
mask = mask << (y%8);//xác định vi tri y:
pt=&buff_mh[0][0];
j=(y/8*BITMAP_WIDTH_BIT+x);//xác dinh vi tri x
pt+=j;
*pt|= mask;
}

Xin loi các bạn, doan code nay hom truoc mình viet nhầm hàng này:
j=(y/8*BITMAP_WIDTH_BIT+x);//chia cho 8 chứ khong phai chia 6

Thân,

nguyennam8888
15-01-2009, 04:48 PM
toàn bộ font tôi điều dùng mãng 1 chiều cả
ví dụ chữ A chiếu 8 byte đầu tiên, chữ B chiếm 8 byte tiếp theo.. trong một mãng.
còn các màn hình hiển thị sẽ chia làm 8 mãng, mỗi mãng lá 1 hàng.
ta chỉ cần lấy data từ font lần lượt cho vào các mãng.
để lấy chữ A ta lấy: mang1[0] = font[0]; mang2[0] = font[1];.. mang8[0] = font[7]; như vậy ta đã lấy chữ A trong font ra để hiển thị trên màn hình và khi đó dùng các lệnh dịch trên để dịch các mãng 1-8 thì chữ A sẽ dịch qua. Do đó trong mãng font bạn có thể chứa bao nhiêu ký tự đã mã hóa sẳn vẫn được, chỉ cần dùng ký tự nào là ta tìm đến vị trí của ký tự đó để lấy nó ra.

bác có thể viết mẫu cho em được không, phần cứng mô phỏng trong Protus em gửi ở trên ấy, cảm ơn bác

tungtot_vl
15-01-2009, 06:22 PM
bác có thể viết mẫu cho em được không, phần cứng mô phỏng trong Protus em gửi ở trên ấy, cảm ơn bác

lần này tôi phá giới nhé. lần sau chắc ko rảnh đâu
chúc vui!

nguyennam8888
15-01-2009, 11:00 PM
lần này tôi phá giới nhé. lần sau chắc ko rảnh đâu
chúc vui!

bác cho em font.c luôn nha, font chữ của bac đẹp quá

tungtot_vl
16-01-2009, 08:21 AM
bác cho em font.c luôn nha, font chữ của bac đẹp quá

bac nay duoc voi dòi tiên nhi. tôi chi có font 16 bác lấy về loc ra font 8 nhé.
font này mã hóa ngươc với font trong bài tôi làm cho bác. bác muốn dùng được nó thì có 2 cách:
1: đổi font ngược lại
2: đổi hàm display() ở các hàm output_hight(data); thành output_low(data); và output_low(data); thành output_hight(data);. còn trong hàm rotate thì đổi số 0 thành số 1

nguyennam8888
17-01-2009, 01:26 PM
bac nay duoc voi dòi tiên nhi. tôi chi có font 16 bác lấy về loc ra font 8 nhé.
font này mã hóa ngươc với font trong bài tôi làm cho bác. bác muốn dùng được nó thì có 2 cách:
1: đổi font ngược lại
2: đổi hàm display() ở các hàm output_hight(data); thành output_low(data); và output_low(data); thành output_hight(data);. còn trong hàm rotate thì đổi số 0 thành số 1

bây giờ em muốn nâng nó thành 16 hàng để cho chữ có dấu thì trong chương trình em mới viết có mấy chữ mà đã tốn quá nhiều dung lượng, để viết nhiều chữ thì mình giao tiếp với Ram ngoài .em hỏi là con nào phổ biến nhất cho việc viết quang báo
CHÚC CÁC BÁC ĐÓN TẾT VUI VẺ!!!

tungtot_vl
20-01-2009, 02:08 PM
làm quang báo thì nên dùng pic 18f thì tốt hơn.
pic 16f chỉ cho phép khai báo mãng tối đa khoảng 80 byte còn pic 18f thì khai báo tự do.
pic 18f có nhiều loại dung lượng rom, ram rất lớn như 18f4580 , 18f4680 . bạn có thể lưu font và các thứ vớ vẫn khác vào 2 con này mà ko cần phải sợ thiếu rom hay ram.
hơn nữa pic 16f chỉ ngắt 1 cấp nên khi sử dụng nhiều ngắt đồng thời thì ko dùng được

dientudong
21-01-2009, 12:30 AM
*point(x,y)//cho phép sáng 1 điểm có tọa độ là (x,y)trên màn hình led
*line(x1,y1,x2,y2)// cho phép sáng 1 đoan thẳng có tọa độ điểm đầu là (x1,y1) và tọa độ điểm cuối (x2,y2).
*area(x1,y1,x2,y2)//cho phep sang 1 vung.
Bạn longtu à , cho mình hỏi là hình như trong CCS mình không tìm thấy mấy câu lệnh trên .

namqn
21-01-2009, 01:51 AM
...
hơn nữa pic 16f chỉ ngắt 1 cấp nên khi sử dụng nhiều ngắt đồng thời thì ko dùng được
Các PIC tầm trung (đa số là PIC16) có ngăn xếp cứng 8 cấp, còn PIC18 dùng ngăn xếp mềm (chỉ bị giới hạn bởi dung lượng RAM còn trống). Các PIC tầm trung cải tiến (enhanced mid-range) sắp ra mắt trong năm nay sẽ có ngăn xếp cứng 16 cấp.

Nếu bạn nói về mức ưu tiên thì vẫn có thể dùng nhiều ngắt với PIC16 chỉ có một mức ưu tiên ngắt. Ngay cả có nhiều mức ưu tiên ngắt thì việc xử lý ngắt vẫn diễn ra tuần tự, một cách có ưu tiên, chứ vẫn không thể diễn ra đồng thời.

Thân,

longtu
21-01-2009, 12:03 PM
*point(x,y)//cho phép sáng 1 điểm có tọa độ là (x,y)trên màn hình led
*line(x1,y1,x2,y2)// cho phép sáng 1 đoan thẳng có tọa độ điểm đầu là (x1,y1) và tọa độ điểm cuối (x2,y2).
*area(x1,y1,x2,y2)//cho phep sang 1 vung.
Bạn longtu à , cho mình hỏi là hình như trong CCS mình không tìm thấy mấy câu lệnh trên .

Tấc cả các hàm này là do bạn tự viết ra đấy chứ. Nó không có sẵn đâu bạn.
Ban xem them luong này nhé #41.

Thân,

dientudong
21-01-2009, 01:09 PM
#define BITMAP_HEIGHT_BYTE] 2
#define BITMAP_WIDTH_BIT 16
unsigned char buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT]
Bạn có thể giải thích rõ số 2 và số 16 là gì vậy bạn và bạn giải thích sơ qua về mấy dòng lệnh trên

dientudong
24-01-2009, 09:08 PM
#include "C:\Program Files\PICC\Examples\lenhmoi.h"
#define BITMAP_HEIGHT_BIT 2
#define BITMAP_WIDTH_BIT 16
unsigned char buff_mh[BITMAP_HEIGHT_BIT][BITMAP_WIDTH_BIT ];
void point(int8 x,int8 y)
{
unsigned char *pt;
int8 mask=0b00000001;
int16 j;
mask = mask << (y%8);
pt=&buff_mh[0][0];
j=(y/8*16+x);//xác dinh vi tri x
pt+=j;
*pt|= mask;
}

void main()

{
while(1)
{
point(0,0);
delay_ms(500);
point(1,1);
delay_ms(500);
}
}
Bạn nào làm ơn chỉ cho mình gấp : mình phải khai báo thế nào để mảng 2 chiều trên và các lệnh làm sáng led có hiệu lực trên led ma trận .Mình đang thử dùng mấy lệnh mà bạn longtu giới thiệu nhưng chưa biết sử dụng thế nào.

longtu
02-02-2009, 07:24 AM
#include "C:\Program Files\PICC\Examples\lenhmoi.h"
#define BITMAP_HEIGHT_BIT 2
#define BITMAP_WIDTH_BIT 16
unsigned char buff_mh[BITMAP_HEIGHT_BIT][BITMAP_WIDTH_BIT ];
void point(int8 x,int8 y)
{
unsigned char *pt;
int8 mask=0b00000001;
int16 j;
mask = mask << (y%8);
pt=&buff_mh[0][0];
j=(y/8*16+x);//xác dinh vi tri x
pt+=j;
*pt|= mask;
}

void main()

{
while(1)
{
point(0,0);
delay_ms(500);
point(1,1);
delay_ms(500);
}
}
Bạn nào làm ơn chỉ cho mình gấp : mình phải khai báo thế nào để mảng 2 chiều trên và các lệnh làm sáng led có hiệu lực trên led ma trận .Mình đang thử dùng mấy lệnh mà bạn longtu giới thiệu nhưng chưa biết sử dụng thế nào.

Bạn cho mình xem phần cứng kết nối của bạn di, mình sẽ giúp bạn.

Thân,

longtu
02-02-2009, 07:28 AM
#define BITMAP_HEIGHT_BYTE] 2
#define BITMAP_WIDTH_BIT 16
unsigned char buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT]
Bạn có thể giải thích rõ số 2 và số 16 là gì vậy bạn và bạn giải thích sơ qua về mấy dòng lệnh trên

Với khai báo như vậy, sẽ cho bộ đệm màn hình có 16x16(16 cột x16 hàng)

Thân,

dientudong
02-02-2009, 11:15 AM
hình đây bạn

longtu
02-02-2009, 04:47 PM
Mình đã xem hình của bạn, ma trận led của bạn là 8cot x 8 hàng, bạn bắt đầu làm như sau nhé:

Mình giả sử bạn 8 cột bạn nối với PortB, 8 hàng bạn nối với portD.

bạn khai báo Buff_mh như sau:
#define BITMAP_HEIGHT_BYTE] 1//chiêu cao của buff_mh tính theo byte; 1 byte= 8bit-->8hàng
#define BITMAP_WIDTH_BIT 8//chiều rộng buff_mh tính theo bit; 8bit-->8cột
unsigned char buff_mh[BITMAP_HEIGHT_BYTE][BITMAP_WIDTH_BIT] ;

Bạn viết 1 chương trình lần lượt cấp điện cho từng cột(phương pháp ở dây là quét cột:cấp diện cho cột thứ 1, sau đó ngắt điện cột thứ 1 và cấp điện cho cột thứ 2...). Tương ứng với mỗi làn cấp điện cho từng cột, bạn lấy nội dung của 1 phần từ tương ứng của buff_mh, ví dụ như: bạn muốn cột thứ nhất sáng, dâu tiên bạn phải cấp diên cho cột thứ nhất(portB=0b00000001), sau dó bạn cho PortD=buff_mh[0][0]...portB=0b00000010và portD=buff_mh[0][1], portB=0b00000100và portD=buff_mh[0][2]...Bạn nên dùng Timer de viet doan chuong trinh này, lý do là dể cho viec này thuc hien 1 cách tư dong...(mai mình viet tiep nhé, het gio làm viec o cong ty mat roi)

longtu
03-02-2009, 07:03 AM
Buff_mh: là noi chứa dựng nhưng thông tin bạn càn hiển thị trên matran, muốn thay đổi hiển thị bạn chỉ cần thay doi nội dung của buff_mh(lưu ý là công việc quet led và lấy dữ liệu bạn nên làm 1 cách tự động như trên--> công việc còn lại là thay dổi dữ liệu trong buff_mh-->thay đổi nội dung hiển thị)
Khi bạn làm được những gì như tôi đã nói, lúc đó bạn có thể sử dụng các hàm point(x,y)...bât cứ ở dâu trong chuong trình của bạn vì mục dích của nó là làm thay đổi nội dung của buff_mh(việc quet led và lấy dữ liệu hiển thị đã diễn ra tự động) từ đó làm thay dổi nội dung hiển thị.
Nhìn vào hàm point(x,y):
void point(int8 x,int8 y)
{
unsigned char *pt;
int8 mask=0b00000001;
int16 j;
mask = mask << (y%8);
pt=&buff_mh[0][0];
j=(y/8*16+x);//xác dinh vi tri x
pt+=j;
*pt|= mask;
}
Hiểu rõ đoạn chương trình này, bạn sẽ thấy nó thực chất là các lệnh xoay dữ liệu làm thay đổi 1 bit nào đó ở vị trì tương ứng trong buff_mh.

Trở lại đoạn chương trình bạn đã viết ở #53, chắc bạn cũng nhận ra rằng bạn thiếu mất đoạn chương trình quét và lấy dữ liệu, bạn chỉ thay đổi được nội dung trong buff_mh nhưng những thay đổi đó dâu có được hiển thị.

Bạn làm thử và post lên cho mọi người biết kết quả của bạn nhé.

Thân,

nguyennam8888
03-02-2009, 02:21 PM
làm quang báo thì nên dùng pic 18f thì tốt hơn.
pic 16f chỉ cho phép khai báo mãng tối đa khoảng 80 byte còn pic 18f thì khai báo tự do.
pic 18f có nhiều loại dung lượng rom, ram rất lớn như 18f4580 , 18f4680 . bạn có thể lưu font và các thứ vớ vẫn khác vào 2 con này mà ko cần phải sợ thiếu rom hay ram.
hơn nữa pic 16f chỉ ngắt 1 cấp nên khi sử dụng nhiều ngắt đồng thời thì ko dùng được

với sự chỉ dẫn của bác em đã làm được matran 16*64 cho chữ chạy , cảm ơn bác nhe !
mong bác chỉ em thêm vài cái nữa nhé : em đang tìm hiểu cho chữ chạy dich từng nét xuống và chạy tửng chữ ra giống hết cái bài của bác pots lên đấy. thú thật tại vì nhìn thấy bài của bác chạy " đã quá " nên em mê làm matran rồi. mong bác hướng dẫn cho em. (có thể chỉ em qua mail : nguyen_nam8888@yahoo.com)

nguyennam8888
05-02-2009, 07:34 PM
với sự chỉ dẫn của bác em đã làm được matran 16*64 cho chữ chạy , cảm ơn bác nhe !
mong bác chỉ em thêm vài cái nữa nhé : em đang tìm hiểu cho chữ chạy dich từng nét xuống và chạy tửng chữ ra giống hết cái bài của bác pots lên đấy. thú thật tại vì nhìn thấy bài của bác chạy " đã quá " nên em mê làm matran rồi. mong bác hướng dẫn cho em. (có thể chỉ em qua mail : nguyen_nam8888@yahoo.com)

bác nào giúp em với.Cảm ơn

nguyennam8888
05-02-2009, 07:56 PM
gửi bạn nha

dungbk49
05-02-2009, 11:28 PM
Cám ơn bạn nhiều nhiều

nguyennam8888
08-02-2009, 05:03 PM
có sư huynh nào có tài liệu về giao tiếp cho Pic bằng VB6 thì post cho minh với nha

dungbk49
16-02-2009, 12:02 PM
Em muốn hỏi các anh quét hàng và quét cột khác nhau như thế nào, và người ta thường dùng IC gì để quét hàng

nguyennam8888
18-02-2009, 09:22 AM
Em muốn hỏi các anh quét hàng và quét cột khác nhau như thế nào, và người ta thường dùng IC gì để quét hàng

quét hàng là bạn đưa data ra cột rồi sau đó thực hiện quét hàng để hiển thị , còn quét cột là đưa data ra hàng rồi thực hiện quét cột, tuy nhiên nếu làm nhiều cột thì tần số quét cột phải đảm bảo để hiển thị đươc .Và để làm được bảng quang báo lớn thì người ta sẽ sử dụng các modum ghép lại.Phương pháp quét cột sẽ tốn nhiều chân của VXL trong khi đó nếu quét hàng thì tốn it hơn.Con 74ls138 thường sử dụng để quét hàng ( 8 hàng ) để quét 16 hàng bạn phải ghép 2 con 74ls138 hoẳc con 74hc154.
Chúc bạn thành công

hoc_picpicpic
06-03-2009, 12:49 AM
bác tungtot_vl ơi cho em hỏi . em mới cho chạy được có vài kí tự mà pic6f877a đã báo đầy Ram rồi . giờ em muốn sử dụng Ram & Rom ngoài thì làm thế nào hả bác . Cám ơn bác trước nhé

mtuankct
06-03-2009, 01:31 AM
Theo mình thì với các bảng nhỏ chỉ cần sử dụng mỗi vđk là cũng đủ bộ nhớ rồi trừ khi cần hiện hàng quá lớn, font phức tạp. Bạn nên xem lại phần code, còn nếu muôn thêm ram với rom thì mua mấy con có hỗ trợ giao thức giao tiếp của vdk rồi lắp thêm vào thôi mà

hoc_picpicpic
06-03-2009, 11:13 AM
Vấn đề ở chỗ em thấy các bác sử dụng "đệm màn hình hoặc đệm font " em không hiểu nó hoạt động thế nào ??? . bác chỉ giúp em với được không ?

Mà các bác có chỉ giúp cho em 1 số Ram thông dụng và chuẩn giao tiếp của nó với

mtuankct
06-03-2009, 11:38 AM
Minh chẳng dùng mấy cái này bao giờ nên cũng chẳng biết, muốn biết bạn cứ mở proteus lên tìm trong thư viện của nó chắc có nhiều ah :) vấn đề là không biết con nào mua được thôi :)

tungtot_vl
06-03-2009, 03:04 PM
Vấn đề ở chỗ em thấy các bác sử dụng "đệm màn hình hoặc đệm font " em không hiểu nó hoạt động thế nào ??? . bác chỉ giúp em với được không ?

Mà các bác có chỉ giúp cho em 1 số Ram thông dụng và chuẩn giao tiếp của nó với

đệm font tức là font lưu trong rom của bác lưu rất nhiều ký tự từ a -> z, ký tự hoa, thường có dấu, ko dấu, tiếng hàn quốc... nếu bạn muốn chạy được nhiều hàng chữ khác nhau thì làm cách nào. thế thì bác phải vào font để lựa các chữ bạn cần cho chuỗi đó để lưu vào đệm font (ví dụ cho dòng chữ "học pic" chạy ngang. khi đó bạn vào font trong rom lấy lần lượt các ký tự "h,ọ,c, , p,i,c" để lưu vào đệm font, rồi để thực hiện hiệu ứng chạy ngang bác phải lần lượt cho từng chữ vào bên trái bộ đệm màn hình để cho nó chạy dần qua. tiếp tục cho dòng chữ "16f877a" chạy từ trên xuống. bạn lại tiếp tục vào font tìm các từ "1,6,f,8,7,7,a để lưu vào đệm font rồi từ đệm font đưa vào đệm màn hình để chạy từ trên xuống).
nói chung đệm font là để lưu các ký tự cần hiển thị. đệm màn hình là để thực hiện các kỹ sảo hiệu ứng và nó còn có tác dụng làm cho màn hình hiển thị ko bị giật

hoc_picpicpic
06-03-2009, 09:35 PM
theo em hiểu thì ta sẽ lưu font vào Rom , khi nào cần ta chỉ cần ánh xạ vào kí tự đó và nấy nó ra . thế còn Ram có tác dụng như thế nào hả bác .

tungtot_vl
07-03-2009, 05:54 PM
rom dùng để lưu các hằng số (ko thay đổi giá trị được)
ram dùng để lưu các giá trị tạm thời. có thể thay đổi giá trị được. do đó để thay đổi, chọn lựa các ký tự, hiệu ứng,.. bạn phải lưu vào ram

electronic
07-03-2009, 08:26 PM
Em mới học điện. Mấy anh cho em hỏi chút. Con led ma trận 8x8 2088DHG mới mua về lấy đồng hồ đo sao k thấy sáng con nào cả? Em muốn hỏi thứ tự chân của nó như thế nào? Lấy đồng hồ đo liệu có đủ áp cho nó sáng k?

tungtot_vl
08-03-2009, 07:54 AM
bạn dùng đồng hồ kim đo thì sáng bình thường. xem hình kèm theo.

dungbk49
27-09-2009, 11:51 PM
em có mô phỏng 1 bảng 16x48 đã hiện dc chữ nhưng em chưa làm dc chữ chạy từ phải qua trái. Mong được các anh giúp đỡ.

dungbk49
01-10-2009, 09:53 PM
Không có anh nào giúp em vậy. Em bí quá