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

📄 lcmservice.c

📁 带时钟功能温度和湿度测量的仪器
💻 C
字号:
/*
文件名:  LCMService.c
功能:    液晶显示服务函数实现
单位:    浙江工商大学-信电学院
创建日期:2004-09-24
创建人:  Houseivan
修改人:  Houseivan
修改日期:2005-03-11
*/
/*------------------------------------------------*/
#include"Includes.h"
/*检查是否配置了显示器功能*/
#if _LCM_TASK>0
/*------------------------------------------------*/
/*液晶字型数组定义*/
	extern uchar code lcd_zx[][3];
/*液晶的显示缓冲区地址*/
	extern uchar code position[];
/*检测是否配置了传感器监控功能*/
/*	显示页面模板	*/
	extern uchar code TimePage[];
	extern uchar code DatePage[];
	extern uchar code WeekPage[];
	extern uchar code BusyPage[];
	extern uchar code ErrorPage[];
/*符号位包含在整数部分的最高位1:负数=======0:正数*/
	extern uchar data TempInteger;					//温度值整数和符号字节
	extern uchar data TempDecimal;					//温度值小数位字节
	extern uchar data HumiInteger;					//湿度值整数和符号字节
	extern uchar data HumiDecimal;					//湿度值小数位字节
	extern uchar data ClkLcmBuf[_MAX_LCM_NUM];
	extern uchar data UartRecBuf[_MAX_LENG];
	extern uchar data SystemState;					//系统运行状态指示
	extern uchar data LcmMode;						//显示模式选择

/*LCM0103控制线定义*/
	sbit CS=P1^4;
	sbit CLK=P1^6; //上升边沿触发
	sbit DI=P1^5;
/*------------------------------------------------*/
/*
名称: LCM_Initialize
功能: LCM0103初始化
注意:  
*/
void  LCM_Initialize(void)
{
        DI=0;
	    CS=1;
        CLK=1;
	    DelayTime(1,200);
        WriteCmd(NO_WDOG);  //1
        WriteCmd(CRY_OPEN); //2
        WriteCmd(DISP_ON);  //3
        WriteCmd(CLR_TIME); //4
        WriteCmd(IN_OK);    //5
        WriteCmd(INIT);
        LCM_Clear();
}
/*------------------------------------------------*/
/*------------------------------------------------*/
/*
名称: LCM_Clear(void)
功能: 显示器屏幕清除
注意:  
*/
void  LCM_Clear(void)
{
        uchar i=0;
        for(i=0;i<10;i++)
           OutputChar(position[i],22,0);
}
/*------------------------------------------------*//*------------------------------------------------*/
/*
名称: WriteBit
功能: 写入一个位信息
注意:  
*/
void WriteBit(bit mybit)
{
        CS=0;
        CLK=0;
        DI=mybit;
        CLK=1;
        DelayTime(1,5);
}
/*------------------------------------------------*/
/*------------------------------------------------*/
/*
名称: WriteCmd
功能: 写入命令字
注意:  
*/
void WriteCmd(uchar scmd)
{
        CS=0;
	    WriteData(COMD,3);
        WriteData(scmd,8);
        WriteBit(0);
        CS=1;
}  
/*------------------------------------------------*/
/*------------------------------------------------*/
/*
名称: WriteData
功能: 写一个数据包括模式和显示字模
注意:  
*/
void WriteData(uchar sdata,uchar N)
{
     bit bit1;
     uchar i=0;
     CS=0;
     if (N>8)N=8;
     for(i=0;i<N;i++)
      {
         bit1=((sdata & 0x01)==0x01);
         WriteBit(bit1);
         sdata>>=1;
	 }
}
/*------------------------------------------------*/
/*------------------------------------------------*/
/*
名称: SetupInAddr
功能: 写入设定的显示缓冲对应的地址
注意:  
*/
void SetupAddr(uchar sdata,uchar N)
{
     bit bit1;
     uchar i=0;
     if (N<8)sdata<<=(8-N);    
	 //A5  ~ A0 and A5=0
	 else N=8;
	 CS=0;
     WriteBit(0);
     for(i=0;i<N;i++)
	 {
  	   bit1=((sdata & 0x80)==0x80);//取出最高位
       WriteBit(bit1);
	   sdata<<=1;
	 }
	 CLK=0;
}
/*------------------------------------------------*/
/*------------------------------------------------*/
/*
名称: OutputChar
功能: 显示一位BCD数字在液晶屏上
注意: dot=1 then there is a dot need to display 
*/
void OutputChar(uchar LcmID,uchar bcdcode,bit dot)
{
     uchar i=0;
	 CS=0;
	 WriteData(WRITE,3);    //set_mode
	 SetupAddr(LcmID,5);    //0 A4~A0//设定首地址
	 for (i=0;i<3;i++)
	 {  
	    if(dot && (i==0))
	       WriteData((lcd_zx[bcdcode][i] | DOT),3);
	    else
	       WriteData(lcd_zx[bcdcode][i],3);
           WriteBit(0);
	 }
     CS=1;                  //结束一次数据写操作
}
/*------------------------------------------------*/
/*------------------------------------------------*/
/*
名称: OutputTHValue
功能: 显示两个字符数据/显示温湿度值页面
注意: [xxx][xxx] // -xx.x -xx.x
	  9        0
*/
void  OutputTHValue(uchar data1,uchar data2,uchar start)
{
	 uchar nTemp;
	 
	 nTemp=data1&0x7F;
     OutputChar(position[start+4],22,0);  				//off
     if ((data1&0x80)==0x80)	  						//最高位为1表示为负数
        	OutputChar(position[start+3],18,0);  		//显示一个负号'-'
	 else
			OutputChar(position[start+3],(nTemp/100),0);//显示一个最高位
	 //采用固定小数点方式显示
     OutputChar(position[start],(data2%10),0);
     OutputChar(position[start+1],(nTemp%10),1);
     OutputChar(position[start+2],((nTemp/10)%10),0);

	 //DelayTime(2,_LCM_KEEP_T);			  			//显示停留
}
/*------------------------------------------------*/
#if _SYS_TEST>0			    							//提供给测试用的输出开关
/*------------------------------------------------*/
/*
名称: OutputThreeChar
功能: 显示三个字节数据/日期和时钟页面
注意: [xx-xx-xx] 
*/
void  OutputThreeChar(uchar data1,uchar data2,uchar data3,uchar space)
{
	 LCM_Clear();
     OutputChar(position[0],17,0);
     OutputChar(position[9],16,0);     	//|_ 16:字型编号
     OutputChar(position[3],space,0);  	//间隔符号
     OutputChar(position[6],space,0);  
     OutputChar(position[1],(data3%10),0);
     OutputChar(position[2],(data3/10),0);
     OutputChar(position[4],(data2%10),0);
     OutputChar(position[5],(data2/10),0);
     OutputChar(position[7],(data1%10),0);
     OutputChar(position[8],(data1/10),0);

	 DelayTime(2,_LCM_KEEP_T);			//显示停留
	 LCM_Clear();
}
#endif
/*------------------------------------------------*/
/*
名称: OutputLcmBuf
功能: 显示特定页面缓冲的内容ClkLcmBuf[10]
注意: [xx-xx-xx] 
*/
void  OutputLcmBuf(uchar *start)
{
	uchar i;
	LCM_Clear();
	for(i=0;i<_MAX_LCM_NUM;i++)
	{
	 	OutputChar(position[9-i],*start++,0);
	}
	DelayTime(2,_LCM_KEEP_T);			 //显示停留
	LCM_Clear();
}
/*------------------------------------------------*/
/*------------------------------------------------*/
#if _SYS_TEST>0			    			//提供给测试用的输出开关
/*------------------------------------------------*/
/*
名称: OutputFrequency
功能: 显示检测到频率值页面   <64K HZ
注意: [      [00] 
*/
void  OutputFrequency(uint Myfre)
{
		 LCM_Clear();
         OutputChar(position[9],16,0);  //[ 16:字型编号
         OutputChar(position[0],17,0);  //]

		 OutputChar(position[1],0,0);  //]
		 OutputChar(position[2],0,0);  //]
		 OutputChar(position[3],0,0);  //]
         OutputChar(position[4],Myfre%10,1);
         OutputChar(position[5],(Myfre%100)/10,0);
         OutputChar(position[6],(Myfre%1000)/100,0);
         OutputChar(position[7],(Myfre%10000)/1000,0);
         OutputChar(position[8],Myfre/10000,0);
		 
		 DelayTime(1,_LCM_KEEP_T);				//显示停留
		 LCM_Clear();
 }
/*------------------------------------------------*/
#endif
/*------------------------------------------------*/
/*
名称: DispLayTaskRun()
功能: 执行需要的显示任务
注意: 要不断的检测标志
*/
void	DispLayTaskRun()
{
//#if	_SYS_TEST>0
	//OutputFrequency(UartRecBuf[0]);
//#else
	uchar LcmBuf[3];
/*根据模式将各模式需要显示的数据装载到显示缓冲中*/
	LCM_Clear();
	switch(SystemState)
	{
		case _CMD_NORMAL_RUN:
		/*检测是否配置了传感器监控功能*/
			OutputTHValue(TempInteger,TempDecimal,6);
			OutputTHValue(HumiInteger,HumiDecimal,0);
			OutputChar(position[4],22,0);  //off
    		OutputChar(position[5],22,0);  //[ 16:字型编号
			DelayTime(1,_LCM_KEEP_T);
		break;

		case _CMD_CTRL_RUN:
		#if _CLOCK_TASK>0
			ReadClock(ClkLcmBuf);				//更新时钟数据
		#endif
			switch(LcmMode)
			{
				case _TIME_RUN:
					LcmBuf[0]=ClkLcmBuf[_ID_HOUR];
					LcmBuf[1]=ClkLcmBuf[_ID_MINUTE];
					LcmBuf[2]=ClkLcmBuf[_ID_SECOND];
					CopyBuffer(TimePage,ClkLcmBuf);
					ClkLcmBuf[_ID_HOUR_H]=LcmBuf[0]/10;
					ClkLcmBuf[_ID_HOUR_L]=LcmBuf[0]%10;
					ClkLcmBuf[_ID_MINUTE_H]=LcmBuf[1]/10;
					ClkLcmBuf[_ID_MINUTE_L]=LcmBuf[1]%10;
					ClkLcmBuf[_ID_SECOND_H]=LcmBuf[2]/10;
					ClkLcmBuf[_ID_SECOND_L]=LcmBuf[2]%10;
				break;
				case _DATE_RUN:
					LcmBuf[0]=ClkLcmBuf[_ID_YEAR];
					LcmBuf[1]=ClkLcmBuf[_ID_MONTH];
					LcmBuf[2]=ClkLcmBuf[_ID_DAY];
					CopyBuffer(DatePage,ClkLcmBuf);
					ClkLcmBuf[_ID_YEAR_H]=LcmBuf[0]/10;
					ClkLcmBuf[_ID_YEAR_L]=LcmBuf[0]%10;
					ClkLcmBuf[_ID_MONTH_H]=LcmBuf[1]/10;
					ClkLcmBuf[_ID_MONTH_L]=LcmBuf[1]%10;
					ClkLcmBuf[_ID_DAY_H]=LcmBuf[2]/10;
					ClkLcmBuf[_ID_DAY_L]=LcmBuf[2]%10;

					#if _SYS_TEST >0
						OutputThreeChar(LcmBuf[0],LcmBuf[1],LcmBuf[2],_CHAR_FH);
					#endif
				break;
				case _WEEKLY_RUN:
					LcmBuf[0]=ClkLcmBuf[_ID_WEEKLY];
					CopyBuffer(WeekPage,ClkLcmBuf);
					ClkLcmBuf[_ID_WEEKLY_H]=LcmBuf[0]/10;
					ClkLcmBuf[_ID_WEEKLY_L]=LcmBuf[0]%10;
				break;
				case _COMBUSY_RUN:
					CopyBuffer(BusyPage,ClkLcmBuf);
				break;
				case _ERROR_RUN:
					CopyBuffer(ErrorPage,ClkLcmBuf);
				break;

				default:
					CopyBuffer(ErrorPage,ClkLcmBuf);	//出错
				break;
			}
			OutputLcmBuf(ClkLcmBuf);
		break;
		default:
			CopyBuffer(ErrorPage,ClkLcmBuf);			//出错
			OutputLcmBuf(ClkLcmBuf);
		break;
		}
//#endif
}
/*------------------------------------------------*/
#endif

⌨️ 快捷键说明

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