📄 perfect111.c
字号:
break;
}
if (Next==True)
{
NextTimes++;
Next=False;
ReturnMain=False;
ReturnSelection=False; //按下了Next键,那么这个时候关闭返回键的功能
if (AVGSpeedShow==False) //还没有显示AVGSpeed选项,显示它
{ //即第一次选择了确定键
WriteCmd(LCD_CLS);
DisplayString(0x0,0," AVGSpeed ");
DisplayString(0x0,1,"Next Show");
TotalDistanceShow=False; //显示了AVGSpeed,则表明TotalDistance还没有显示
Delay(120);
}
if (AVGSpeedShow==True) //已经显示过AVGSpeed选项了,则显示下一个选项
{ //即第一次选择了Next键
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Total Distance ");
DisplayString(0x0,1,"Next Show");
TotalDistanceShow=True; //表明显示了TotalDistance选项
Delay(120);
}
if (Next==True) //检测按键抖动并消除
Next=False;
}
if (Selected==True) //按下了确定键或返回键
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
if (ReturnSelection==True) //第一次选择了确定键,故这次按下的是返回键
ReturnMain=True;
if (ReturnSelection==False) //第一次选择了Next键,故这次按下的是确定键,显示第二个选项的内容
{
WriteCmd(LCD_CLS);
DisplayString(0,0,"The AVGSpeed is");
DisplayAVGSpeed();
DisplayString(0x0A,1,"m/s");
ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能
Delay(120);
}
TotalDistanceShow=False; //不管按下的是确定键还是返回键盘都表明TotalDistance选项还没有显示
if (Selected==True) //检测按键抖动并消除
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
}
if (ReturnMain==True) //按下了返回键,返回主菜单
{
ReturnMain=False;
continue;
}
/*------------------------------------第三次按键--------------------------------------*/
/*如果没有返回主菜单,则继续检测Next键和确定键*/
while(1)
{
if (Next==True)
break;
if (SelectedShow==True)
break;
}
/*按下Next键,显示下一个选项*/
if (Next==True)
{
NextTimes++;
Next=False;
ReturnMain=False;
ReturnSelection=False; //按下了Next键,那么这个时候关闭返回键的功能
if (TotalDistanceShow==True)
ReturnMain=True;
if (TotalDistanceShow==False) //还没有显示TotalDistance选项,显示它
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Total Distance ");
DisplayString(0x0,1,"Next Show");
TotalDistanceShow=True;
Delay(120);
}
if (Next==True) //检测按键抖动并消除
Next=False;
}
if (Selected==True) //按下了确定键或返回键
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
if (ReturnSelection==True) //按下的是返回键
ReturnMain=True;
if (ReturnSelection==False)
{
if (TotalDistanceShow==False) //表明AVGSpeed选项的内容还没有显示
{
WriteCmd(LCD_CLS);
DisplayString(0,0,"The AVGSpeed is");
DisplayAVGSpeed();
DisplayString(0x0A,1,"m/s");
ReturnSelection=True;
Delay(120);
}
if (TotalDistanceShow==True)
{
WriteCmd(LCD_CLS);
DisplayString(0,0,"Total Distance");
DisplayDistance();
DisplayString(0x0A,1,"m");
ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能
Delay(120);
}
}
if (Selected==True) //检测按键抖动并消除
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
}
if (ReturnMain==True) //按下了返回键,返回主菜单
{
ReturnMain=False;
continue;
}
/*------------------------------------第四次按键--------------------------------------*/
while(1)
{
if (Next==True)
break;
if (SelectedShow==True)
break;
}
if (Next==True) //所有菜单项已经显示完毕,返回主菜单
{
NextTimes++;
Next=False;
ReturnMain=False;
ReturnSelection=False;
if (TotalDistanceShow==False)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Total Distance ");
DisplayString(0x0,1,"Next Show");
TotalDistanceShow=True;
Delay(120);
}
if (Next==True) //检测按键抖动并消除
Next=False;
}
if (SelectedShow==True)
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
if (ReturnSelection==True) //按下的是返回键
ReturnMain=True;
if (ReturnSelection==False)
{
if (TotalDistanceShow==True)
{
WriteCmd(LCD_CLS);
DisplayString(0,0,"Total Distance");
DisplayDistance();
DisplayString(0x0A,1,"m");
ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能
Delay(120);
}
}
if (SelectedShow==True) //检测按键抖动并消除
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
}
if (ReturnMain==True || NextTimes==3) //按下了返回键或者Next键按过3次,返回主菜单
{
ReturnMain=False;
continue;
}
/*------------------------------------第五次按键--------------------------------------*/
while(1)
{
if (Next==True)
break;
if (SelectedShow==True)
break;
}
if (Next==True) //所有菜单项已经显示完毕,返回主菜单
{
NextTimes++;
Next=False;
ReturnMain=False;
ReturnSelection=False;
if (TotalDistanceShow==True) //最后一个选项已经显示完毕,返回主菜单
ReturnMain=True;
if (Next==True) //检测按键抖动并消除
Next=False;
}
if (SelectedShow==True)
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
if (ReturnSelection==True) //按下的是返回键
ReturnMain=True;
if (ReturnSelection==False)
{
if (TotalDistanceShow==True)
{
WriteCmd(LCD_CLS);
DisplayString(0,0,"Total Distance");
DisplayDistance();
DisplayString(0x0A,1,"m");
ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能
Delay(120);
}
}
if (SelectedShow==True) //检测按键抖动并消除
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
}
if (ReturnMain==True || NextTimes==3) //按下了返回键或者Next键按过3次,返回主菜单
{
ReturnMain=False;
continue;
}
/*------------------------------------第六次按键--------------------------------------*/
while(1)
{
if (Next==True)
break;
if (SelectedShow==True)
break;
}
if (Next==True)
{
NextTimes++;
Next=False;
ReturnMain=False;
ReturnSelection=False;
if (Next==True) //检测按键抖动并消除
Next=False;
}
if (SelectedShow==True)
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
if (SelectedShow==True) //检测按键抖动并消除
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
}
continue;
}
}
/****************************************************************************************\
** LCD驱动模块 **
\****************************************************************************************/
/*--------------------------------- LCD初始化函数--------------------------------------*/
void LCDInit(void)
{
//三次显示模式设置
LCD_Data=0;
LCD_E=Disable;
Delay(5);
WriteCmd(LCD_Init);
Delay(5);
WriteCmd(LCD_Init);
Delay(5);
WriteCmd(LCD_Init);
WriteCmd(LCD_Init); //初始化
WriteCmd(LCD_CloseCtr); //关显示
WriteCmd(LCD_CLS); //清屏幕
WriteCmd(LCD_EnterSet); //光标移动设置
WriteCmd(LCD_DispCtr); //显示开以及光标设置
}
/*--------------------------------- LCD模式设置函数--------------------------------------*\
SetWriteCmd() 设置LCD为写命令模式
SetReadCmd() 设置LCD为读命令模式
SetWriteData() 设置LCD为写数据模式
\*----------------------------------------------------------------------------------------*/
void SetWriteCmd(void)
{
LCD_RW=Write;
LCD_RS=Cmd;
}
void SetReadCmd(void)
{
LCD_RW=Read;
LCD_RS=Cmd;
}
void SetWriteData(void)
{
LCD_RW=Write;
LCD_RS=Data;
}
/*--------------------------------- LCD功能执行函数--------------------------------------*\
WriteCmd() 写命令
WriteData() 写数据
ExecuteCmd() 执行命令
SetXY() 显示定位
DisplaySingleChar() 显示单个字符
DisplayString() 显示一串字符
IsBusy() 忙标志检测
\*----------------------------------------------------------------------------------------*/
void WriteCmd(char cmd)
{
while(IsBusy());
LCD_Data=cmd;
SetWriteCmd();
ExecuteCmd();
}
void WriteData(char ddata)
{
while(IsBusy());
LCD_Data=ddata;
SetWriteData();
ExecuteCmd();
}
void ExecuteCmd(void)
{
LCD_E=Enable;
LCD_E=Disable;
}
void SetXY(char x,char y)
{
if (y)
x|=0x40;
x|=0x80;
Delay(5);
WriteCmd(x);
}
void DisplaySingleChar(char x,char y,char cchar)
{
SetXY(x,y);
WriteData(cchar);
}
void DisplayString(char x,char y,char *str)
{
while(*str)
{
Delay(5);
DisplaySingleChar(x++,y,*str);
str++;
}
}
bit IsBusy(void)
{
LCD_Data=0xFF;
SetReadCmd();
ExecuteCmd();
return (bit)(P1 & 0x80);
}
/*------------------------------------- 延时函数 -------------------------------------*/
void Delay(unsigned int time)
{
unsigned int timeCounter = 0;
for (timeCounter = time;timeCounter > 0 ;timeCounter --)
DelayUs(255);
}
void DelayUs(unsigned int time)
{
unsigned int timeCounter = 0;
for (timeCounter = 0;timeCounter < time;timeCounter ++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -