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 14-01-2009 07:15 AM

Trích:

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

lmd
 
[QUOTE=nguyennam8888;22125]
Trích:

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

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

lmd
 
[QUOTE=nguyennam8888;22145]
Trích:

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

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.

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

Trích:

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

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

lmd
 
Trích:

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

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


Múi giờ GMT. Hiện tại là 05:52 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