www.pudn.com > t6963.rar > 8.23.c


#include 
#include 
#include"ZK.h" 
#include 
#define uchar unsigned char  
#define uint unsigned int  
#define C_ADD XBYTE[0x0100]//指令通道地址 
#define D_ADD XBYTE[0x0000]//数据通道地址 
#define CR 30//显示区宽度,32字节 
//sbit RD=P3^7; 
//sbit WR=P3^6; 
void delay(int i){ 
  while(i--); 
  } 
 
/*----------------------------------------------------------------------------------------- 
**函数名:ReadStateWord() 
**功能:读取状态字 
**参数:void 
**返回:uchar 液晶状态字 
------------------------------------------------------------------------------------------*/ 
uchar ReadStateWord(){ 
    uchar a=0; 
    a=C_ADD; 
	return a; 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:Test_S1_S0() 
**功能:判断状态位S1,S0(读写指令与读写数据状态) 
**参数:void 
**返回:bit  0:忙,1:准备好 
------------------------------------------------------------------------------------------*/ 
bit Test_S1_S0(void){ 
   if((ReadStateWord()&0x03)==0x03) 
      return 1; 
   else  
      return 0; 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:Test_S2() 
**功能:判断状态位S2(数据自动读状态) 
**参数:void 
**返回:bit  0:忙,1:准备好 
------------------------------------------------------------------------------------------*/ 
bit Test_S2(void){ 
   if((ReadStateWord()&0x04)==0x04) 
      return 1; 
   else  
      return 0; 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:Test_S3() 
**功能:判断状态位S3(数据自动写状态) 
**参数:void 
**返回:bit  0:忙,1:准备好 
------------------------------------------------------------------------------------------*/ 
bit Test_S3(void){ 
   if((ReadStateWord()&0x08)==0x08) 
      return 1; 
   else  
      return 0; 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:Test_S6() 
**功能:判断状态位S6(屏读/拷屏状态) 
**参数:void 
**返回:bit  0:正确,1:出错 
------------------------------------------------------------------------------------------*/ 
bit Test_S6(void){ 
   if((ReadStateWord()&0x40)==0x40) 
      return 1; 
   else  
      return 0; 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:WriteCommand_0() 
**功能:写入无参数指令 
**参数:comm 写入的指令数据 
**返回:void  
------------------------------------------------------------------------------------------*/ 
void  WriteCommand_0(uchar comm){ 
     while(Test_S1_S0()==0); 
	 C_ADD=comm;//????????????????   
} 
/*---------------------------------------------------------------------------------------- 
**函数名:WriteData() 
**功能:写入数据 
**参数:dat写入的指令数据 
**返回:void  
------------------------------------------------------------------------------------------*/ 
void WriteData(uchar dat){ 
     while(Test_S1_S0()==0); 
	  D_ADD=dat;//????????????????   
} 
/*---------------------------------------------------------------------------------------- 
**函数名:AutoWriteData() 
**功能:写入数据 
**参数:dat写入的指令数据 
**返回:void  
------------------------------------------------------------------------------------------*/ 
void AutoWriteData(uchar dat){ 
     while(Test_S3()==0); 
	  D_ADD=dat;//????????????????   
} 
 
/*---------------------------------------------------------------------------------------- 
**函数名:WriteCommand_1() 
**功能:写入单字节参数指令 
**参数:uchar data1 参数 uchar comm 指令数据  
**返回:void  
------------------------------------------------------------------------------------------*/ 
void WriteCommand_1(uchar data1,uchar comm){ 
   while(Test_S1_S0()==0); 
   D_ADD=data1; 
   while(Test_S1_S0()==0); 
   C_ADD=comm;//??????????? 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:WriteCommand_2() 
**功能:写入双字节参数指令 
**参数:uchar data1 参数1;uchar data2 参数2;uchar comm 指令数据 
**返回void 
------------------------------------------------------------------------------------------*/ 
void WriteCommand_2(uchar data1,uchar data2,uchar comm){ 
   while(Test_S1_S0()==0); 
   D_ADD=data1; 
   while(Test_S1_S0()==0); 
   D_ADD=data2; 
   while(Test_S1_S0()==0); 
   C_ADD=comm;//////////?????????? 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:ReadData() 
**功能:读出数据 
**参数:void 
**返回uchar 读出的数据 
------------------------------------------------------------------------------------------*/ 
uchar ReadData(){ 
   uchar dat; 
   while(Test_S1_S0()==0); 
   dat=D_ADD; 
   return dat; 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:LCD_init() 
**功能:LCD初始化程序 
**参数:void 
**返回void  
------------------------------------------------------------------------------------------*/ 
void LCD_init(){ 
   WriteCommand_2(0x00,0x00,0x40);//设置文本显示区域首地址 
   WriteCommand_2(0x1e,0x00,0x41);//设置文本显示区域宽度 
   WriteCommand_2(0x00,0x08,0x42);//设置图形显示区域首地址 0x0800 
   WriteCommand_2(0x1e,0x00,0x43);//设置图形显示区域宽度 
   WriteCommand_0(0xa7);//光标形状设置 
   WriteCommand_0(0x80);//显示方式设置逻辑"或"合成。。。。。。。。。。 
   //WriteCommand_2(0x00,0x00,0x21);//设置光标地址 
   //WriteCommand_0(0xa7);  //设置光标的形状 
   WriteCommand_0(0x9c);//显示开关设置   开图形显示 
} 
 
/*---------------------------------------------------------------------------------------- 
**函数名:LCD_Clear() 
**功能:LCD清屏 
**参数:void 
**返回void  
------------------------------------------------------------------------------------------*/ 
void LCD_Clear(){ 
  uchar u=0xff; 
   uint i; 
   WriteCommand_2(0x00,0x00,0x24);//设置显示存储器首地址 
   delay(1000); 
   WriteCommand_0(0xb0);//设置自动写方式 
   for(i=0;i<7618;i++){/* 清8K存储器 */ 
      AutoWriteData(0x00); 
    } 
  WriteCommand_0(0xb2);//退出自动写方式 
  } 
/*---------------------------------------------------------------------------------------- 
**函数名:CreateCGRAM() 
**功能:建立CGRAM子程序 
**参数: uchar c_code 第一汉字代码0.1.2.3 
        uchar start_code 起始码 譬如0x80 
        uchar num  写入汉字数目 
        bit  direction 代表方向: 1 写入正显码 0写入反显码  
**返回void  
------------------------------------------------------------------------------------------*/ 
void CreateCGRAM(uchar c_code,uchar start_code,uchar num,bit direction){ 
   uint i; 
   uint add; 
   add=(0x03<<11)|(start_code<<3); 
   WriteCommand_2(0x03,0x00,0x22);//设置CGRAM偏置地址 
    
   //WriteCommand_2(0x00,0x1c,0x24);//设置存储器地址指针 
   WriteCommand_2(add%256,add/256,0x24);//设置存储器地址指针 
   WriteCommand_0(0xb0);//设置自动写方式 
   for(i=32*c_code;i<32*(c_code+num);i++){ 
      if(direction) 
         AutoWriteData(ZK[i]); 
	  else 
	     AutoWriteData(~ZK[i]); 
         } 
   WriteCommand_0(0xb2);//退出自动写方式 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:CharactorWriteIn_T() 
**功能: 文本方式写入汉字 
**参数:uchar x:X坐标(0----29) 
        uchar y:Y坐标(0----15) 
	    uchar c_code:汉字字符代码  
**返回void  
------------------------------------------------------------------------------------------*/ 
void CharactorWriteIn_T(uchar x,uchar y,uchar c_code){ 
   uint j; 
   j=CR*y+x; 
   WriteCommand_2(j%256,j/256,0x24);//设置显示地址指针 
   WriteCommand_1(c_code,0xc0);//写入左上半部汉字代码 
   WriteCommand_1(c_code+2,0xc0);//写入右上半部汉字代码 
   j=j+CR;// 显示RAM地址修正  
   WriteCommand_2(j%256,j/256,0x24);//设置显示地址指针 
   WriteCommand_1(c_code+1,0xc0);//写入左下半部汉字代码 
   WriteCommand_1(c_code+3,0xc0);//写入左下半部汉字代码 
} 
/*---------------------------------------------------------------------------------------- 
**函数名:CharactorWriteIn_G() 
**功能: 图形方式写入汉字 
**参数:uchar x:X坐标(0----29)中的偶数0,2,4,6...........28 
        uchar y:Y坐标(0----3) 
	    uchar *p指向汉字字模指针 
		//uchar code_c   汉字字符代码 
**返回void  
------------------------------------------------------------------------------------------*/ 
void CharactorWriteIn_G(uint code_c/*uchar *p*/,uchar x,uchar y,bit direction){ 
   uint StartAddr; 
   uchar i; 
   StartAddr=CR*y*16+x+0x0800;//计算显示内存地址 
   for(i=0;i<16;i++){ 
      WriteCommand_2( StartAddr%256, StartAddr/256,0x24);//设置显示地址指针 
      if(direction) 
        WriteCommand_1(ZK[code_c*32+i],0xc0);    //写入左半部数据  0xc0写以后地址加1 
	  else 
	    WriteCommand_1(~ZK[code_c*32+i],0xc0);    //写入左半部数据  0xc0写以后地址加1 
	 // WriteCommand_1(*p++,0xc0);    //写入右半部数据  0xc4写以后地址不变 
      StartAddr+=CR; 
	  }  
   StartAddr=CR*y*16+x+0x0800+1;//计算显示内存地址 
   for(i=16;i<32;i++){ 
      WriteCommand_2( StartAddr%256, StartAddr/256,0x24);//设置显示地址指针 
      if(direction) 
          WriteCommand_1(ZK[code_c*32+i],0xc0);    //写入右半部数据  0xc4写以后地址不变 
	   else 
	       WriteCommand_1(~ZK[code_c*32+i],0xc0);    //写入左半部数据  0xc0写以后地址加1  
	 // WriteCommand_1(*p++,0xc0);    //写入右半部数据  0xc4写以后地址不变 
      StartAddr+=CR; 
	  }   
	   
} 
/*----------------------------------------------------------------------------------------- 
**函数名:CharDispay() 
**功能: 在(X,Y)处显示英文字符 按CGROM形式 
**参数:uchar x:X坐标(0----29) 
        uchar y:Y坐标(0----127) 
	    uchar str 显示字符的ASII码 
**返回void  
-------------------------------------------------------------------------------------------*/ 
void  CharDisplay(uchar chr,uchar x,uchar y){ 
         uchar discode; 
         if(chr>=48&&chr<=57)discode=0x10+chr-48;//得到数字显示码 
         else if(chr>=65&&chr<=90)discode=0x21+chr-65;//A--Z显示码 
		 else if(chr>=97&&chr<=122)discode=0x41+chr-97;//a--z显示码 
         else{ 
            switch(chr){                          //其它符号显示 
                case '!':discode=0x01; break; 
		        case '%': discode=0x05;break; 
		        case '&': discode=0x06;break; 
                case '(': discode=0x08;break; 
                case ')': discode=0x09;break; 
		        case '*': discode=0x0a;break; 
		        case '+': discode=0x0b;break; 
		        case '-': discode=0x0d;break; 
		        case '.': discode=0x0e;break; 
		        case '/': discode=0x0f;break; 
               default:break; 
              } 
            } 
       WriteCommand_2((y*30+x)%256,(y*30+x)/256,0x24); 
       WriteCommand_1(discode,0xc0); 
} 
 
/*----------------------------------------------------------------------------------------- 
**函数名:CharDispay_G() 
**功能: 在(X,Y)处显示英文字符 图形形式 
**参数:uchar x:X坐标(0----29) 
        uchar y:Y坐标(0----3) 
	    uchar  chr 符号的ASCII码 
**返回void  
-------------------------------------------------------------------------------------------*/ 
void  CharDisplay_G(uchar chr,uchar x,uchar y,bit direction){ 
       uint StartAddr; 
        uchar i; 
        uchar discode; 
         if(chr>=48&&chr<=57)discode=chr-48;//得到数字显示码 
         else if(chr>=65&&chr<=90)discode=42+chr-65;//A--Z显示码 
		 else if(chr>=97&&chr<=122)discode=68+chr-97;//a--z显示码 
         else{ 
            switch(chr){                          //其它符号显示 
                case '!':discode=10; break; 
		        case '%': discode=14;break; 
		        case '&': discode=15;break; 
                case '(': discode=17;break; 
                case ')': discode=18;break; 
		        case '*': discode=19;break; 
		        case '+': discode=20;break; 
		        case '-': discode=23;break; 
		        case '.': discode=22;break; 
				case ' ':discode=35;break; 
 
               default:break; 
              } 
            } 
      StartAddr=CR*y*16+x+0x0800;//计算显示内存地址 
      for(i=0;i<16;i++){ 
          WriteCommand_2( StartAddr%256, StartAddr/256,0x24);//设置显示地址指针 
          if(direction) 
               WriteCommand_1(ZK[discode*16+i],0xc0);    //写入左半部数据  0xc0写以后地址加1 
	      else 
	           WriteCommand_1(~ZK[discode*16+i],0xc0);    //写入左半部数据  0xc0写以后地址加1 
	 // WriteCommand_1(*p++,0xc0);    //写入右半部数据  0xc4写以后地址不变 
          StartAddr+=CR; 
	  }  
} 
/*----------------------------------------------------------------------------------------- 
**函数名:StrDisplay() 
**功能: 从 (X,Y)开始处显示一行英文字符串 
**参数:uchar x:X坐标(0----29) 
        uchar y:Y坐标(0----7) 
	    uchar p[] 显示的字符串数组 
		bit direction 显示方向  1,正向;0反向 
**返回void  
-------------------------------------------------------------------------------------------*/ 
void StrDisplay(uchar p[],uchar x,uchar y){ 
    uchar i,u; 
	u=strlen(p); 
	for(i=0;i