www.pudn.com > TG12864.rar > spi_master1.c


#include "reg932.h" 
#include "stdio.h" 
#include "intrins.h" 
#include "math.h" 
#include "stdlib.h" 
 
#define uchar unsigned char 
#define uint  unsigned int 
#define ulong unsigned long 
code uchar hz1[32]= 
{ 
/*--  ÎÄ×Ö:  Ôç  --*/ 
/*--  ËÎÌå12;  ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x16   --*/ 
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00, 
0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 
}; 
//#define  Wry_command      1 
//#define  Wrn_command      0 
 
uchar xdata RecivedDataBuffer[32];//½ÓÊÜ»º³åÇø 
uchar xdata TXDataBuffer[32]; //·¢ËÍ»º³åÇø 
uchar bdata flag; 
sbit showflag = flag^0; 
//sbit Wr_full = flag^1;  
 
 
//¹Ü½Å¶¨Òå//////////////////////////////////////////////////////////////// 
sbit A0=P2^1; 
sbit CS=P2^4; 
sbit SS_MASTER = P2^7; 
 
//º¯ÊýÁбí////////////////////////////////////////////////////////////////// 
void spi_maser_init(void); 
void wcode(uchar i);  
void wdata(uchar i); 
void Read_slave(uchar Rd_Number,uchar *Payload); 
void Write_slave(uchar Wr_Number, uchar *Data);  
//void lcd_busy(void); 
//void rdata(uchar i); 
void init_12864(void); 
void startline(uchar i); 
void disoff(uchar o); 
void Delay(uint Count) ; 
void setxy (uchar x1,uchar x2,uchar y) ; 
void lw(uchar x, uchar y, uchar dd) ; 
void dh(uchar xx, uchar yy, uchar n, uchar fb); 
void showsing (uchar xx, uchar yy, uchar team[], uchar fb); 
void clear(void); 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void spi_maser_init(void) 
{ 
    P2M1=0x00;  
	P2M2=0x00; 
    SS_MASTER = 1 ; 
    SPSTAT = 0xc0; //Çå³ýSPSTATÖеıê־λ 
    SPCTL  = 0xdd;//Ö÷»ú£¬spiʹÄÜ  
     
	IT1=1; 
    EX1=1; 
    EA=1; 
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
void Delay(uint Count) 
{ 
   uint i,Timer_Count; 
   Timer_Count = Count; 
   for(;Timer_Count > 0;Timer_Count--) 
      for(i = 100;i > 0;i--) 
	     {;} 
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
void Spi_Write(uchar Write_Data) 
{    
    SPSTAT = 0xc0;  
    SPDAT = Write_Data;  
    Delay(2);                                  // Move byte to send to SPI data register 
    while((SPSTAT)&0x80 == 0) ;                // Wait until SPI hs finished transmitting    
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
uchar Spi_Read() 
{ 
    SPSTAT = 0xc0;  
    SPDAT  = 0x00;  
    Delay(2);                                  // Move byte to send to SPI data register 
    while((SPSTAT)&0x80 == 0) ;                // Wait until SPI hs finished transmitting   
    return SPDAT;   
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
void Write_command(uchar Write_Data) 
{ 
    SS_MASTER = 0; 
    Delay(1);  
    Spi_Write(Write_Data); 
    SS_MASTER = 1; 
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
uchar Read_ack(void) 
{    
    uchar ack; 
    SS_MASTER = 0; 
    Delay(1);  
    ack=Spi_Read(); 
    SS_MASTER = 1; 
	return(ack); 
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
void Write_slave(uchar Wr_Number, uchar *Data)  
{ 
  	uchar i; 
    SS_MASTER = 0; 
    Delay(1);     
    //Spi_Write(Command); 
    for(i = 0;i < Wr_Number;i++) 
	   { 
           Spi_Write(*Data); 
	       Data++; 
       } 
	SS_MASTER = 1; 
} 
/**************************************************** 
º¯ÊýÃû³Æ£º 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊý£º 
*****************************************************/ 
void Read_slave(uchar Rd_Number,uchar *Payload) 
{ 
    uchar j; 
	SS_MASTER = 0; 
    Delay(1);     
    //Spi_Write(Command); 
    for(j = 0;j < Rd_Number;j++) 
       { 
           *Payload= Spi_Read(); 
		    Payload++; 
       } 
    SS_MASTER = 1; 
	//Wr_full = 1; 
} 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
//д¿ØÖÆÃüÁîµ½lcd                   
void wcode (uchar i)    //A0=0£¬CS=0 
{   
   SPSTAT=0xc0; 
   CS=1;//_nop_(); 
   A0=0;_nop_(); 
   CS=0;_nop_(); 
   SPDAT=i; 
   while(1) 
   { 
     if(SPSTAT&0x80) break; 
   } 
   CS=1;//_nop_(); 
   //SPSTAT=0xc0; 
}  
   
/**************************************************** 
º¯ÊýÃû³Æ  
º¯Êý¹¦Ä  
´«µÝ²ÎÊ 
*****************************************************/ 
//дÏÔʾÊý¾Ýµ½lcd                  //A0=1£¬CS=0 
void wdata (uchar i)             
{    
   SPSTAT=0xc0; 
   CS=1;//_nop_(); 
   A0=1;_nop_(); 
   CS=0;_nop_(); 
   SPDAT=i;  
   while(1) 
   { 
     if(SPSTAT&0x80) break; 
   } 
   CS=1;//_nop_(); 
   //SPSTAT=0xc0; 
}  
  
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
//Òº¾§ÆÁ³õʼ»¯ 
void init_12864(void) 
{ 
           /*º¯ÊýÃûΪlcd_init µÄLCM³õʼ»¯×Óº¯Êý*/ 
  disoff(0x00);//¿ªÏÔʾÆÁ//0x00¹ØÏÔʾ£»0x01¿ªÏÔʾ////1				  
  wcode(0xa1);  //ÉèÖÃADC ΪÕý³£0---64 ///8 
  wcode(0xa6);//ÉèÖÃÕý³£µÄ¿ª¹Ø×´Ì¬/////9 
  wcode(0x2f);//ÉèÖÃÄÜÁ¿¿ØÖÆ16 
  wcode(0x81);wcode(0x00);//Electronic volume control  setting 18 
  wcode(0xa3);//ÉèÖÃlcd bias///////11 
  wcode(0xc8);///Ñ¡ÔñÊä³ö״̬¼Ä´æÆ÷////15 
  wcode(0xa5);//È«ÆÁÁÁ///10 
  Delay(4);		//////			  
  wcode(0xa4); //Õý³£ÏÔʾ//////	10 
  startline(0x00);//´ÓµÚÒ»ÐпªÊ¼ÏÔʾ//////2 
  clear();//ÇåÆÁ	///	 
  disoff(0x01);//¿ªÏÔʾÆÁ//0x00¹ØÏÔʾ£»0x01¿ªÏÔʾ////1 
}  
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void startline (uchar i) //ÉèÖÃÏÔʾÆðʼÐÐ 
{ 
 i=i+0x40; 
 wcode(i); 
} 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void setxy (uchar x1,uchar x2,uchar y)    //¶¨Î»x·½Ïò¡¢y·½ÏòµÄ×Óº¯Êý 
{ 
  y=y+0xb0; 
  x2=x2+0x10; 
  x1=x1+0x00; 
  wcode(x1); 
  wcode(x2); 
  wcode(y); 
} 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void disoff (uchar o)//ÏÔʾÆÁ¹Ø×Óº¯Êý 
{ 
  o=o+0xae; 
  wcode(o); 
} 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
/*-----------------------------------дÊý¾ÝÖÁLCM×Óº¯Êý----------------------------------*/ 
void lw (uchar x, uchar y, uchar dd) /*º¯ÊýÃûΪlw µÄдÊý¾ÝÖÁLCM×Óº¯Êý¡£¶¨Òåx¡¢y¡¢ddΪÎÞ·ûºÅ 
                                             ×Ö·ûÐ;ֲ¿±äÁ¿*/ 
{uchar temp,x1,x2;                                   //lw×Óº¯Êý¿ªÊ¼	  
 temp=x; 
 x=x&0x0f; 
 x1=x; 
 x=temp; 
 x=x&0xf0; 
 x=x/16; 
 x=x&0x0f; 
 x2=x; 
 setxy(x1,x2,y);				  
 wdata(dd);			 					  
}								  
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void showsing (uchar xx, uchar yy, uchar team[], uchar fb) /*º¯ÊýÃûΪshowsingµÄÏÔʾµ¥¸öºº×Ö×Óº¯Êý¡£ 
                                                           ¶¨Òåxx¡¢yy¡¢n¡¢fbΪÎÞ·ûºÅ×Ö·ûÐ;ֲ¿±äÁ¿¡£ÆäÖÐxx¡¢yyΪÁС¢Ò³¶¨Î»Öµ.´øÊý×éÏÔʾ*/ 
{								      //showsing×Óº¯Êý¿ªÊ¼ 
  uchar i,dx;                        //¶¨Òåi¡¢dxΪÎÞ·ûºÅ×Ö·ûÐ;ֲ¿±äÁ¿ 
  for(i=0;i<16;i++)					  //forÑ­»·Ì壬ÓÃÓÚɨÃ躺×ÖµÄÉϰ벿·Ö 
   {dx=team[i];					      //È¡µÃµÚn¸öºº×ÖµÄÉϰ벿·ÖÊý¾Ý´úÂë 
     if(fb)dx=255-dx;			      //Èôfb²»Îª0£¬»ñµÃ·´°×Êý¾Ý´úÂë 
     lw(xx+i+2,yy+1,dx); 
   }			                      //½«Êý¾Ý´úÂëдÈëLCd 
  for(i=0;i<16;i++)	 
   {dx=team[i+16];				      //È¡µÃµÚn¸öºº×ÖµÄϰ벿·ÖÊý¾Ý´úÂë 
     if(fb)dx=255-dx;				  //Èôfb²»Îª0£¬»ñµÃ·´°×Êý¾Ý´úÂë 
     lw(xx+i+2,yy,dx);			      //½«Êý¾Ý´úÂëдÈëLCM 
   }								  //forÑ­»·Ìå½áÊø 
}								      //dh×Óº¯Êý½áÊø 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void clear(void) 
{ 
    uchar x,y; 
    for(y=0;y<8;y++) 
     { 
       for(x=0;x<=131;x++)  
		     lw(x,y,0x00);   
     } 
} 
 
 
void int1_int() interrupt 2 
{ 
  EA=0; 
  Read_slave(0x20,RecivedDataBuffer); 
  showflag=1; 
  EA=1; 
} 
/**************************************************** 
º¯ÊýÃû³Æ£ 
º¯Êý¹¦ÄÜ 
´«µÝ²ÎÊ 
*****************************************************/ 
void main(void) 
{ 
     //uchar ack_spi; 
     showflag = 0; 
	 //Wr_full = 0; 
 	 spi_maser_init(); 
     init_12864(); 
 
     while(1) 
        { 
        Write_command(0xff); 
//	    ack_spi=Read_ack(); 
	    if(showflag==1) 
	      { 
//	        Read_slave(0x20,RecivedDataBuffer); 
            showsing(0,0,RecivedDataBuffer,0);  
             
		  //	while(1); 
		  //Write_command(0x0f);  
		 // while(1);  
	      } 
        showsing(0,2,hz1,0);  
       } 
    // while(1); 
}