⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcm12864zk.c

📁 ST7920液晶显示控制器的驱动编程
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
;************************************************************************************************************
;*									  湖南华盛科技有限公司
;*                                     	                                  研    发    部
;*
;*                                 	                           http://www.unistrong.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 :Lcm12864zk.c
;* 文件功能 :LCM驱动程序 
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : 研    发    部
;* 修改日期 : 2005/11/29
;* 版本声明 : V1.0.1
;************************************************************************************************************
;*/
/****和硬件总线相关定义********/
#define E  0x00000100   /*E脚对应P2.8*/
#define RW 0x00000200 /*EW脚对应P2.9*/
#define RS 0x00000400 /*RS脚对应P2.10*/
#define BG 0x00000001 /*背光对应P2.0*/
#define PSB   0x00020000/*PSB脚对应P0.17*/
#define RST   0x00008000/*RST脚对应P0.15*/
#define NC    0x00010000/*NC脚对应P0.16*/
#define DATA_PORTA 0x000000fe/*D0_6对应P2.7_P2.1*/
#define DATA_PORTB 0x00100000/*D7对应P1.20*/  
#define  _GLOBAL_LCD  

#include "INCLUDES.h"
/*
*************************************************************************************************************
- 函数名称 : Delayus(uint8 t)
- 函数说明 : 延时函数
- 输入参数 : uint8 t
- 输出参数 : 无
*************************************************************************************************************
*/
void Delay_Lcd(uint8 t)/*t 为1是1us*/
{
    uint8 i,j;
    for (i=0;i<t;i++)
       for (j=0;j<16;j++);
	
}
/*
*************************************************************************************************************
*************************************************************************************************************
- 函数名称 : Data_Shift(uint8 data,uint8 bit_hight,uint8 bit_hight)
- 函数说明 : 数据调整
- 输入参数 : uint8 data,uint8 bit_hight,uint8 bit_hight
- 输出参数 : uint8 temp
*************************************************************************************************************
*/
uint8 Data_Shift(uint8 data,uint8 bit_right,uint8 bit_left)
{uint8 temp;
 uint8 left_pointer,right_pointer;
 temp=0;
 left_pointer=bit_left;
 right_pointer=bit_right;
 while(left_pointer!=right_pointer)
    {if(data&(0x01<<left_pointer))
         temp|=(0x80>>(7-right_pointer));
     if(data&(0x80>>(7-right_pointer)))
         temp|=(0x01<<left_pointer);
     left_pointer++;
     right_pointer--;
    } 
 return temp;
}
/*
*************************************************************************************************************
- 函数名称 :  Write_command(Uchar CMD,Uchar bb)
- 函数说明 : LCM写命令函数
- 输入参数 : uint8 CMD   命令内容
-                          
- 输出参数 : 无
*************************************************************************************************************
*/     
void Write_command(uint8 CMD)
{ int8 st;
   uint8 t=0x40;
   uint8 j=0x02;
   uint8 i;
   /*转换数据格式*/
   for(i=0;i!=7;i++)
   {if((CMD&t)!=0)
   	st|=j;
     else
   	st&=(~j);
     t>>=1;
     j<<=1;
   }
   
   IO2CLR=RS;
   IO2CLR=RW;
   IO2SET=E;
/*送p1.20(最高位)*/
   if((CMD&0x80)!=0)
       IO1SET|=DATA_PORTB;/*p1.20置1*/
   else
   	IO1CLR|=DATA_PORTB;/*p1.20清0*/
 /*送低七位*/
   IO2SET|=(st&0xfe);
   IO2CLR=((~st)&0xfe);
   Delay_Lcd(20);
   IO2CLR=E;
   Delay_Lcd(100);/*100*/
}
/*
*************************************************************************************************************
- 函数名称 :  Read_Data(uint8 row,uint8 line)
- 函数说明 : LCM读数据函数
- 输入参数 : uint8 row,uint8 line
-                          
- 输出参数 : 
*************************************************************************************************************
*/
uint8 Read_Data(void)
{uint8 temp1,temp2;
 IO2DIR&=(~0x000000fe);/*改变管脚为输入模式*/
 IO1DIR&=(~0x00100000);
 IO2SET=RS;
 IO2SET=RW;
 IO2SET=E;
 Delay_Lcd(25);
 temp1=IO2PIN;
 if(IO1PIN&0x00100000)
     temp2=1;
 else
     temp2=0;
 temp1=Data_Shift(temp1,7,1)>>1;
 temp1|=temp2;
 IO2CLR=E;
 IO1DIR|=0x00100000;/*还原LCD管脚模式*/
 IO2DIR|=0x000007ff;
 return temp1;
}
/*
*************************************************************************************************************
- 函数名称 : Write_data(Uchar DATA)
- 函数说明 : LCM写数据
- 输入参数 : uint8 DATA  数据
- 输出参数 : 无
*************************************************************************************************************
*/     
void Write_data(uint8 DATAs)
{   int8 st;
    uint8 t=0x40;
    uint8 j=0x02;
    uint8 i;
    /*转换数据格式*/
   for(i=0;i!=7;i++)
   {if((DATAs&t)!=0)
   	st|=j;
     else
   	st&=(~j);
     t>>=1;
     j<<=1;
   }
     IO2SET=RS;
     IO2CLR=RW;
     IO2SET=E;
/*送p1.20(最高位)*/
   if((DATAs&0x80)!=0)
       IO1SET|=DATA_PORTB;/*p1.20置1*/
   else
   	IO1CLR|=DATA_PORTB;/*p1.20清0*/
 /*送低七位*/
   IO2SET|=(st&0xfe);
   IO2CLR=((~st)&0xfe);
   Delay_Lcd(20);
   IO2CLR=E;
   Delay_Lcd(100);/*100*/
}

     
/*
*************************************************************************************************************
- 函数名称 : Lcd_init(void)
- 函数说明 : LCM初始化
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/  
void Lcd_init(void)
{  
    Delay_Lcd(200);
    Write_command(0x30);/*设置为8位控制界面*/
    Write_command(0x30);
    Write_command(0x0C);/*开整体显示*/
    Write_command(0x01);/*清显示*/
    Write_command(0x06);/*初始化原点*/
}
/*
*************************************************************************************************************
- 函数名称 : void Lcd_clr(void)
- 函数说明 : LCM清屏函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/     
void Lcd_clr(void)
{ 
    Write_command(0x01);/*清显示*/
    Write_command(0x06);/*初始化原点*/
    Delay_Lcd(200);/*200*/
} 

/*
*************************************************************************************************************
- 函数名称 :uint8 Lcd_dispp(uint8 *ptr,uint8 row,uint8 line,uint8 byte_length)
- 函数说明 : 字符显示函数
- 输入参数 : *ptr  row  line   byte_length
- 输出参数 :i(显示的字节长度)
*************************************************************************************************************
*/   
uint8 Lcd_dispp(uint8 *ptr,uint8 row,uint8 line,uint8 byte_length)
{
  uint8 y,i,f,t;
  f=t=0;/*初次显示标志*/
  switch(row)
     {case 1:{y=0x80+(--line);break;}
      case 2:{y=0x90+(--line);break;}
      case 3:{y=0x88+(--line);break;}
      case 4:{y=0x98+(--line);break;}
     }
 
  Write_command(y); /* 定位显示起始地址*/
  for(i=0;i!=byte_length;)
  	{if(y>0x0a0) return(i-1);
  	     
  	 if(ptr[i]<0x80)/*ASCII显示*/
  	      {
  	        if(f==0)
  	           {Write_data(ptr[i]); /*单个ASCII字符*/
  	            i++;
  	            f=1;
		  	    y++;
		  	   } 
		  	else 
		  	  {Write_data(ptr[i]); /*连续ASCII字符*/
		  	   i++;
		  	   f=0;
		  	  }
	      }
     else/*汉字显示*/ 
           {
              if(f==1)/*上次是ASCII显示且显示单数个*/
        	     {
        	     f=0;
        	     if(y==0x88|y==0x98|y==0x90)
        	        {
         	          if(row==1)
         	              {row++;
		                   Write_command(0x90); 
			               y=0x90;
               	          }
                      else if(row==2)
               	          {row++;
		                   Write_command(0x88); 
		                   y=0x88;
               	           }
	                  else if(row==3)
	       	              {row++;
		                   Write_command(0x98); 
		                   y=0x98;
	       	              }
                    }
        	     Write_command(y);
		         Write_data(ptr[i]);
		         i++;
		         t=1;
		         y++;
		        }
            else if(t==0)/*第一个字符是汉字或新的汉字*/
		        {
		         Write_data(ptr[i]); /*输出单个字符*/
		         i++;
		         t=1;
		         y++;
		        }
		    else/*第二次是汉字或上次是ASCII显示的第二字节*/ 
		        {
		         Write_data(ptr[i]); /*输出单个字符*/
		         i++;
		         t=0;
		        }
		   }
     if((y==0x88|y==0x98|y==0x90)&&t!=1&&f!=1)
         
         	{
         	if(row==1)
         	      {row++;
		        Write_command(0x90); 
			    y=0x90;
               	}
            else if(row==2)
               	{row++;
		         Write_command(0x88); 
		         y=0x88;
               	}
	        else if(row==3)
	       	{row++;
		     Write_command(0x98); 
		     y=0x98;
	       	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -