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


#include               
#include                               
#include                
 
 
#define uchar unsigned char 
#define uint unsigned int 
#define ulong unsigned long 
#define uint8 unsigned char 
#define DATA  P0 
 
code uchar hz[]= 
{ 
0x00,0x04,0x00,0x04,0x00,0x04,0xFE,0x04,0x92,0x04,0x92,0x04,0x92,0x04,0x92,0xFF, 
0x92,0x04,0x92,0x04,0x92,0x04,0x92,0x04,0xFE,0x04,0x00,0x04,0x00,0x04,0x00,0x00,/*"早",0*/ 
};/*"。",31*/ 
//管脚定义//////////////////////////////////////////////////////////////// 
sbit CS=P2^1; 
sbit A0=P1^0; 
sbit WR=P2^6; 
sbit RD=P2^7; 
//函数列表////////////////////////////////////////////////////////////////// 
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); 
////////////////////////////////////////////////////////////////////////// 
//检测忙信号?                  //A0=0;RD=0;WR=1     
void lcd_busy(void)   
{                              //函数名为lcd_busy 的判LCM忙子函数                  
    
                                //lcd_busy函数开始 
   CS=1;      
   WR=1;_nop_();     
   A0=0;   
   RD=0;_nop_();  
   DATA=0xff;_nop_();   //选择指令寄存器,选择读方式,LCM数据口置全1 
   CS=0; 
  while(1) 
  {				         //while循环体,无限循环 
        		  			  //使能,将LCM的状态读入MCU 
	if(DATA&0x80)break;    /*若读入状态的数据小于0x80,说明最高位为0,LCM空闲,执行break语句跳出while循环体*/ 
   					          //禁能 
  }  
  CS=1;_nop_();        
}// / while循环体结束 
///////////////////////////////////////////////////////////////////////////// 
//写控制命令到lcd                 //A0=0;RD=1;WR=0 
void wcode (uchar i)    
{   
   lcd_busy();  //检测忙? 
   CS=1; 
   RD=1;_nop_(); 
    
 //  delay(0x04); 
   A0=0;  
   WR=0;_nop_(); 
   CS=0;_nop_(); 
   DATA=i;   
   //delay(0x04); 
  // DATA=i; 
   _nop_(); _nop_();  
   CS=1;_nop_();  
}  
 ////////////////////////////////////////////////////////////////////////// 
//写显示数据到lcd 
void wdata (uchar i)            //A0=1;RD=1;WR=0 
{  lcd_busy();//检测忙? 
   CS=1; 
   RD=1;_nop_(); 
   
  // delay(0x04); 
   A0=1;  
   WR=0;_nop_(); 
   CS=0;_nop_(); 
   DATA=i;   
  // delay(0x04); 
   //DATA=i; 
   _nop_(); _nop_();  
   CS=1;_nop_();  
}  
/////////////////////////////////////////////////////////////////////// 
//lcd读显示数据 
void rdata (uchar i)            //A0=1;RD=0;WR=1 
{ 
   lcd_busy();//检测忙? 
   CS=1; 
   WR=1;_nop_(); 
   
  // delay(0x04); 
   A0=1;  
   RD=0;_nop_(); 
   CS=0;_nop_(); 
   DATA=i;  
   //delay(0x04); 
   //DATA=i; 
   _nop_(); _nop_();  
   CS=1;_nop_();  
}  
/////////////////////////////////////////////////////////////////// 
//液晶屏初始化 
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(0xa2);//设置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 dh (uchar xx, uchar yy, uchar n, uchar fb) /*函数名为dh的显示汉字子函数。 
定义xx、yy、n、fb为无符号字符型局部变量。其中xx、yy为列、页定位值, 
n为汉字库中的第n个汉字,fb为反白显示选择*/ 
{								//dh子函数开始 
uchar i,dx;                        //定义i、dx为无符号字符型局部变量 
for(i=0;i<16;i++)					//for循环体,用于扫描汉字的上半部分 
{dx=hz[2*i+n*32];					//取得第n个汉字的上半部分数据代码 
if(fb)dx=255-dx;					//若fb不为0,获得反白数据代码 
lw(xx*8+i,yy,dx);					//将数据代码写入LCM 
dx=hz[(2*i+1)+n*32];				//取得第n个汉字的下半部分数据代码 
if(fb)dx=255-dx;					//若fb不为0,获得反白数据代码 
lw(xx*8+i,yy+1,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 main(void) 
{ 
  uchar loop;//定义字符型局部变量loop 
  P0M1=0x00;P0M2=0x00; 
  P1M1=0x0c;P1M2=0x00; 
  P2M1=0x00;P2M2=0x00; 
  P3M1=0x00;P3M2=0x00; 
  wcode(0xe2);       
  init_12864();						//LCM初始化 
 // delay(1000); 
					//延时一会 
while(1)						//无限循环 
{ 
/************显示第一行(8个字)***********/ 
  
 loop=0 ; 
 dh(2*loop,0,loop,0); 
 
} 
/*************************/ 
 					//延时一会 
 
 
  
}