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

📄 lcd_12864.c

📁 基于32位ColdFire构建嵌入式系统书本原程序.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
void LcdDrawCircle(uint8  Cy,uint8  Cx,uint8  CR,uint8  GrCilMV,uint8  GrE)
{
  uint8  x,y;                    //坐标的循环控制变量
  int32 mistake;               //显示时的误差值
  LcdSendCommand(0x36);    //扩展指令,绘图开
  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)     LcdDrawDot(y,x);//显示该点
	 	      //清除该点
	 	      else if(y<=31) LcdDrawDot16(y,(x/16),0);        
	 	      else           LcdDrawDot16(y-32,x/16+8,0); 
	 	     }
	 	 } 
  LcdSendCommand(0x30);//基本指令
}

//-------------------------------------------------------------------------*
//函数名: LcdDrawRect                                                      *
//功  能:在Lcd上指定行上显示或消除矩型边框                                 *
//参  数:row:行号,取值0-3                                                *    
//       visible:1-显示矩形边框;0-消除矩型边框                            *
//返  回:无                                                                *
//-------------------------------------------------------------------------*
void LcdDrawRect(uint8  row,uint8  visible)
{  
  uint8   Px,y;       //行页号坐标,列坐标
  uint8   i;          //循环变量
  int16   LC,RC,TBC;    //左,右和上下边框色
  //确定row所在行的起始坐标(左上角)
  if((row==0)||(row==2))  
     y=0;
  else  
     y=16;
  
  if(row<=1)  
     Px=0;
  else  
     Px=8;
  
  //确定有无边框(有visible决定)
  if(visible==1)     //有表框
  	 {
  	    TBC=65535;   //1111111111111111
  	    LC=32768;    //1000000000000000
  	    RC=1;
  	 }
  else              //无边框
     {
        TBC=0;
        LC=0;
        RC=0;
     }

  //LcdSendCommand(0b00110110);//扩展指令,绘图开
  LcdSendCommand(0x36);//扩展指令,绘图开

  //在Lcd上指定行上显示矩型边框
  for(i=0;i<=7;i++,Px++)
     {   
        LcdDrawDot16(y,Px,TBC);    //显示上边框 
        LcdDrawDot16(y+15,Px,TBC); //显示下边框
     }  
  for(i=1,y++,Px--;i<=14;i++,y++)
     {
        LcdDrawDot16(y,Px,RC);    //显示右边框 
        LcdDrawDot16(y,Px-7,LC);  //显示左边框      
     }
  LcdSendCommand(0x30);//基本指令
}

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

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

//-------------------------------------------------------------------------*
//函数名: LcdDrawDot16                                                     *
//功  能:在Lcd指定位置上设置线型16个点的显示                               *
//参  数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据                  *
//返  回:无                                                                *
//-------------------------------------------------------------------------*
void LcdDrawDot16(uint8  y,uint8  Px,int16 value)
{//设置4位绘图行地址
  
  LcdSendCommand(y|0x80);          //设置6位绘图列地址
  LcdSendCommand(Px|0x80);         //设置4位绘图行地址
  LcdSendData((uint8)(value>>8));  //写入高8个字节
  LcdSendData((uint8)value);       //写入低8个字节
}

//========================================================================*
//内部函数:                                                               *
//(1)写指令:LcdSendCommand                                                *
//(2)写数据:LcdSendData                                                   *
//(3)延时:DelayTimes                                                      *
//========================================================================*

//-------------------------------------------------------------------------*
//函数名: LcdSendCommand                                                   *
//功  能:执行参数中的给定命令                                              *
//参  数:command为待执行的命令码                                           *
//返  回:无                                                                *
//说 明:
//LCD串行控制命令字传送共分三个字节完成:
//第一字节:串口控制格式: 1111 1ABC
//         A 为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD
//         B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令
//         C 固定为0 
//第二字节:8 位数据的高4 位格式 DDDD0000  D:命令字
//第三字节:8 位数据的低4 位格式 0000DDDD
//-------------------------------------------------------------------------*
void LcdSendCommand(uint8 cCommand)
{
    QSPI_WriteToRAM1(QSPI_TX_RAM,0xf8);             //A=0 B=0 
	QSPI_WriteToRAM1(QSPI_TX_RAM+1,cCommand & 0xf0);//命令字高4位
	QSPI_WriteToRAM1(QSPI_TX_RAM+2,cCommand << 4 );  //命令字低4位  
	//每写一个数据配置一次命令字,共配置三次
	QSPI_WriteToRAM1(QSPI_COMMAND_RAM,QSPI_COM_CONT); 
	QSPI_WriteToRAM1(QSPI_COMMAND_RAM+1,QSPI_COM_CONT);
	QSPI_WriteToRAM1(QSPI_COMMAND_RAM+2,QSPI_COM_CONT);
	QSPI_StartTrans(3);  //使用SPI发送3个字节,无效电平为0电平
	DelayusTimes(72);      //延时,LCD需要时间执行命令
}

//-------------------------------------------------------------------------*
//函数名: LcdSendData                                                      *
//功  能:将参数中给定的数据写入液晶控制器                                  *
//参  数:cCommand为待写入的数据                                            *
//返  回:无                                                                *
//说 明:                                                                   *
//LcdSendData与LcdSendCommand命令发送帧格式除了第一个字节不同,其他都一致的 *
//本程序中,LCD模块的LcdSendData的第一个字节为0xFA,而LcdSendCommand为0xF8 *
//-------------------------------------------------------------------------*
void LcdSendData(uint8 cCommand)
{
    QSPI_WriteToRAM1(QSPI_TX_RAM,0xFA);
	QSPI_WriteToRAM1(QSPI_TX_RAM+1,cCommand & 0xf0);
	QSPI_WriteToRAM1(QSPI_TX_RAM+2,cCommand << 4);
	QSPI_WriteToRAM1(QSPI_COMMAND_RAM,QSPI_COM_CONT);
	QSPI_WriteToRAM1(QSPI_COMMAND_RAM+1,QSPI_COM_CONT);
	QSPI_WriteToRAM1(QSPI_COMMAND_RAM+2,QSPI_COM_CONT);
	QSPI_StartTrans(3); //发送3字节数据
	DelayusTimes(72);     //延时,LCD 需要时间来执行命令
}

//-------------------------------------------------------------------------*
//函数名: DelayTimes                                                       *
//功  能:延时指定的时间                                                    *
//入  口:tn为延时时间数(0到65535)                                          *
//出  口:无                                                                *
//-------------------------------------------------------------------------*
void DelayusTimes(uint16 tn)
{
  uint16 i,j;         //循环变量
  //32个指令
  for(i=0;i<tn;i++)
  	for(j=0;j<40;j++);//0.5us~32指令
  //32个指令	
  for(i=0;i<tn;i++)
  	for(j=0;j<40;j++);//0.5us~32指令
}

⌨️ 快捷键说明

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