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

📄 lcd.c

📁 驱动192*64的液晶屏,通过使用FPGA译码可以实现对液晶屏的三个分区的读写操作,进而实现复杂的程序设计
💻 C
字号:
//****************************************************************
//LCD驱动程序,保证LCD正常工作
//****************************************************************
#include 	<math.h>
#include 	<intrins.h>
//#include	"mainloop.h"
#include	"delay.h"
#include	"lcd.h"

extern unsigned char data LCD_CurrentX,LCD_CurrentY,LCD_Mask;


//****************************************************************
//函数原型:void LCD_WaitIdle1(void);
//功	能:片1测忙
//****************************************************************
void LCD_WaitIdle1(void)
{
	while(((LCD_Chip1_Sta_R_Reg)&0x80)==0x80);
}

//****************************************************************
//函数原型:void LCD_WaitIdle2(void);
//功	能:片2测忙
//****************************************************************
void LCD_WaitIdle2(void)
{
	while(((LCD_Chip2_Sta_R_Reg)&0x80)==0x80);
}

//****************************************************************
//函数原型:void LCD_WaitIdle3(void);
//功	能:片3测忙
//****************************************************************
void LCD_WaitIdle3(void)
{
	while(((LCD_Chip3_Sta_R_Reg)&0x80)==0x80);
}

//****************************************************************
//函数原型:void LCD_WC1(unsigned char cmdcode);
//功	能:写指令代码到片1
//****************************************************************
void LCD_WC1(unsigned char cmdcode)
{
	LCD_WaitIdle1();
   	LCD_Chip1_Cmd_W_Reg=cmdcode;
}

//****************************************************************
//函数原型:void LCD_WC2(unsigned char cmdcode);
//功	能:写指令代码到片2
//****************************************************************
void LCD_WC2(unsigned char cmdcode)
{
	LCD_WaitIdle2();
   	LCD_Chip2_Cmd_W_Reg=cmdcode;
}

//****************************************************************
//函数原型:void LCD_WC3(unsigned char cmdcode);
//功	能:写指令代码到片3
//****************************************************************
void LCD_WC3(unsigned char cmdcode)
{
	LCD_WaitIdle3();
   	LCD_Chip3_Cmd_W_Reg=cmdcode;
}

//****************************************************************
//函数原型:void LCD_WD1(unsigned char dispdata);
//功	能:写数据到片1
//****************************************************************
void LCD_WD1(unsigned char dispdata)
{
	LCD_WaitIdle1();
   	LCD_Chip1_Data_W_Reg=dispdata;
}

//****************************************************************
//函数原型:void LCD_WD2(unsigned char dispdata);
//功	能:写数据到片2
//****************************************************************
void LCD_WD2(unsigned char dispdata)
{
	LCD_WaitIdle2();
   	LCD_Chip2_Data_W_Reg=dispdata;
}

//****************************************************************
//函数原型:void LCD_WD3(unsigned char dispdata);
//功	能:写数据到片3
//****************************************************************
void LCD_WD3(unsigned char dispdata)
{
	LCD_WaitIdle3();
   	LCD_Chip3_Data_W_Reg=dispdata;
}

//****************************************************************
//函数原型:void LCD_RD1(unsigned char dispdata);
//功	能:读片1数据
//该操作将当前页地址寄存器和列地址指针组合确定的显示存储器单元的内容读出来.
//除了改写方式操作以外,读操作结束时将列地址指针加一
//****************************************************************
unsigned char LCD_RD1(void)
{
	LCD_WaitIdle1();
   	return LCD_Chip1_Data_R_Reg;
}

//****************************************************************
//函数原型:void LCD_RD2(unsigned char dispdata);
//功	能:读片2数据
//****************************************************************
unsigned char LCD_RD2(void)
{
	LCD_WaitIdle2();
   	return LCD_Chip2_Data_R_Reg;
}

//****************************************************************
//函数原型:void LCD_RD3(unsigned char dispdata);
//功	能:读片3数据
//****************************************************************
unsigned char LCD_RD3(void)
{
	LCD_WaitIdle3();
   	return LCD_Chip3_Data_R_Reg;
}

//****************************************************************
//函数原型:void LCD_WC(unsigned char cmdcode);
//功	能:写指令代码
//****************************************************************
void LCD_WC(unsigned char cmdcode)
{
	if((LCD_CurrentX)<64)
      LCD_WC1(cmdcode);
   	else if((LCD_CurrentX)<128)
      LCD_WC2(cmdcode);
   	else
      LCD_WC3(cmdcode);
}

//****************************************************************
//函数原型:void LCD_WD(unsigned char dispdata);
//功	能:写数据
//****************************************************************
void LCD_WD(unsigned char dispdata)
{
	if(LCD_CurrentX<64)
      LCD_WD1(dispdata);
   else if(LCD_CurrentX<128)
      LCD_WD2(dispdata);
   else
      LCD_WD3(dispdata);
}

//****************************************************************
//函数原型:void LCD_Pos(void);
//功	能:内部数据地址指针定位
//****************************************************************
void LCD_Pos(void)
{
	LCD_WC(LCD_CMD_COL|(LCD_CurrentX & 0x3f));      //设置地址列指针
   	LCD_WC(LCD_CMD_PAGE|((LCD_CurrentY/8)&0x7));    //设置地址页指针
}

//****************************************************************
//函数原型:unsigned char LCD_RD(void);
//功	能:读数据
//****************************************************************
unsigned char LCD_RD(void)
{  unsigned char i;
   if(LCD_CurrentX<64)
   {
   	i=LCD_RD1();       //读两次,虚读一次
      	i=LCD_RD1();	   //真读一次
   }
   else if(LCD_CurrentX<128)
   {
   	i=LCD_RD2();
      	i=LCD_RD2();
   }
   else
   {
   	i=LCD_RD3();
      	i=LCD_RD3();
   }
   LCD_Pos();
   return i;
}

//****************************************************************
//函数原型:unsigned char LCD_Cursor_Next(void);
//功	能:当前坐标移动到下一个点
//****************************************************************
void LCD_Cursor_Next(void)
{
	LCD_CurrentX++;
   	if(LCD_CurrentX>LCD_RIGHT)
   	{
   		LCD_CurrentX=LCD_LEFT;
      	LCD_CurrentY+=8;
      if(LCD_CurrentY>LCD_BOTTOM)
         LCD_CurrentY=LCD_TOP;
   	}
}
//******************************************************
//函数原型:void DispOneChar(unsigned char dispdata);
//功	能:按指定位置显示数出一个字符
//******************************************************
void DispOneChar(unsigned char dispdata)
{
	LCD_Pos();         					//内部数据地址指针定位
   	LCD_WD(dispdata);  					//写数据
   	LCD_Cursor_Next();  				//当前坐标移动到下一个点
}

//******************************************************
//函数原型:LCD_Fill(unsigned char FillData);
//功	能:整屏显示,也可以清屏
//******************************************************
void LCD_Fill(unsigned char FillData)
{
   LCD_Mask=0xff;
   for(LCD_CurrentX=LCD_LEFT,LCD_CurrentY=LCD_TOP;1;)
   {
   	DispOneChar(FillData);
      	if((LCD_CurrentX==LCD_LEFT)&&(LCD_CurrentY==LCD_TOP))
         break;
   }
}

//****************************************************************
//函数原型:void	LCD_Init();
//功	能:LCD初始化
//****************************************************************
void LCD_Init()
{
    LCD_WC1(LCD_CMD_OFF); 									//开显示
	LCD_WC2(LCD_CMD_OFF);
	LCD_WC3(LCD_CMD_OFF);
	
	LCD_WC1(LCD_CMD_ON); 									//开显示
	LCD_WC2(LCD_CMD_ON);
	LCD_WC3(LCD_CMD_ON);
        
    LCD_WC1(LCD_CMD_STARTLINE);
   	LCD_WC2(LCD_CMD_STARTLINE);   							//设置显示初始行
   	LCD_WC3(LCD_CMD_STARTLINE);
        
    LCD_Fill(0);    	                                                       //清屏
}

⌨️ 快捷键说明

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