?? 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)
{
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 + -