?? lcd多級.c
字號:
/*
最新12864LCD與4*4鍵盤人機交互界面源程序 0.95版
有朋友問我要源程序,這個源程序是我最近修改過的最新版本的12864與4*4鍵盤的人機交互界面,我只給出關鍵交互界面菜單的源程序,至于12864和4*4鍵盤的驅動,相信大家都有了。
最新版本的使用反白表示選擇行,增加了詳細的注釋。給需要的朋友一個參考。希望朋友們能寫出更好的菜單程序。
*/
//----------------------------------------
// 12864M四行多級菜單
// 文件名稱12864menu1。c
// 作者 張子墨
// 版本 0.95
// 最后更新2006/12/16
//----------------------------------------
//#include <SST89x5x4.H>
#include <at89s53.h>
#include "12864Driver.c"
#define MENULEVEL 7 //當前菜單表個數
#define OPTIONMETE 29 //當前選項個數,包括一個特別功能選項
//-------------------------------------
//
// 菜單結構定義
//
//-------------------------------------
struct Option
{
unsigned char KeyLevel; //菜單選項所屬菜單表號
unsigned char EnterIndex; //選項進入索引號
unsigned char CancelIndex; //選項退出索引號
unsigned char KeyWord[16]; //菜單選項文字描述數組
unsigned char WordMete; //菜單選項描述文字字節數
};
//-------------------------------------
//
// 具體菜單選項定義,定義一個結構數組
// 存儲在編碼區,節省內存RAM
//
//-------------------------------------
struct Option code sOption[OPTIONMETE] = {
{0,9,0,"文本功能",8}, //0
{0,16,1,"時間功能",8}, //1
{0,19,2,"溫度功能",8}, //2
{0,OPTIONMETE-1,3,"系統檢測",8}, //3
{0,OPTIONMETE-1,4,"修改密碼",8}, //4
{0,OPTIONMETE-1,5,"幫助說明",8}, //5
{0,OPTIONMETE-1,6,"作者介紹",8}, //6
{0,OPTIONMETE-1,7,"系統版本",8}, //7
{0,OPTIONMETE-1,8,"退出系統",8}, //8
{1,OPTIONMETE-1,0,"輸入顯示向導",12}, //9
{1,OPTIONMETE-1,0,"新建顯示文本",12}, //10
{1,OPTIONMETE-1,0,"文本發送顯示",12}, //11
{1,OPTIONMETE-1,0,"刪除已存文本",12}, //12
{1,14,0,"輸入法設定",10}, //13
{2,OPTIONMETE-1,13,"輸入法選擇",10}, //14
{2,OPTIONMETE-1,13,"輸入法排序",10}, //15
{3,OPTIONMETE-1,1,"設定本機時間",12}, //16
{3,OPTIONMETE-1,1,"發送本機時間",12}, //17
{3,OPTIONMETE-1,1,"與計算機同步時間",16}, //18
{4,23,2,"顯示當前溫度",12}, //19
{4,OPTIONMETE-1,2,"存儲當前溫度",12}, //20
{4,OPTIONMETE-1,2,"顯示已存溫度",12}, //21
{4,OPTIONMETE-1,2,"刪除已存溫度",12}, //22
{5,25,18,"本機顯示",8}, //23
{5,OPTIONMETE-1,19,"子機顯示",8}, //24
{6,OPTIONMETE-1,23,"LED 顯示",8}, //25
{6,OPTIONMETE-1,23,"數碼管顯示",10}, //26
{6,OPTIONMETE-1,23,"同時顯示",8}, //27
{0,0,0,"",0} //28
};
//--------------------------------------
//
// 菜單表分類數組
//
//--------------------------------------
unsigned char code Level[MENULEVEL][3] = {
{0,8,9}, //每層表單對應開始結束索引號以及選項數目
{9,13,5},
{14,15,2},
{16,18,3},
{19,22,4},
{23,24,2},
{25,27,3}
};
unsigned char FirstLineDisIndex = 0; //屏幕第一行顯示的索引號
unsigned char SelectLine = 1; //當前選擇的行
unsigned char SelectIndex = 0; //當前選定行對應的索引號
unsigned char LastIndex = 0; //進入功能函數前的索引號,判斷具體功能使用
//----------------------------------------
//
// 刷新菜單功能函數
// 函數原形:void DIS12864M (void);
// 沒有參數,沒有返回值
// 調用方式:void DIS12864M (void);
//
//----------------------------------------
void DIS12864M (void)
{
unsigned char i,LineMete = Level[sOption[SelectIndex].KeyLevel][2]; //循環量,顯示行數
SentAIns(0x30); //進入液晶普通指令模式
SentAIns(0x01); //清屏
SetALineReverse (SelectLine); //填充所需反白
do //分別顯示各行菜單項
{
SentAIns(0x80);
for(i=0;i<sOption[FirstLineDisIndex].WordMete;i++)
SentAData(sOption[FirstLineDisIndex].KeyWord[i]);
if(--LineMete == 0) break;
SentAIns(0x90);
for(i=0;i<sOption[FirstLineDisIndex+1].WordMete;i++)
SentAData(sOption[FirstLineDisIndex+1].KeyWord[i]);
if(--LineMete == 0) break;
SentAIns(0x88);
for(i=0;i<sOption[FirstLineDisIndex+2].WordMete;i++)
SentAData(sOption[FirstLineDisIndex+2].KeyWord[i]);
if(--LineMete == 0) break;
SentAIns(0x98);
for(i=0;i<sOption[FirstLineDisIndex+3].WordMete;i++)
SentAData(sOption[FirstLineDisIndex+3].KeyWord[i]);
}while(0);
}
//----------------------------------------
//
// 判斷當前索引是否是表單第一項功能函數
// 函數原形:bit MenuLevelStart (void);
// 沒有參數,返回Bit標志,是第一項返回1,不是返回0
// 調用方式:bit MenuLevelStart (void);
//
//----------------------------------------
bit MenuLevelStart (void) //判斷當前索引是否為當前層第一個選項
{
unsigned char i = MENULEVEL;
do
{
i--;
if(SelectIndex == Level[i][0]) return 1;
}while(i);
return 0;
}
//----------------------------------------
//
// 判斷當前索引是否是表單最后一項功能函數
// 函數原形:bit MenuLevelEnd (void);
// 沒有參數,返回Bit標志,是最后一項返回1,不是返回0
// 調用方式:bit MenuLevelEnd (void);
//
//----------------------------------------
bit MenuLevelEnd (void)
{
unsigned char i = MENULEVEL;
do
{
i--;
if(SelectIndex == Level[i][1]) return 1;
}while(i);
return 0;
}
//----------------------------------------
//
// 菜單上移一項函數
// 函數原形:void MenuUpOneOption (void);
// 沒有參數,沒有返回值
// 調用方式:void MenuUpOneOption (void);
//
//----------------------------------------
void MenuUpOneOption (void)
{
if(MenuLevelStart ()) //如果當前為表單第一項
{
if(Level[sOption[SelectIndex].KeyLevel][2]>=4) //并且表單中選項數目大于等于4個
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1]-3; //第一行顯示索引號為倒數第四項
SelectIndex = Level[sOption[SelectIndex].KeyLevel][1]; //選擇索引為表單最后一項
SelectLine = 4; //標記選擇行為第四行
DIS12864M (); //刷新屏幕顯示
}
else //如果選項數目并不大于四個
{
SelectIndex = Level[sOption[SelectIndex].KeyLevel][1]; //選擇索引為當前表單最后一個
SelectLine = Level[sOption[SelectIndex].KeyLevel][2]; //顯示行表單數目(最后一個)
DIS12864M (); //刷新屏幕顯示
}
}
else //如果當前不是開始索引
{
if(SelectLine==1) //并且已經在屏幕最上邊一行
{
FirstLineDisIndex--; //顯示索引上移
SelectIndex--; //選擇索引自減
SelectLine = 1; //選擇行還是第一行
DIS12864M (); //刷新屏幕
}
else //如果不是第一行
{
SelectLine--; //選擇行自減
SelectIndex--; //選擇索引自減
DIS12864M (); //刷新屏幕顯示
}
}
}
//----------------------------------------
//
// 菜單下移一項函數
// 函數原形:void MenuDownOneOption (void);
// 沒有參數,沒有返回值
// 調用方式:void MenuDownOneOption (void);
//
//----------------------------------------
void MenuDownOneOption (void)
{
if(MenuLevelEnd ()) //如果當前是表單最后一個索引
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行顯示索引為表單第一個選項
SelectIndex = Level[sOption[SelectIndex].KeyLevel][0]; //選擇索引為表單第一個選項索引
SelectLine = 1; //選擇行為第一行
DIS12864M (); //刷新顯示
}
else //如果不是最后的索引
{
if(SelectLine!=4) //如果當前不是屏幕最底行
{
SelectIndex++; //選擇索引自加
SelectLine++; //選擇行下移
SetALineReverse (SelectLine); //刷新選擇行
DIS12864M (); //刷新顯示
}
else //如果是屏幕最低行
{
FirstLineDisIndex++; //第一行顯示下移
SelectIndex++; //選擇索引自加
DIS12864M(); //刷新顯示
}
}
}
//----------------------------------------
//
// 某一項功能函數 實際應該改為實際功能函數
//
//----------------------------------------
void ShutDown (void)
{
unsigned char code font[] = {"系統關閉"};
unsigned char i;
SentAIns(0x01);
SentAIns(0x92);
for(i=0;i<8;i++) SentAData(font[i]);
}
void MenuCancelOption(void);
void NoThisFunction (void)
{
unsigned char code Font[] = {"沒有這個功能"};
unsigned int i,j;
SentAIns(0x01);
SentAIns(0x91);
for(i=0;i<12;i++) SentAData(Font[i]);
i = 65535;
j = 10;
do
{
do
{
i--;
}while(i);
j--;
}while(j);
MenuCancelOption();
}
void TemperatureShow(void)
{
unsigned char code Font[] = {"測試溫度:"};
unsigned int i,j;
TempConvert ();
SentAIns(0x01);
SentAIns(0x90);
for(i=0;i<10;i++) SentAData(Font[i]);
for(i=0;i<6;i++) SentAData(TempFont[i]);
i = 65535;
j = 10;
do
{
do
{
i--;
}while(i);
j--;
}while(j);
MenuCancelOption();
}
//----------------------------------------
//
// 具體功能散轉函數
// 函數原形:void FunctionAction
// 沒有參數,沒有返回值
// 調用方式:void FunctionAction (void);
//
//----------------------------------------
void FunctionAction (void)
{
switch (LastIndex) //根據進入前的索引判斷具體函數
{
case 8: ShutDown(); break;
case 5: TemperatureShow(); break;
default: NoThisFunction(); break; //如果沒有具體操作,顯示沒有這個功能
}
}
//----------------------------------------
//
// 進入某項功能函數
// 函數原形:void MenuEnterOption (void);
// 沒有參數,沒有返回值
// 調用方式:void MenuEnterOption (void);
//
//----------------------------------------
void MenuEnterOption (void)
{
LastIndex = SelectIndex; //標記進入前的索引號(以便判斷具體功能)
SelectIndex = sOption[SelectIndex].EnterIndex; //更新選擇索引為之前索引號對應進入索引
if(SelectIndex != OPTIONMETE-1) //如果當前索引不是功能選擇索引
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行顯示為進入表單第一項
SelectLine = 1; //設定第一行為選擇行
DIS12864M (); //刷新菜單
}
else FunctionAction (); //如果是功能選擇項,進入功能分支判斷函數
}
//----------------------------------------
//
// 菜單退出功能函數
// 函數原形:void MenuCancelOption (void);
// 沒有參數,沒有返回值
// 調用方式:void MenuCancelOption (void);
//
//----------------------------------------
void MenuCancelOption (void)
{
if(SelectIndex != OPTIONMETE-1) //如果不是從功能返回
SelectIndex = sOption[SelectIndex].CancelIndex; //選擇索引為選項返回索引
else //如果是從功能返回
SelectIndex = LastIndex; //索引等于進入前保存索引
if(Level[sOption[SelectIndex].KeyLevel][2]>=4) //如果返回表單選項數目大于4個
{
if(SelectIndex > Level[sOption[SelectIndex].KeyLevel][1]-3) //根據返回選項確定顯示首項
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1]-3;
SelectLine = 4-(Level[sOption[SelectIndex].KeyLevel][1]-SelectIndex);
DIS12864M (); //刷新顯示
}
else //一般顯示方式
{
FirstLineDisIndex = SelectIndex; //第一行顯示索引
SelectLine = 1; //選擇第一行
DIS12864M (); //刷新菜單
}
}
else //如果返回表單選項數目不足4個
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行顯示索引為表單第一項
SelectLine = SelectIndex - Level[sOption[SelectIndex].KeyLevel][0]+1; //選擇行標志為當前選擇索引對應行
DIS12864M (); //刷新菜單
}
}
//----------------------------------------
//
// 菜單操作按鍵處理散轉函數
// 函數原形:void KeyCodeAction (unsigned char KeyCode);
// 鍵碼作為參數,沒有返回值
// 調用方式:void KeyCodeAction (unsigned char KeyCode);
// 實際使用應根據自己的按鍵重新編寫case項
//
//----------------------------------------
void KeyCodeAction (unsigned char KeyCode)
{
switch (KeyCode)
{
case 'U': MenuUpOneOption(); break; //如果是向上按鍵,則菜單向上,以下類似
case 'D': MenuDownOneOption(); break;
case 'E': MenuEnterOption(); break;
case 'C': MenuCancelOption(); break;
default: break;
}
}
//----------------------------------------
//
// 菜單更新函數
// 函數原形:void MenuReflash (void);
// 沒有參數,沒有返回值
// 調用方式:void MenuReflash (void);
// 實際應配合自己的按鍵編碼獲取程序使用
//
//----------------------------------------
void MenuReflash (void)
{
unsigned char Keytemp; //保存按鍵編碼變量
Keytemp = GetKeyCode(); //保存按鍵編碼
if(Keytemp) //如果按鍵編碼有效
{
Keytemp = KeyCodeConvert (Keytemp); //根據按鍵編碼獲取按鍵說明字母
KeyCodeAction (Keytemp); //根據按鍵說明字母散轉
}
}
void main (void)
{
LcdInit ();
Init18b20();
DIS12864M ();
while (1) MenuReflash ();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -