📄 lcmservice.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 + -