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


#include               
#include                               
#include                
///////////////////////////////////////////////////////////////////////////// 
#define uchar unsigned char 
#define uint unsigned int 
#define ulong unsigned long 
//////////////////////////////////////////////////////////////////////////////  
code uchar ke[32]= 
{ 
/*--  文字:  克  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/ 
0x00,0x00,0x80,0x43,0x31,0x0F,0x01,0x01,0x01,0x3F,0x41,0x43,0x40,0x40,0x70,0x00, 
0x00,0x04,0x04,0xE4,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0xE4,0x04,0x04,0x00,0x00, 
}; 
 
code uchar num[16*10]=                                            //数字库 
{ 
/*--  文字:  0  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 
 
/*--  文字:  1  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 
 
/*--  文字:  2  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 
 
/*--  文字:  3  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, 
 
/*--  文字:  4  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, 
 
/*--  文字:  5  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 
 
/*--  文字:  6  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, 
 
/*--  文字:  7  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, 
 
/*--  文字:  9  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/ 
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 
}; 
/////////////////////////////////////////////////////////////////////////// 
code uchar dot[16]= 
{ 
/*--  文字:  .  --*/ 
/*--  宋体12;  此字体下对应的点阵为:宽x高=9x16   --*/ 
0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 
}; 
 
//管脚定义//////////////////////////////////////////////////////////////// 
sbit A0=P2^1; 
sbit CS=P2^4; 
//函数列表////////////////////////////////////////////////////////////////// 
void wcode(uchar i);  
void wdata(uchar i); 
void lcd_busy(void); 
void rdata(uchar i); 
void init_12864(void); 
void startline(uchar i); 
void disoff(uchar o); 
void delay(ulong v) ; 
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 clear(void); 
////////////////////////////////////////////////////////////////////////// 
//写控制命令到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(0xa0);  //设置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(0xc0);///选择输出状态寄存器////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); 
} 
////////////////////////////////////////////////////////////////////// 
 void delay (ulong v) 
 { 
    while(v!=0)v--; 
 } 
  
///////////////////////////////////////////////////////////// 
/*-----------------------------------写数据至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 shownum (uchar xx, uchar yy, uchar n, uchar fb)          /*函数名为shownum的显示数字的函数*/ 
{							     	//shownum子函数开始 
  uchar i,dx;                        //定义i、dx为无符号字符型局部变量 
  for(i=0;i<8;i++)					//for循环体,用于扫描汉字的上半部分 
   {dx=num[i+n*16];					//取得第n个数字的上半部分数据代码 
     if(fb)dx=255-dx;					//若fb不为0,获得反白数据代码 
     lw(xx+i+2,yy+1,dx); 
   }		                      	//将数据代码写入LCd 
  for(i=0;i<8;i++)	 
   {dx=num[(i+8)+n*16];				//取得第n个数字的下半部分数据代码 
     if(fb)dx=255-dx;					//若fb不为0,获得反白数据代码 
     lw(xx+i+2,yy,dx);				//将数据代码写入LCM 
   }								//for循环体结束 
}								//shownum子函数结束 
////////////////////////////////////////////////////////// 
void dotshow (uchar xx, uchar yy, uchar dotshow[], uchar fb)           
{							     	  
  uchar i,dx;                       
  for(i=0;i<8;i++)					  
   {dx=dotshow[i];					  
     if(fb)dx=255-dx;				  
     lw(xx+i+2,yy+1,dx); 
   }		                        
  for(i=0;i<8;i++)	 
   {dx=dotshow[i+8];				  
     if(fb)dx=255-dx;				  
     lw(xx+i+2,yy,dx);			  
   }								  
}							  
///////////////////////////////////////////////////////// 
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 dispnum( ulong val)                           /*显示六位数*/ 
						                                          
						                                          /* VAL为所显示的数*/ 
						                                          
{ ulong  shiwan,wan,th,hu,ten,sig; 
 ulong temper0,temper1,temper2,temper3; 
   if((val<10)&&(val>=0)) 
  {  sig=val; 
     shownum(64,2,sig,0); 
     shownum(56,2,0,0); 
     dotshow(48,2,dot,0); 
     shownum(40,2,0,0); 
  } 
   
  if((val<100)&&(val>=10)) 
  {  sig=val%10; 
     ten=(val-val%10)/10; 
     shownum(64,2,sig,0); 
     shownum(56,2,ten,0); 
     dotshow(48,2,dot,0); 
     shownum(40,2,0,0); 
  } 
  
 if((val<1000)&&(val>=100)) 
  {temper0=val%100; 
   sig=temper0%10; 
   ten=(temper0-temper0%10)/10; 
   hu=(val-ten*10-temper0%10)/100; 
     shownum(64,2,sig,0); 
     shownum(56,2,ten,0); 
     dotshow(48,2,dot,0); 
     shownum(40,2,hu,0); 
  }  
   
  if((val<10000)&&(val>=1000)) 
  {temper0=val%1000; 
   temper1=temper0%100; 
   sig=temper1%10; 
   ten=(temper1-temper1%10)/10; 
   hu=(temper0-ten*10-temper1%10)/100; 
   th=(val-hu*100-ten*10-temper1%10)/1000; 
     shownum(64,2,sig,0); 
     shownum(56,2,ten,0); 
     dotshow(48,2,dot,0); 
     shownum(40,2,hu,0); 
	 shownum(32,2,th,0); 
  }  
    
  if((val<100000)&&(val>=10000)) 
  {temper0=val%10000; 
   temper1=temper0%1000; 
   temper2=temper1%100; 
   sig=temper2%10; 
   ten=(temper2-temper2%10)/10; 
   hu=(temper1-ten*10-temper2%10)/100; 
   th=(temper0-hu*100-ten*10-temper2%10)/1000; 
   wan=(val-th*1000-hu*100-ten*10-temper2%10)/10000; 
     shownum(64,2,sig,0); 
     shownum(56,2,ten,0); 
     dotshow(48,2,dot,0); 
     shownum(40,2,hu,0); 
	 shownum(32,2,th,0); 
	 shownum(24,2,wan,0); 
  }  
 
   if((val<1000000)&&(val>=100000)) 
  {temper0=val%100000; 
   temper1=temper0%10000; 
   temper2=temper1%1000; 
   temper3=temper2%100; 
   sig=temper3%10; 
   ten=(temper3-temper3%10)/10; 
   hu=(temper2-ten*10-temper3%10)/100; 
   th=(temper1-hu*100-ten*10-temper3%10)/1000; 
   wan=(temper0-th*1000-hu*100-ten*10-temper3%10)/10000; 
   shiwan=(val-wan*10000-th*1000-hu*100-ten*10-temper3%10)/100000; 
     shownum(64,2,sig,0); 
     shownum(56,2,ten,0); 
     dotshow(48,2,dot,0); 
     shownum(40,2,hu,0); 
	 shownum(32,2,th,0); 
	 shownum(24,2,wan,0); 
	 shownum(16,2,shiwan,0); 
  }  
} 
/////////////////////////////////////////////////////////////////////// 
/****************************主函数******************************/ 
void main(void) 
{ 
  ulong weigth=111111; 
  P2M1=0xc0;P2M2=0xc0; 
  SPCTL=0xdc; 
  SPSTAT=0xc0; 
  init_12864();						//LCM初始化 
while(1)						//无限循环 
  { 
  
  dispnum(weigth); 
  showsing(80,2,ke,0); 
  } 
}