|
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---------------------- |
|
|