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

📄 drive_functions.h

📁 液晶屏显示花样proteus仿真
💻 H
字号:
/*这个是12864图形液晶驱动程序,包括画点,划直线,画几何图形,写点阵汉字等
  您可以把它复制到您的工程中,用#include'drive_function' 直接调用它
  如果您感觉自己程序写的比较好了,我建议你试着去移植操作系统如uc/os,uclinux
  而不要自己发太多时间去写操作界面。这样效果更好!
*/
#define uchar unsigned char
#define uint unsigned int

uchar chip_select=1;
uchar color=0x00;

bit black_flag=0;  			  //黑屏显示标志位

sbit DI=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
sbit CS1=P2^4;
sbit CS2=P2^3;
sbit RST=P2^2;

bit busy_bit=1;
bit menu=0;
uchar line=0;
uchar select=0;

#define LCD P0
#include<math.h>
#define Graphic_Clear 0x01   //檫除点
#define Graphic_Not 0x02     //反相点
#define Graphic_Draw 0x03	 //画点

void delay_ns(uchar ns)
{
	while(ns--);
}

void delay_ms(uint ms)
{
	uchar i;
	while(ms--)
		for(i=0;i<120;i++);
}


/************************* if 0 read command,else read data ****************/

uchar read(bit flag)
{
	uchar stat;

	LCD=0xFF;
	RW=1;
	DI=flag;
	E=1;
	E=0;
	E=1;        			//E的下降沿,然后E持续拉高读才有效
	stat=LCD;
	E=0;

	return(stat);
    } 

/*************************** check busy ************************/

bit CheckBusy(void)
{
	uchar state=0;

	state=read(0);
	busy_bit=(bit)(state>>7);
	
	return(busy_bit);
	}

/************************* if 0 write command,else write data ****************/ 

void write(bit flag,uchar dat)
{
	while(CheckBusy());
	LCD=0xFF;
	RW=0;
	DI=flag;
	LCD=dat;
	E=1;
	E=0;
    }

/************************* set display page ****************/ 

void SetPage(uchar page)
{	
	CS1=1;
	CS2=0;
	write(0,page+0xb8);

	CS1=0;
	CS2=1;
	write(0,page+0xb8);

	}

/************************ set display column *****************/

void SetColumn(uchar column)
{
	CS1=1;
	CS2=0;
	write(0,column+0x40);

	CS1=0;
	CS2=1;
	write(0,column+0x40);
	}


/***************************** write data ************************/

void WriteData(uchar dsp_data)
{
	if(chip_select==1)
	{
		CS1=1;
		CS2=0;
		}
	 else{
			CS1=0;
			CS2=1;
			}
	write(1,dsp_data);
	}

/**************************** read data ***********************/

uchar ReadData(void)
{
	uchar dsp_data;

	while(CheckBusy());
	if(chip_select==1)
	{
		CS2=0;
		CS1=1;
		}
	 else{
	 		CS2=1;
			CS1=0;
			}
	dsp_data=read(1);
	return(dsp_data);
	}

/******************** clear LCD *******************************/

void ClearLCD(void)
{
	uchar page,column;
if(black_flag==1)color=0xFF;   			//设置清屏颜色
else color=0x00;
	for(page=0;page<8;page++)
	{
	  SetPage(page);
	  SetColumn(0);
	  for(column=0;column<64;column++)
	  {	 
		chip_select=1;   
		WriteData(color);               //clear chip1
		chip_select=2;                  
		WriteData(color);               //clear chip2
		}
	   }
	  }

 /***********************在LCD上任意坐标画点********************************/

void DrawPoint(uchar X,uchar Y,uchar Type) 
{ 							 //X,Y化点的坐标Type画点的类型:反相点,檫除点,画点
                                                    
   uchar DX = Y/8;           //计算出属于哪个字节 
   uchar BX = Y%8;           //计算出属于字节哪一位 
   uchar TempData = 0; 
    
    
   if (X > 63) 
   { 
    chip_select=2;
      X -= 64; 
   } 
   else 
   { 
      chip_select=1; 
   } 

   SetPage(DX);             //设行地址
   SetColumn(X); 			//设列地址
    
   TempData = ReadData();   //读出所画点所在字节的内容
    
   switch (Type)            //对该字节进行相应操作
   { 
      case Graphic_Clear:
          					TempData &= ~(1<<BX); 
         					break; 
      case Graphic_Not:
         					TempData ^= (1 << BX); 
          					break; 
      case Graphic_Draw: 
          					TempData |= (1 << BX);  
							break;
	  default:				break;
   } 
    
   SetPage(DX);             //设置行地址
   SetColumn(X);  			//设置列地址
   WriteData(TempData); 	//把修改后的字节送回LCD,达到画点目的
} 

/***********************在LCD上任意坐标写字********************************/
void DisWord(uchar add_y,uchar add_x,uchar k,uchar *p)	 //k=1,ascal;k=2,汉字。
{
 uchar i,j,w;
 j=add_x*2+0xb8;
 w=(add_y<8/k?add_y:add_y-8/k)*8*k+0x40; 
 CS1=(add_y<8/k);
 CS2=!(add_y<8/k);
  write(0,j);
  write(0,w);
 for(i=0;i<16*k;i++)
 {
  if(i==8*k)
  {
   write(0,j+1);
   write(0,w);
   }
  write(1,*p++);
  }
}

/*****************任意两点间划直线**********************************/
DrawLine(uchar x1,uchar y1,uchar x2,uchar y2,uchar type)
{
 uchar dx,dy,temp;
 uint kkk;
    if(x1>127) x1=127;
	if(y1>63) y1=63;
	if(x2>127) x2=127;
	if(y2>63) y2=63;

    if(x1==x2&&y1<y2) 
	{
	 for(dy=y1;dy<=y2;dy++) DrawPoint(x1,dy,type);
	 }

	if(x1<x2&&y1==y2) 
	{
	 for(dx=x1;dx<=x2;dx++) DrawPoint(dx,y1,type);
	 }

    if(x1>x2&&y1==y2)
    {
	 temp=x1;x1=x2;x2=temp;
	 for(dx=x1;dx<=x2;dx++) DrawPoint(dx,y1,type);
	 }

    if(x1==x2&&y1>y2)
    {
	 temp=y1;y1=y2;y2=temp;
	 for(dy=y1;dy<=y2;dy++) DrawPoint(x1,dy,type);
	 }

    if(x1<x2&&y1<y2)
    for(dx=x1;dx<=x2;dx++)
     {
      kkk=(dx-x1)*(y2-y1);
      dy=y1+kkk/(x2-x1);DrawPoint(dx,dy,type);
      }

	if(x1>x2&&y1>y2)								   //此向量尚有问题
    for(dx=x2;dx<=x1;dx++)
     {
      kkk=(dx-x2)*(y1-y2);
      dy=y2+kkk/(x1-x2);DrawPoint(dx,dy,type); 
      }
 
	if(x1<x2&&y1>y2)
    for(dx=x1;dx<=x2;dx++)
     {
      kkk=(dx-x1)*(y1-y2);
      dy=y1-kkk/(x2-x1);DrawPoint(dx,dy,type);
      }

	if(x1>x2&&y1<y2)
    for(dy=y1;dy<=y2;dy++)
     {
      kkk=(dy-y1)*(x1-x2);
      dx=x1-kkk/(y2-y1);DrawPoint(dx,dy,type);
      }	
}

/***********************************************************************/
void DrawSineWave(void)
{
	uchar xn=0;
	uchar yn=30;
	uchar i;
	uchar xi,yi;
for(i=0;i<128;i++)
	{
		xi=i;
		yi=(sin(i*0.1)*30)+30;

		DrawLine(xn,yn,xi,yi,Graphic_Draw);           //在一系列零散的点上,两点两点之间连线,从而得到一条曲线
		
		xn=i;
		yn=yi;
		
	}  
}

void DrawCircle(void)
{
uchar xn,yn,xi,yi;
unsigned int j;

xn=cos(0)*30+96;
yn=sin(0)*30+32;
//xn=cos(0)*15+96;
////yn=sin(0)*15+32;
for(j=0;j<629;j++)
//for(j=0;j<324;j++)
	{
		xi=(cos(j*0.01)*30)+96;
		yi=(sin(j*0.01)*30)+32;

		DrawLine(xn,yn,xi,yi,Graphic_Draw);          //在一系列零散的点上,两点两点之间连线,从而得到一条曲线
		
		xn=xi;
		yn=yi;
	}
}

void initlcd(void)
{
	CS1=1;
	CS2=1;
 	RST=0;																 q	
	delay_ms(100);
	RST=1;
	delay_ms(100);
	write(0,0x3e);
	write(0,0xc0);
	write(0,0x3f);
}

⌨️ 快捷键说明

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