|
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 |
|
11-12-2011, 11:11 AM | #1 |
Đệ tử 2 túi
|
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 ???????????
__________________
------------------Tham gia diễn đàn với tinh thần: HỌC HỎI LÀ CHÍNH---------------------- |
13-12-2011, 07:52 PM | #2 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
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. |
13-12-2011, 07:53 PM | #3 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
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 thay đổi nội dung bởi: nhanh0112, 13-12-2011 lúc 07:59 PM. |
14-12-2011, 03:46 PM | #4 |
Đệ tử 2 túi
|
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 !
__________________
------------------Tham gia diễn đàn với tinh thần: HỌC HỎI LÀ CHÍNH---------------------- |
14-12-2011, 10:29 PM | #5 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
Đó 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.
|
14-12-2011, 11:52 PM | #6 |
Đệ tử 2 túi
|
cảm ơn bạn nhiều nghen !
__________________
------------------Tham gia diễn đàn với tinh thần: HỌC HỎI LÀ CHÍNH---------------------- |
15-12-2011, 03:11 AM | #7 |
Đệ tử 2 túi
|
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
__________________
------------------Tham gia diễn đàn với tinh thần: HỌC HỎI LÀ CHÍNH---------------------- |
16-12-2011, 02:52 PM | #8 | |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
Trích:
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; ** |
|
18-12-2011, 12:26 AM | #9 |
Đệ tử 2 túi
|
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.
__________________
------------------Tham gia diễn đàn với tinh thần: HỌC HỎI LÀ CHÍNH---------------------- |
30-03-2012, 11:34 PM | #10 |
Nhập môn đệ tử
Tham gia ngày: Apr 2011
Bài gửi: 4
: |
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 |
01-04-2012, 12:07 AM | #11 |
Nhập môn đệ tử
Tham gia ngày: Apr 2011
Bài gửi: 4
: |
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ỉ
|
10-04-2012, 10:31 PM | #12 |
Nhập môn đệ tử
Tham gia ngày: Apr 2011
Bài gửi: 4
: |
minh ko dùng ngắt time mà chuyen sang dùng delay thì phải sửa lại ntn nhỉ
|
|
|