View Single Post
Old 11-12-2011, 11:11 AM   #1
fan.pic
Đệ tử 2 túi
 
Tham gia ngày: Mar 2011
Nơi Cư Ngụ: Khoa: Cơ khí - Trường Đại học Bách khoa Đà Nẳng
Bài gửi: 27
:
Send a message via Yahoo to fan.pic
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----------------------
fan.pic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn