![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Nov 2007
Bài gửi: 20
: |
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.
|
![]() |
![]() |
![]() |
#2 | |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
lmd
Trích:
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); } } |
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
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
|
![]() |
![]() |
![]() |
#4 |
Đệ tử 3 túi
Tham gia ngày: Jul 2007
Bài gửi: 48
: |
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
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 3 túi
Tham gia ngày: Dec 2008
Bài gửi: 50
: |
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); } } thay đổi nội dung bởi: namqn, 10-01-2009 lúc 05:57 PM. |
![]() |
![]() |
![]() |
#6 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
[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 |
![]() |
![]() |
![]() |
#7 | |
Đệ tử 3 túi
Tham gia ngày: Dec 2008
Bài gửi: 50
: |
[QUOTE=tungtot_vl;22094]
Trích:
|
|
![]() |
![]() |
![]() |
#8 | |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
lmd
[QUOTE=nguyennam8888;22125]
Trích:
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é |
|
![]() |
![]() |
![]() |
#9 | |
Đệ tử 3 túi
Tham gia ngày: Dec 2008
Bài gửi: 50
: |
[QUOTE=tungtot_vl;22143]
Trích:
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 |
|
![]() |
![]() |
![]() |
#10 |
Đệ tử 6 túi
|
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,
__________________
-------------------------------------------------------------------------------------- Phùng Minh Tuân Email: tuan.phmt@gmail.com "Cuộc đời sóng gió nuôi ta lớn Bao lần thất bại dạy ta khôn". thay đổi nội dung bởi: longtu, 10-01-2009 lúc 06:41 PM. Lý do: sai chính ta |
![]() |
![]() |
![]() |
#11 | |
Đệ tử 3 túi
Tham gia ngày: Dec 2008
Bài gửi: 50
: |
Trích:
|
|
![]() |
![]() |
![]() |
#12 |
Đệ tử 6 túi
|
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,
__________________
-------------------------------------------------------------------------------------- Phùng Minh Tuân Email: tuan.phmt@gmail.com "Cuộc đời sóng gió nuôi ta lớn Bao lần thất bại dạy ta khôn". |
![]() |
![]() |
![]() |
#13 |
Đệ tử 6 túi
|
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,
__________________
-------------------------------------------------------------------------------------- Phùng Minh Tuân Email: tuan.phmt@gmail.com "Cuộc đời sóng gió nuôi ta lớn Bao lần thất bại dạy ta khôn". thay đổi nội dung bởi: longtu, 15-01-2009 lúc 12:29 PM. Lý do: Ghi nhầm |
![]() |
![]() |
![]() |
#14 | |
Đệ tử 3 túi
Tham gia ngày: Dec 2008
Bài gửi: 50
: |
Trích:
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à |
|
![]() |
![]() |
![]() |
#15 | |
Đệ tử 6 túi
|
Trích:
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,
__________________
-------------------------------------------------------------------------------------- Phùng Minh Tuân Email: tuan.phmt@gmail.com "Cuộc đời sóng gió nuôi ta lớn Bao lần thất bại dạy ta khôn". |
|
![]() |
![]() |