View Single Post
Old 02-01-2013, 07:22 AM   #11
DT2K50
Nhập môn đệ tử
 
DT2K50's Avatar
 
Tham gia ngày: Sep 2011
Bài gửi: 1
:
[help]-truyền dữ liệu spi với 2 vi đk pic

Chào các anh, chị trong room. đệ đang làm bài toán về spi.nhưng ko hiểu sao mô phỏng ko chạy được.ý tưởng đệ làm như sau:
* master
+ đọc phím bấm gửi kí tự (A-B-C-D)
+ mỗi lần bấm phím (1-2-3-4) led của master(1-2-3-4) và led của slave(5-6-7-8) sẽ sáng.
+ kí thị gửi và nhận đều được hiện thị trên 2 lcd của master và slave
* slave
+đọc phím bấm gửi kí tự (W-X-Y-Z)
+ mỗi lần bấm phím (1-2-3-4) led của slave(1-2-3-4) và led của master(5-6-7-8) sẽ sáng.
+ kí thị gửi và nhận đều được hiện thị trên 2 lcd của slave và master.
Sau đây là chương trình.
1.Chương trình cho Master
[CODE]#include <16f877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use spi(DI=PIN_C4, DO=PIN_C5, CLK=PIN_C3,BITS=16)
// ------------------
int i=0,mode=0;
char OUT,IN;
//-----------------
void docphim();
void led_1();
void sent_spi();
void spi();
//-----------------
#INT_RTCC
void docphim()
{
set_timer0(100);
if(input_state(pin_A0)==0)
i=1;
if(input_state(pin_A0)==1&&i==1)
{
i=0;
mode++;
}
}
//---------------
#INT_SSP
void spi()
{
IN=spi_read(OUT);
delay_ms(10);
if(IN=="W")
{
output_d(0xef);// SANG LED 5
LCD_PutCmd(0xc8);
LCD_PutChar("W");
}
if(IN=="X")
{
output_d(0xdf);// SANG LED 6
LCD_PutCmd(0xc8);
LCD_PutChar("X");
}
if(IN=="Y")
{
output_d(0xbf);// SANG LED 7
LCD_PutCmd(0xc8);
LCD_PutChar("Y");
}
if(IN=="Z")
{
output_d(0x7f);// SANG LED 8
LCD_PutCmd(0xc8);
LCD_PutChar("Z");
}
}

//----------------
void sent_spi()
{
docphim();
switch(mode)
{
case 0:LCD_PutCmd(0x87);LCD_PutChar(" ");
output_d(0xff); // tat het led
break;
case 1:OUT="A";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
delay_ms(10);
spi_write(OUT);
output_d(0xfe);// led 1 sang
break;
case 2:OUT="B";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
delay_ms(10);
spi_write(OUT);
output_d(0xfd);// led 2 sang
break;
case 3:OUT="C";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
delay_ms(10);
spi_write(OUT);
output_d(0xfb);// led 3 sang
break;
case 4:OUT="D";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
delay_ms(10);
spi_write(OUT);
output_d(0xf7);// led 4 sang
break;
default:mode=0;
break;
}
}
//-----------------
void main()
{
setup_spi(spi_master|spi_l_to_h|spi_clk_div_16);
enable_interrupts(INT_SSP);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT );
set_timer0(100);
enable_interrupts(int_RTCC);
enable_interrupts(GLOBAL);
LCD_Init();
LCD_PutCmd(0x80);LCD_PutChar("M-GUI:");
LCD_PutCmd(0xC0);LCD_PutChar("M-NHAN:");
while(true)
{
sent_spi();
spi();
}
}

[CODE]
2.Chương trình cho Slave
[CODE]#include <16f877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20M)
#include <lcd_lib_4bit.c>
#use spi(DI=PIN_C4, DO=PIN_C5, CLK=PIN_C3,BITS=16)
//-------------
char OUT,IN;
int i=0,mode=0;
//-------------
void docphim();
void led_2();
void sent_spi();
void spi();
//----------------
#INT_RTCC
void docphim()
{
set_timer0(100);
if(input_state(pin_A0)==0)
i=1;
if(input_state(pin_A0)==1&&i==1)
{
i=0;
mode++;
}
}
//---------------------
#INT_SSP
void spi()
{
IN=spi_read(OUT);
delay_ms(10);
if(IN=="A")
{
output_d(0xef);// led 5 sang
LCD_PutCmd(0xc8);
LCD_PutChar("A");
}
if(IN=="B")
{
output_d(0xdf);// led 6 sang
LCD_PutCmd(0xc8);
LCD_PutChar("B");
}
if(IN=="C")
{
output_d(0xbf);// led 7 sang
LCD_PutCmd(0xc8);
LCD_PutChar("C");
}
if(IN=="D")
{
output_d(0x7f);// led 8 sang
LCD_PutCmd(0xc8);
LCD_PutChar("D");
}
}
//---------------
void sent_spi()
{
docphim();
switch(mode)
{
case 0:LCD_PutCmd(0x87);LCD_PutChar(" ");
output_d(0xff); // tat het led
break;
case 1:OUT="W";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
spi_write(OUT);
delay_ms(10);
output_d(0xfe);// led 1 sang
break;
case 2:OUT="X";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
spi_write(OUT);
delay_ms(10);
output_d(0xfd);// led 2 sang
break;
case 3:OUT="Y";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
spi_write(OUT);
delay_ms(10);
output_d(0xfb);// led 3 sang
break;
case 4:OUT="Z";
LCD_PutCmd(0x87);LCD_PutChar(OUT);
spi_write(OUT);
delay_ms(10);
output_d(0xf7);// led 4 sang
break;
default:mode=0;
break;
}
}
//----------------
void main()
{
setup_spi(spi_slave|spi_l_to_h|spi_clk_div_16);
enable_interrupts(INT_SSP);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT );
set_timer0(100);
enable_interrupts(int_RTCC);
enable_interrupts(GLOBAL);
LCD_Init();
LCD_PutCmd(0x80);LCD_PutChar("S-GUI:");
LCD_PutCmd(0xC0);LCD_PutChar("S-NHAN:");
while(true)
{
sent_spi();
spi();
}
}

[CODE]
3.Đệ biên dịch k có lỗi, thuật toán không phức tạp , khá dễ hiểu.Để nạp trên Protues, thì sau khi bấm phím để Master truyền qua slave....nhưng đợi mãi mà Slave không thấy nhận để hiện thị LCD và đèn sáng.

Mong các huynh chỉ bảo thêm....đệ đang nghiên cứu pic ...nên còn hơi non..hiii
File Kèm Theo
File Type: rar MO PHONG VA THU VIEN LCD.rar (35.8 KB, 55 lần tải)

thay đổi nội dung bởi: DT2K50, 02-01-2013 lúc 07:24 AM. Lý do: CHƯA BIẾT CHO VÀO THẺ CODE
DT2K50 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn