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