View Single Post
Old 17-01-2013, 11:09 AM   #13
toila83
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 3
:
Trích:
Nguyên văn bởi DT2K50 View Post
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


Bạn viết hàm kiểm tra ký tự A trong ct ngắt là if(IN=="A") nên slave không nhận được, bạn nên sửa lại là if(IN==65), khi nhận B thì là 66..
toila83 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn