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

📄 lcd.c

📁 为日本瑞萨苏州分公司做的一个温控系统
💻 C
字号:
/*-----------------------------------------------------*
*文件描述:本文件包含了液晶显示相关子程序,分别为:       *  
*(1)Lcdinit:液晶初始化子程序                           *
*(2)LcdShCh:在液晶显示屏上显示字符数据                 *
*(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框        *
*(4)LcdShGrCil:在Lcd上显示或取消空心圆型               *
*-----------------------------------------------------*/

//包含头文件 
#include "gp32c.h"
#include "lcd.h"
//定义延时子程序
#define delay1600us DelayTimes(4000)     //延时>1.6ms
#define delay72us   DelayTimes(30)	      //延时>72us
#define delay40ms   DelayTimes(10000)     //延时>40ms
//内部调用函数声明
void DelayTimes(unsigned int);         //延时指定时间
void Wtite_Command(unsigned char);//将控制命令写入Lcd
void Wtite_Data(unsigned char);       //将数据写入Lcd
void LcdShGrClr(void);          //在Lcd上清图形显示屏
//在Lcd指定位置上设置线型16个点的显示
void LcdShGr16P(unsigned char,unsigned char,int);
//在Lcd指定位置上画1个点
void LcdShGr1P(unsigned char,unsigned char);

//==================[Lcd初始化操作]==========================
/*Lcdinit:初始化液晶-----------------------------------*
*功  能:初始化液晶,设置显示方式,清屏、C自动+1         *
*参  数:无                                             *
*返  回:无                                             *
*-----------------------------------------------------*/
void Lcdinit(void)
{
    LCD_CtrlPortDDR=0x07;      //控制口低三位设置为输出
	LCD_DataPortDDR=0xff;      //数据口设置为输出
	//[Lcd初始化]
	delay40ms;                 //延时>40ms
    Wtite_Command(0b00110000); //8位数据,基本指令
	Wtite_Command(0b00001100); //开显示
 	Wtite_Command(0b00000001); //清屏
	delay1600us;               //延时>1.6ms
	Wtite_Command(0b00000110); //进入模式设定
    LcdShGrClr();              //清Lcd图形显示屏
}

//==================[Lcd显示字符操作]========================
/*LcdShCh:在液晶显示屏上显示字符数据-------------------*
*功  能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
*参  数:待显示的64个数据的首地址                       *
*返  回:无                                             *
*-----------------------------------------------------*/
void LcdShCh(unsigned char *LcdSBuff)
{
	unsigned char i;             //data数组计数器(0-63)
  //[Lcd显示64个数据]   
    Wtite_Command(0x80);         //DDRAM地址设置
	for(i=0;i<64;i++)            //显示data中的64个数据
 	 { 
 	  //[Lcd按行显示16个数据]
 	  if((i<=15)||(i>=48))         //第一行和第四行不变
 	  	Wtite_Data(LcdSBuff[i]);   
 	  else if(i<=31)       //显示的第二行为缓冲的第三行
 	    Wtite_Data(LcdSBuff[i+16]);
 	  else                 //显示的第三行为缓冲的第二行
 	    Wtite_Data(LcdSBuff[i-16]);
 	 }        
}

//=====[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]=====
/*LcdShGrCil:在Lcd上显示或取消空心圆型-----------------*
*功  能:在Lcd上的指定位置显示或取消空心圆型            *
*参  数:Cx为圆心横坐标,Cy为圆心纵坐标                  *
*       CR为圆的半径,GrE确定图形是否有效               *
*       GrCilMV为显示圆型时的正误差值                  *
*       例如:半径为10,误差为4;半径为30,误差为30     *
*返  回:无                                             *
*-----------------------------------------------------*/
void LcdShGrCil(unsigned char Cy,unsigned char Cx,
                unsigned char CR,unsigned char 
                GrCilMV,unsigned char GrE)
{
  unsigned char x,y;            //坐标的循环控制变量
  long int mistake;             //显示时的误差值
  Wtite_Command(0b00110110);    //扩展指令,绘图开
  for(y=Cy-CR;y<=Cy+CR;y++)
      for(x=Cx-CR;x<=Cx+CR;x++)
	     {  
	      mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
	      //误差在范围之内时,显示该点
	      if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
	 	     {
 	          if(GrE==1)   LcdShGr1P(y,x);//显示该点
	 	      //清除该点
	 	      else if(y<=31) LcdShGr16P(y,(x/16),0);        
	 	      else           LcdShGr16P(y-32,x/16+8,0); 
	 	     }
	 	 } 
 // LcdShGr1P(Cy,Cx);//显示圆心       	   
  Wtite_Command(0b00110000);//基本指令
}

/*LcdShGrRe:在Lcd的指定行上显示或取消矩型边框--------*
*功  能:在Lcd上指定行上显示或取消矩型边框            *
*参  数:ln为指定的行数(0-3), GrE确定图形是否有效     *
*返  回:无                                           *
*---------------------------------------------------*/
void LcdShGrRe(unsigned char ln,unsigned char GrE)
{  
  unsigned char Px,y;//行页号坐标,列坐标
  unsigned char i;   //循环变量
  int LC,RC,TBC;     //左,右和上下边框色
  //[确定ln所在行的起始坐标(左上角)]
  if((ln==0)||(ln==2))  y=0;
  else  y=16;
  if(ln<=1)  Px=0;
  else  Px=8;
  //[确定有无边框(有GrE决定)]
  if(GrE==1)   //有表框
  	 {TBC=65535;LC=32768;RC=1;}
  else         //无边框
     {TBC=0;LC=0;RC=0;}
  Wtite_Command(0b00110110);//扩展指令,绘图开
  //[在Lcd上指定行上显示矩型边框]
  for(i=0;i<=7;i++,Px++)
     {   
        LcdShGr16P(y,Px,TBC);    //显示上边框 
        LcdShGr16P(y+15,Px,TBC); //显示下边框
     }  
  for(i=1,y++,Px--;i<=14;i++,y++)
     {
        LcdShGr16P(y,Px,RC);    //显示右边框 
        LcdShGr16P(y,Px-7,LC);  //显示左边框      
     }
  Wtite_Command(0b00110000);//基本指令
}

/*LcdShGrClr:在Lcd上清图形显示屏--------------*
*功  能:在Lcd上清图形显示屏(清GDRAM)          *
*参  数:无                                    *
*返  回:无                                    *
*--------------------------------------------*/
void LcdShGrClr(void)
{  
  unsigned char Px,y;//行页号,列坐标的循环变量
  Wtite_Command(0b00110110);//扩展指令,绘图开
  //[清图形显示屏(清GDRAM)]
  for(y=0;y<=31;y++)
     for(Px=0;Px<=15;Px++)
        LcdShGr16P(y,Px,0);  //写入0为清屏
  Wtite_Command(0b00110000);//基本指令
}

/*LcdShGr1P:在Lcd的指定位置上画一个点------------------*
*功  能:在Lcd的指定位置上画一个点                      *
*参  数:y为纵坐标(0-63),x为横坐标(0-127)              *
*返  回:无                                             *
*-----------------------------------------------------*/
void LcdShGr1P(unsigned char y,unsigned char x)
{
  unsigned int value=32768;//初始值为0b1000000000000000
  if(y>=32)                //第三四行必须调整x和y坐标
     {y=y-32;x=x+16*8;}
  value>>=(x-x/16*16);     //写入的16位数据
  LcdShGr16P(y,x/16,value);//显示相应的点
 }

/*LcdShGr16P:在Lcd指定位置上设置线型16个点的显示-----------*
*功  能:在Lcd指定位置上设置线型16个点的显示                *
*参  数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据   *
*返  回:无                                                 *
*---------------------------------------------------------*/
void LcdShGr16P(unsigned char y,unsigned char Px,int value)
{
 //Wtite_Command(0b00110110); //8位数据,扩展指令,绘图开
  Wtite_Command(y|0b10000000);//设置6位绘图列地址
  Wtite_Command(Px|0b10000000);//设置4位绘图行地址
  Wtite_Data((unsigned char)(value>>8));//写入高8个字节
  Wtite_Data((unsigned char)value);     //写入低8个字节
 //Wtite_Command(0b00110000); //8位数据,基本指令
}

//===========[Lcd基本操作:包括写指令,写数据和延时]===========
/*Wtite_Command:执行参数中的给定命令-------------------*
*功  能:执行参数中的给定命令                           *
*参  数:command为待执行的命令码                        *
*返  回:无                                             *
*-----------------------------------------------------*/
void Wtite_Command(unsigned char command)
{
	LCD_CtrlPort&=~(1<<LCD_RS);  //RS=0
	LCD_CtrlPort&=~(1<<LCD_RW);  //RW=0
	LCD_DataPort=command;        //数据上线
	LCD_CtrlPort|=(1<<LCD_E);    //E=1
    asm("nop");                  //使数据稳定
    asm("nop");
	LCD_CtrlPort&=~(1<<LCD_E);   //E=0,使数据有效
	delay72us;                   //延时>72us
}

/*Wtite_Data:将参数中给定的数据写入液晶控制器----------*
*功  能:将参数中给定的数据写入液晶控制器               *
*参  数:data为待写入的数据                             *
*返  回:无                                             *
*-----------------------------------------------------*/
void Wtite_Data(unsigned char data)
{
	LCD_CtrlPort|=(1<<LCD_RS);    //RS=1
	LCD_CtrlPort&=~(1<<LCD_RW);   //RW=0
	LCD_DataPort=data;            //数据上线
	LCD_CtrlPort|=(1<<LCD_E);     //E=1
    asm("nop");                   //使数据稳定
    asm("nop");
	LCD_CtrlPort&=~(1<<LCD_E);    //E=0,使数据有效
	delay72us;                    //延时>72us
}

/*DelayTimes:延时指定时间---------------*
*功  能:延时指定的时间                  *
*入  口:tn为延时时间数(0到65535)        *
*出  口:无                              *
*--------------------------------------*/
void DelayTimes(unsigned int tn)
{
  unsigned int i;    //循环变量
  for(i=0;i<tn;i++);
}

⌨️ 快捷键说明

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