PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   giúp em với về ledmatrix (http://www.picvietnam.com/forum/showthread.php?t=3295)

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

1 Attachment(s)
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

1 Attachment(s)
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

led
 
Trích:

Nguyên văn bởi dientudong (Post 21797)
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

hỏi về giải thuật cho Matrix
 
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 .
Code:

#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

Trích:

Nguyên văn bởi longtu (Post 22068)
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

lmd
 
Trích:

Nguyên văn bởi dungbk49 (Post 21726)
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=tungtot_vl;22094]
Trích:

Nguyên văn bởi nguyennam8888 (Post 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

Trích:

Nguyên văn bởi longtu (Post 22092)
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à


Múi giờ GMT. Hiện tại là 09:46 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam