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

📄 c19264.c

📁 192X64液晶的80c51单片机语言液晶驱动文件
💻 C
字号:
/******************************************************************************
**
**      西安博控电子科技有限公司.
**
**  文件名:        C19264.c     
**
**  用途:          C19264 LCD Driver
**
**  修改时间:  $   年 月  日    shw   $
******************************************************************************/
#include "system.h"
#include <intrins.h>
#include "HANZI.H"
#include <math.h>

//状态检查
void CheckState()
{
Uchar dat;
di=0;
rw=1;
do{
LCD12864DataPort=0xff;
en=1; 
dat=LCD12864DataPort;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
en=0;
dat=0x90 & dat; //仅当第4,7位为0时才可操作
}while(!(dat==0x00));
}
/******************************************************************************
**  函数名: 			void WriteByte(Uchar dat)

**  描述: 			    写数据

**  修改的全局变量: 

**  输入参数:

**  返回值: 
*******************************************************************************/
void WriteByte(Uchar dat)
{
CheckState();
di=1; rw=0;
LCD12864DataPort=dat;
en=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
en=1; 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
en=0;
rw=1;
}

/******************************************************************************
**  函数名: 			void WriteByte(Uchar dat)

**  描述: 			    写数据

**  修改的全局变量: 

**  输入参数:

**  返回值: 
*******************************************************************************/
unsigned char ReadByte(void)
{
unsigned char Dat;
CheckState();
di=1; rw=1;
LCD12864DataPort=0xFF;
en=0;
en=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
Dat = LCD12864DataPort; 
en=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 

//Dat = LCD12864DataPort;
//Dat = LCD12864DataPort; 
return Dat;
}
/*-----------------------------------------------------------------------------------------------------*/
/******************************************************************************
**  函数名:   void SendCommandToLCD(Uchar command)

**  描述: 	  写命令

**  修改的全局变量: 

**  输入参数:

**  返回值: 
*******************************************************************************/
void SendCommandToLCD(Uchar command)
{
CheckState();
rw=0;
LCD12864DataPort=command;
en=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
en=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  

rw=1;
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(Uchar line)
{
line=line & 0x07; // 0<=line<=7
line=line|0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(Uchar column)
{
column=column &0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
}


void Rst_LCD(void)
{
    LCD_RST=0;
	delay(2000);
    LCD_RST=1;
}
//选择屏幕
//screen: 0-全屏,1-第一屏,2-第二屏,3-第三屏
void SelectScreen(Uchar screen)
{ //北京显示器:负有效 
switch(screen)
{ 
//------------------------------------------------------------------------------------------------
case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs2=0; 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs3=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
break; 
//------------------------------------------------------------------------------------------------
case 1: cs1=0;//
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs2=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs3=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
break;
//------------------------------------------------------------------------------------------------
case 2: cs1=1;//
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs3=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
break;
//------------------------------------------------------------------------------------------------
case 3: cs1=1;//
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs2=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
cs3=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
break;
}
}
/******************************************************************************
**  函数名: 	  void SetOnOff(Uchar onoff)

**  描述: 		  开/关显示

**  修改的全局变量: 

**  输入参数:

**  返回值: 
*******************************************************************************/
void SetOnOff(Uchar onoff)
{
onoff=0x3e | onoff; //0011 111x
SelectScreen(1);
SendCommandToLCD(onoff);
SelectScreen(2);
SendCommandToLCD(onoff);
SelectScreen(3);
SendCommandToLCD(onoff);
}

/******************************************************************************
**  函数名: 			void ClearScreen(Uchar screen)

**  描述: 

**  修改的全局变量: 

**  输入参数:			screen: 0-全屏,1-第一屏,2-第二屏,3-第三屏

**  返回值: 
*******************************************************************************/
void ClearScreen(Uchar screen)
{ Uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{ SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}

/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(Uchar lin,Uchar column,Uchar code  *address)
{ Uchar i; 
if(column>15) {SelectScreen(3);}
else if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7,9,10,11)则写在第一屏上
else {SelectScreen(2);}

SetLine(lin);
if(column>=16)column=column-16;
if(column>=8)column=column-8;
//SetStartLine(lin);
SetColumn(column<<3);
for(i=0;i<8;i++) WriteByte( *(address+i) );
}

/*------------------------------------------------*/
//显示图片
//旋转90度 :字模被竖着切分
//startline :开始行
//startcolumn:开始列
//linechar :图片行点除8(图片以8*8点阵为单位)
//columnchar :图片列点除8(图片以8*8点阵为单位)
//address : 字模区首地址

/******************************************************************************
**  函数名: 	  void ShowPicture(Uchar startline,Uchar startcolumn,
                           Uchar linechar,Uchar columnchar,Uchar code  *address)

**  描述: 

**  修改的全局变量: 

**  输入参数:

**  返回值: 
*******************************************************************************/
void ShowPicture(Uchar startline,Uchar startcolumn,Uchar linechar,Uchar columnchar,Uchar code  *address)
{ Uchar i,j;
for(i=0;i<columnchar;i++)
for(j=0;j<linechar;j++)
Show88(startline+i , startcolumn+j , address+(i*linechar+j)*8 );
}


/*----------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable
void ShowHZ(Uchar lin,Uchar column,Uchar code  *address)
{
lin=lin<<1; //lin*2
Show88(lin,column,address);
Show88(lin,column+1,address+8);
Show88(lin+1,column,address+16);
Show88(lin+1,column+1,address+24);
}

void Display_Chinese(unsigned int UniCode,Uchar X,Uint Y)
{  
   Uchar i;
   Uchar * ImgData;
   Uint CodeID;
   
   for(i=0;i<hzNum;i++)
     {
        if( (hzIndex[2*i]==(Uchar)(UniCode>>8)) && (hzIndex[2*i+1]==(Uchar)UniCode) )
           {                
                CodeID=i;    break;
           }
     }
      ImgData=&hzdot[CodeID*32];
      ShowHZ(X,Y,ImgData);
  
}

void Display_ASCII(Uchar Char,Uchar X,Uint Y)
{  
     Uchar code * ImgData;
    {  
      
     ImgData=&ASC_MSK[(Char-0x20)*16]; 
        
     Show88(2*X,Y,ImgData);  
             
     ImgData=&ASC_MSK[(Char-0x20)*16+8];  
        
     Show88(2*X+1,Y,ImgData);
    }
}
/******************************************************************************
**  函数名: 	     	 void Display_Number(Uint Number,Uchar X,Uint Y,Uchar Lenth)

**  描述: 				 显示一串数字

**  修改的全局变量: 

**  输入参数:

**  返回值: 
*******************************************************************************/
void Display_Number(Uint Number,Uchar X,Uint Y,Uchar Lenth)
{  Uchar DispNum;
   Y=Y+Lenth-1;
   for(;Lenth>0;Lenth--)
   {
  
    DispNum=Number%10+0x30;
    Display_ASCII(DispNum,X,Y);
    Y--;
    Number=Number/10;  
   }
}

/******************************************************************************
**  函数名:        void Display_String(Uchar code *p,Uchar X,Uint Y,Uchar lenth)

**  描述: 		   显示一个字符串

**  修改的全局变量: 

**  输入参数:	   Uchar lenth: 字符串长度

**  返回值: 
*******************************************************************************/
void Display_String(Uchar code *p,Uchar X,Uint Y,Uchar lenth)
{ Uchar i;
  for(i=0;i<lenth;i++)
   {
    if(p[i]<0x80) {Display_ASCII(p[i],X,Y);Y++;}    //ASCII
    else 
       {
         Display_Chinese((p[i])*256+p[i+1],X,Y);//中文
         i++;
         Y++;
         Y++;
       }     
     
   }
  
}
void Pixel(unsigned int PointX,unsigned int PointY )
{
unsigned char dat;
unsigned char shift;
if(PointX>191)return;
if(PointX>127) {SelectScreen(3);}
else if(PointX<64) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7,9,10,11)则写在第一屏上
else {SelectScreen(2);}

SetLine(PointY/8);
						 
if(PointX>=128)PointX=PointX-128;
if(PointX>=64)PointX=PointX-64;
SetColumn(PointX);
dat=ReadByte();

SetLine(PointY/8);
SetColumn(PointX);
//dat = 0;
shift= PointY%8;
dat |=(1<<shift);
WriteByte(dat);
}

/***************************************************************************************/
/*函数:void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
//描述:划线函数
//参数:x1:起始点横坐标(0-127),y1:起始点纵坐标(0-31)
//     x2:终止点横坐标(0-127),y2:终止点纵坐标(0-31)
//   
//返回:无
/***************************************************************************************/
void Line( unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
{
	unsigned int x,y;
	double k,b;

	if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
	{
		k=(float)((float)y2-(float)y1) / (float)((float)x2-(float)x1) ;
		b=y1-k*x1;//
		if( x1 <= x2 )
		{
			for(x=x1;x<=x2;x++)
			{
				y=k*x+b;
				Pixel(x, y);
			}
		}
		else
		{
			for(x=x2;x<=x1;x++)
			{
				y=k*x+b;
				Pixel(x, y );
			}
		}
	}
	else // abs(y1-y2) > abs(x1-x2) |K|>1
	{
		k=(float)((float)x2-(float)x1) / (float)((float)y2-(float)y1) ;
		b=x1-k*y1;
		if( y1 <= y2 )
		{
			for(y=y1;y<=y2;y++)
			{
				x=k*y+b;
				Pixel( x , y );
			}
		}
		else
		{
			for(y=y2;y<=y1;y++)
			{
				x=k*y+b;
				Pixel( x , y );
			}
		}
	}
}

⌨️ 快捷键说明

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