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)

longtu 15-01-2009 12:27 PM

Trích:

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

Trích:

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

lmd
 
1 Attachment(s)
Trích:

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

Trích:

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

lmd
 
1 Attachment(s)
Trích:

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

Trích:

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

Trích:

Nguyên văn bởi tungtot_vl (Post 22255)
...
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

Trích:

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

Code:

#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

Trích:

Nguyên văn bởi dientudong (Post 22307)
Code:

#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

Trích:

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

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

Trích:

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

Trích:

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

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

quét hàng
 
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

Trích:

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

lmd
 
Trích:

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

lmd
 
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

giúp em lập trình cho chữ chạy từ phải qua trái
 
1 Attachment(s)
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á


Múi giờ GMT. Hiện tại là 04:40 AM.

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