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)
-   -   không hiểu buffer trong code led matrix (http://www.picvietnam.com/forum/showthread.php?t=12065)

fan.pic 11-12-2011 11:11 AM

không hiểu buffer trong code led matrix
 
minh có đoạn code này, đã mô phỏng thành công
////////////////////////////////////////////////////////////////
//-----------------------LED Matrix 8x48----------------------//
// Phan cung: PIC 16F877 - Crystal 20MHz //
// IC chot dich 74HC595 //
// IC dem dong ULN2803 //
// Copy right: http://www.k43ddk.net //
////////////////////////////////////////////////////////////////

/*-------------------------------------------------------------*/
/*-------------------Khai bao cac thu vien---------------------*/
/*-------------------------------------------------------------*/
#include<16f877a.h>
#include<font5x7.c>
#use delay(clock=20m)

#byte portb = 0x06
#byte portd = 0x08
#byte trisb = 0x86
#byte trisd = 0x88
#byte led_data = portb

#bit clock = Portd.5
#bit latch = portd.6
#bit data = portd.7
/*-------------------------------------------------------------*/
/*----------------------Khai bao cac bien----------------------*/
/*-------------------------------------------------------------*/
int1 array[48];
char Ram[48];//
char display_buffer[48];//4led matran
char font_buffer[6]={0xff,0xff,0xff,0xff,0xff,0xff};//
char const string1[]="abcdefgh";
char addr,size=48,str_len,ky_tu,vi_tri;
/*-------------------------------------------------------------*/
/*---------------------Khai bao mau cac ham--------------------*/
/*-------------------------------------------------------------*/
void HC595_(char);
void leng_str(void);
void coppy_font(void);
void display_R_L(void);
//void display_T_B(void);
/*-------------------------------------------------------------*/
/*------------------------Ngat timer 0-------------------------*/
/*-------------------------------------------------------------*/
#int_timer0
void quet_led(void){//sau 5ms thi thay doi led sang
set_timer0(6);//cai dat gia tri ban dau cho timer0
led_data=0xff;
HC595_(addr);
led_data=display_buffer[addr];
addr++;
if(addr==size){
addr=0;
}
}
/*-------------------------------------------------------------*/
/*----------------------Chuong trinh chinh---------------------*/
/*-------------------------------------------------------------*/
void main(void){
char k;
trisd=0x0; trisb=0x0;
portb=0x0; portd=0x0;

for(k=0;k<size;k++){
display_buffer[k]=0xff;
}

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); //tan so timer0 = precase/32
set_timer0(6); //Dat gia tri ban dau cho RTC
enable_interrupts(global); //Cho phep ngat toan cuc
enable_interrupts(int_rtcc); // Cho phep ngat dem vach

leng_str(); //Lay do dai cua xau can hien thi

while(true){
ky_tu=0;
while(ky_tu<str_len+1){
display_R_L();
delay_ms(50);
}
}
}
/*-------------------------------------------------------------*/
/*---------------------------Cac ham---------------------------*/
/*-------------------------------------------------------------*/
// Ham nap data vao 74HC595
void HC595_(char colum){
char ii=0;
while(ii<colum){
data=0; // Dua bit 0 vao 74HC595
clock=1; // Tao 1 xung o chan clock cua 595 de dua data vao thanh ghi dich
clock=0;
ii++;
}
data=1; // Dua bit 1 vao vi tri cot can hien thi
clock=1; // Tao 1 xung o chan clock cua 595 de dua data vao thanh ghi dich
clock=0;
ii=colum+1;
while(ii<size){
data=0; // Tiep tuc dua bit 0 vao 74HC595
clock=1; // Tao 1 xung o chan clock cua 595 de dua data vao thanh ghi dich
clock=0;
ii++;
}
latch=1; // Sau khi dua du 48 bit vao
latch=0; // Tao 1 xung o chan Latch cua 595 de day data ra
}
// Ham dem do dai chuoi ky tu
void leng_str(void){
str_len=0;
while((string1[str_len])!=0){
str_len++;
if(str_len==255)
break;//Hien thi 255 Ki tu
}
}
// Ham copy font chu vao bo dem
void coppy_font(void){
char jj;
for(jj=0;jj<5;jj++){
font_buffer[jj]=font[(string1[ky_tu]-32)].b[jj];//coppy ma font (5byte) tu ky tu can hien thi vao bo dem buffer_font
}
}
// Ham hien thi
void display_R_L(void){
char kk;
for(kk=0;kk<size;kk++){
display_buffer[kk]=display_buffer[kk+1];
}
display_buffer[size-1]=font_buffer[vi_tri];
vi_tri++;
if(vi_tri>5){//copy het cac byte du lieu tu font_buffer
vi_tri=0;
coppy_font();
ky_tu++;
}
}
/*-------------------------------------------------------------*/
/*--------------------------THE END----------------------------*/
/*-------------------------------------------------------------*
tại sao ở display_buffer là 48 mà không phai la số khác, mình thay lại 32 hoặc 40 thi thấy mô phong không chạy dược ???????????

nhanh0112 13-12-2011 07:52 PM

Ma trận của bạn là 8x48 như vậy sẽ có 48 cột. display_buffer của bạn sẽ có tương ứng 48 phần tử, mỗi phần tử là 8 bit (khai báo char mà).
Như vậy sẽ là 8 bit x 48 phần tử, tương ứng với 8 dòng x 48 cột led.

nhanh0112 13-12-2011 07:53 PM

Ma trận của bạn là 8x48 như vậy sẽ có 48 cột. display_buffer của bạn sẽ có tương ứng 48 phần tử, mỗi phần tử là 8 bit (khai báo char mà).
Như vậy sẽ là 8 bit x 48 phần tử sẽ tương ứng với 8x48 led
Hic... mạng bị lag. Post 2 bài liên. Mod xóa giùm :(

fan.pic 14-12-2011 03:46 PM

nhưng tại sao trong file mô phỏng protues chỉ có 4 led matrix. Nếu như vậy thì phải là 4x8=32 cột mới đúng chứ bạn. không biết 48-32=16 cột còn lại là cái gì ??? Mình vẫn chưa hiểu lắm !

nhanh0112 14-12-2011 10:29 PM

Trích:

Nguyên văn bởi fan.pic (Post 52197)
nhưng tại sao trong file mô phỏng protues chỉ có 4 led matrix. Nếu như vậy thì phải là 4x8=32 cột mới đúng chứ bạn. không biết 48-32=16 cột còn lại là cái gì ??? Mình vẫn chưa hiểu lắm !

Đó là việc mở rộng thêm led, bạn thử lắp thêm vài led nữa xem sao, chắc vẫn chạy thôi. Nếu bạn muốn giảm giá trị của phần tử mạng buffer thì bạn phải giảm nhiều vấn đề khác tương ứng.

fan.pic 14-12-2011 11:52 PM

cảm ơn bạn nhiều nghen !

fan.pic 15-12-2011 03:11 AM

bạn ơi ! mình không hiểu biến addr có khai báo nhưng không gán giá trị ban đầu mà lại gọi hàm HC595_(addr) ???????????
Giải thích giùm mình chổ này với

nhanh0112 16-12-2011 02:52 PM

Trích:

Nguyên văn bởi fan.pic (Post 52219)
bạn ơi ! mình không hiểu biến addr có khai báo nhưng không gán giá trị ban đầu mà lại gọi hàm HC595_(addr) ???????????
Giải thích giùm mình chổ này với

Người viết code ko khởi tạo biến này cũng là một thiếu sót, nhưng thường thì biến khởi tạo có giá trị là 0. Và như đoạn code dưới thì addr sẽ chạy từ 0-size (trường hợp này khai báo ban đầu là size=48). và khi addr=48 thì được thiết lập trở lại addr=0.
Trong tình huống này người viết code này muốn đẩy giá trị ra 595 tương ứng với cột muốn quét đây mà.
**
HC595_(addr);
led_data=display_buffer[addr];
addr++;
if(addr==size){
addr=0;
**

fan.pic 18-12-2011 12:26 AM

cảm ơn bạn nhiều lăm, bây gio thi minh hiểu bản chất của code rồi.

cutieo 30-03-2012 11:34 PM

void leng_str(void){
str_len=0;
while((string1[str_len])!=0){
str_len++;
if(str_len==255)
break;//Hien thi 255 Ki tu
}
}
máy bạn giai thich dum minh cách lấy đô dài của code như thế nào vậy

cutieo 01-04-2012 12:07 AM

vơi lai minh không biết khi nào thi chuong trình con void HC595_(char colum) dược gọi ra nhỉ

cutieo 10-04-2012 10:31 PM

minh ko dùng ngắt time mà chuyen sang dùng delay thì phải sửa lại ntn nhỉ


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