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

📄 lcd.c

📁 用ICCAVR所写的温度采集函数
💻 C
字号:
//在LCD上显示的内容
#include "iom128v.h"
#include "MyMacro.h"

extern void Delay(unsigned int);	
extern unsigned char MCUState;	
extern unsigned char TimeScale;	
extern float Temperature;	
extern unsigned int SavedNum;  


//使用SPI发送数据
void SpiWriteByte(unsigned char byte)
{//没有使用头文件spi.h,库函数void SpiWriteByte(unsigned char byte)的实现方法是相同的
 unsigned char i=0;
 SPSR=SPSR&0x7f;   		   //清中断位
 SPCR=0x51;				   //使能SPI,16分频
 SPDR=byte;
 //Delay(1);
 while((SPSR&0x80)==0) ;    //等待传送结束
 }
 

//向LCD发送命令command_data
void SendCommand(unsigned char command_data)
{
 unsigned char i=0xf8;	  
 SpiWriteByte(i);		 
 
 i=command_data&0xf0;
 SpiWriteByte(i);
 
 i=command_data&0x0f;
 SpiWriteByte(i);
}


//向LCD发送数据byte_data
void SendData(unsigned char byte_data)
{
 unsigned char i=0xfa; 	
 SpiWriteByte(i);
 
 i=byte_data&0xf0;
 SpiWriteByte(i);
 
 i=byte_data&0x0f;
 SpiWriteByte(i);
}


//液晶的初始化设置
void LCDInitial()
{
unsigned char command_data; 
//Delay(5); 
command_data=0x30; 
SendCommand(command_data); /*功能设置:一次送8位数据,基本指令集*/ 
command_data=0x06; 
SendCommand(command_data); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ 
command_data=0x0f; 
SendCommand(command_data); /*显示设定:开显示,显示光标,当前显示位反白闪动*/ 
command_data=0x01; 
SendCommand(command_data); /*清DDRAM*/ 
Delay(5); 
command_data=0x02; 
SendCommand(command_data); /*DDRAM地址归位*/ 
Delay(5); 
command_data=0x80; 
SendCommand(command_data); /*把显示地址设为0X80,即为第一行的首位*/ 
}



//显示主菜单
void Show_MainMenu(void)		   
{
 unsigned char i=0;
 
 //把要显示的内容存储为字符型数组
 unsigned char LCD_Display[12]="LCD Display";
 unsigned char PC_Display[12]="PC  Display";
 unsigned char OTG_Host[9]="OTG Host";

 LCDInitial();
 for(i=0;i<11;i++)
 {
  SendData(LCD_Display[i]);
 }
 i=0x90;				   //换到第2行
 SendCommand(i);
 for(i=0;i<11;i++)
 {
  SendData(PC_Display[i]);
 }
 i=0x88;				   //换到第3行
 SendCommand(i);
 for(i=0;i<8;i++)
 {
  SendData(OTG_Host[i]);
 }
}



//显示Save Data?
//    Yes
//    No
void Show_Save_Data(void)  
{	 					   
 unsigned char i=0;	
 
 //把要显示的内容存储为字符型数组	   
 unsigned char Save_Data[11]="Save Data?";
 unsigned char Yes[4]="Yes";
 unsigned char No[3]="No";
 
 LCDInitial();
 for(i=0;i<11;i++)
 {
  SendData(Save_Data[i]);
 }
 
 i=0x90;				   //换到第2行
 SendCommand(i);
 for(i=0;i<3;i++)
 {
  SendData(Yes[i]);
 }
 
 i=0x88;				   //换到第3行
 SendCommand(i);
 for(i=0;i<2;i++)
 {
  SendData(No[i]);
 }
}


//显示Time Scale
//    05S 0x12
void Show_Time_Scale(void) 
{	 					   
 unsigned char i=0;
 		
 //把要显示的内容存储为字符型数组	 
 unsigned char Time_Scale[11]="Time Scale"; 
 
 LCDInitial();
 
 i=0x90;				   //换到第2行
 SendCommand(i);
 for(i=0;i<10;i++)
 {
  SendData(Time_Scale[i]);
 }
 i=0x88;				   //换到第3行
 SendCommand(i);
 
 i=0x20	;				  //先显示四个空格
 SendData(i);
 SendData(i);
 SendData(i);
 SendData(i);
 
 SendData(0x30);
 SendData(0x35);
 SendData(0x53);		  //初始值是05S
 
 //后边补三个空格 	
 i=0x20	;	 		  	 		
 SendData(i);
 SendData(i);
 SendData(i);
 
 //输出一个上下双向箭头
 i=0x12;	 		   
 SendData(i);
}


//刷新当前的TimeScale值
void Refresh_Time_Scale(void)
{
 unsigned char i=0;
 
 SendCommand(0x8A);			 //从0x8A开始刷新数字
 
 //输出当前设定的TimeScale值
 i=TimeScale/10+0x30;
 SendData(i);
 i=TimeScale%10+0x30;
 SendData(i);
}



//初始化显示温度采集界面,显示 Saved Num:0000和 0.0 K
void Show_Temp(void)
{
 unsigned int i=0;
 unsigned char Temp[7]={' ',' ','0','.','0',' ','K'};//xxx.x K
 unsigned char Saved_Num[16]="Saved Num:0000";
 
 //输出Saved_Num[]和SavedNum初始值0000,不消零
 LCDInitial();
	
 SendCommand(0x90);	   //换到第2行
 for(i=0;i<=13;i++)
 {
  SendData(Saved_Num[i]);
 }

 //输出温度值,绝对温度 从0x8A到0x8D共7个字符
 SendCommand(0x8A);		 //换到第三行
 for(i=0;i<=6;i++)
 {
  SendData(Temp[i]);
 }
}



//在正常的温度采集过程中实时刷新温度值的显示
void Refresh_Temp(void)
{
 unsigned int i=0;
 unsigned char Temp[7]={' ',' ','0','.','0',' ','K'};//xxx.x K
 unsigned char Saved_Num[15]="Saved Num:0000";
 
 //获取温度值Temperature得各位数字,并转化为ASII码存入数组
 i=Temperature*10;			  //把浮点数连同第一个小数位,转化成整数以提取各位数字
 if((Temperature-i)>=0.5)
 	i=i+1;				 	  //四舍五入
 if((i/1000)>0)	Temp[0]=(i/1000+0x30);			//提取百位
 i=i%1000;
 
 if((Temp[0]!=0)||(i/100>0))  Temp[1]=(i/100+0x30);	  //提取十位
 i=i%100;
 
 Temp[2]=(i/10+0x30);				  					  //提取个位
 Temp[4]=(i%10+0x30);									  //提取小数位
 
 //在确定保存数据后,获取所存数据的个数SavedNum 的各位数字,并转化为ASII码存入数组
 if(TimeScale!=0)	
{
 i=SavedNum;
 Saved_Num[10]=SavedNum/1000+0x30;
 i=SavedNum%1000;
 Saved_Num[11]=i/100+0x30;
 i=SavedNum%100;
 Saved_Num[12]=i/10+0x30;
 i=SavedNum%10;
 Saved_Num[13]=i+0x30;
 
 //更新SavedNum的值,不消零
 SendCommand(0x95);	   //换到第2行0x95
 for(i=10;i<=13;i++)
 {
  SendData(Saved_Num[i]);
 }
} 
 
 
 //更新温度值,绝对温度 从0x8A到0x8C共5个字符
 SendCommand(0x8A);		 //换到第三行
 for(i=0;i<=4;i++)
 {
  SendData(Temp[i]);
 }
}
 



//显示选择光标 ,0x11
void Show_Cursor(void)
{
 unsigned char i=0;
 unsigned char j=0;
 unsigned char k=0;
 
 //根据单片机的当前工作状态,确定光标显示在哪一行
 switch(MCUState)
 {
  case LCD_DISPLAY:	 i=1; //光标显示在第1行 87H
  case PC_DISPLAY :
  case TIME_SCALE :
  case SAVE_DATA_YES:i=3; //光标显示在第2行 97H
  case OTG_HOST	  :
  case SAVE_DATA_NO: i=2; //光标显示在第3行 8FH
  default		  :  ;
  }
  
 for(k=0;k<=3;k++)
 {
 //先把倒数第二列全部用空格填充
 j=0x87+k*0x08;	  	  	  
 SendCommand(j); 		  
 
 j=0x20;				 
 SendData(j);
 }
 //在适当的位置显示一个箭头
 j=0x87+(i-1)*0x08;
 SendCommand(j); 		  
 
 j=0x11;				 
 SendData(j);
}



 //根据单片机的运行状态决定液晶的显示内容 
void Show_LCD(void)
{
 switch(MCUState)
 {
  case WORKING 	 		 : Refresh_Temp();
  case LCD_DISPLAY		 : 
  case PC_DISPLAY		 : 
  case OTG_HOST			 : Show_MainMenu();
  
  case SAVE_DATA_YES	 : 
  case SAVE_DATA_NO		 : Show_Save_Data();
  case TIME_SCALE		 : Refresh_Time_Scale();
  }
 
 //最后必须显示选择光标
 Show_Cursor();
}

⌨️ 快捷键说明

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