亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lcd多級.c

?? 這是單片機驅動液晶顯示器12864和鍵盤的源代碼
?? 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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久色.com| 激情综合一区二区三区| 蜜臀久久久久久久| 波多野结衣亚洲一区| 欧美视频一区二区三区四区| 久久久91精品国产一区二区精品| 亚洲激情欧美激情| 成人天堂资源www在线| 91精品国产乱| 夜夜精品浪潮av一区二区三区| 成人精品视频一区| 日韩你懂的在线播放| 婷婷国产v国产偷v亚洲高清| voyeur盗摄精品| 久久精品视频在线看| 蜜乳av一区二区三区| 精品污污网站免费看| 亚洲视频在线观看三级| 国产成人精品亚洲午夜麻豆| 日韩欧美黄色影院| 日本麻豆一区二区三区视频| 欧美人与z0zoxxxx视频| 亚洲在线成人精品| 91浏览器在线视频| **网站欧美大片在线观看| 国产很黄免费观看久久| 337p日本欧洲亚洲大胆精品 | 色吊一区二区三区| 国产精品电影一区二区三区| 国产精品一级黄| 久久综合狠狠综合| 国产成人在线视频免费播放| 久久久91精品国产一区二区精品| 激情五月激情综合网| 日韩欧美二区三区| 国产一区在线精品| 国产精品色呦呦| 99久久婷婷国产综合精品电影| 国产精品人成在线观看免费 | 日本一区二区三区国色天香 | 亚洲国产成人私人影院tom| 紧缚奴在线一区二区三区| 精品国产乱码久久久久久浪潮| 久久不见久久见免费视频1| 日韩欧美一级在线播放| 激情小说亚洲一区| 国产精品午夜春色av| 91美女在线视频| 亚洲国产精品久久一线不卡| 欧美人与z0zoxxxx视频| 久久电影网站中文字幕| 2020国产精品| 99这里只有精品| 亚洲成人免费电影| 日韩欧美一区二区不卡| 国产91高潮流白浆在线麻豆 | 国产精品视频你懂的| 91麻豆自制传媒国产之光| 亚洲成人福利片| 精品成人免费观看| 99久久免费精品高清特色大片| 亚洲国产cao| 欧美成人精品福利| 99久久综合色| 免费三级欧美电影| 中文字幕亚洲区| 7777精品伊人久久久大香线蕉| 精品午夜久久福利影院| 中文字幕一区二区三区四区| 欧美三级电影在线观看| 国产一区二区在线看| 亚洲人成亚洲人成在线观看图片 | 色成年激情久久综合| 免费看日韩精品| 国产精品久久久久婷婷二区次| 欧美性猛交xxxxxx富婆| 国产一区久久久| 亚洲一区在线观看免费 | 国产.精品.日韩.另类.中文.在线.播放| 91亚洲国产成人精品一区二区三 | 成人免费av资源| 日本午夜精品一区二区三区电影| 中文在线一区二区| 欧美一区2区视频在线观看| a4yy欧美一区二区三区| 激情综合网av| 丝袜美腿亚洲一区二区图片| 国产精品国产三级国产普通话三级| 欧美一区三区四区| 色伊人久久综合中文字幕| 激情文学综合插| 偷拍自拍另类欧美| 一区二区三区日韩精品视频| 中文一区二区在线观看| 日韩精品中文字幕一区| 欧美日韩高清一区二区| 91精彩视频在线| 成人免费视频视频在线观看免费 | 亚洲va欧美va国产va天堂影院| 国产农村妇女毛片精品久久麻豆 | 欧美国产禁国产网站cc| 欧美大片在线观看一区二区| 欧美日韩精品福利| 色哟哟亚洲精品| 97超碰欧美中文字幕| 国产成人综合网站| 国产剧情一区在线| 狠狠色丁香久久婷婷综| 麻豆一区二区在线| 免费看黄色91| 久久国产精品色| 麻豆精品视频在线观看视频| 日本成人在线一区| 天堂一区二区在线免费观看| 一区二区三区中文字幕精品精品 | 免费观看日韩电影| 欧美96一区二区免费视频| 日韩国产精品大片| 青娱乐精品视频| 麻豆91在线播放免费| 美女精品一区二区| 激情国产一区二区| 国产精品自拍网站| 国产成人综合视频| av一二三不卡影片| 一本色道久久综合精品竹菊| 91成人国产精品| 欧美日韩激情一区二区三区| 欧美精品在线观看一区二区| 欧美肥妇free| 欧美mv日韩mv| 中文字幕av不卡| 一级做a爱片久久| 日韩高清不卡在线| 久久66热偷产精品| 成人一区二区三区| 一本色道**综合亚洲精品蜜桃冫| 欧美亚洲一区二区在线观看| 欧美另类高清zo欧美| 26uuu国产日韩综合| 中文字幕亚洲综合久久菠萝蜜| 亚洲一区二区三区自拍| 日本一区中文字幕 | 国产精品不卡一区| 亚洲激情av在线| 日韩 欧美一区二区三区| 国产精品一区二区黑丝| 91麻豆精品秘密| 日韩欧美亚洲国产精品字幕久久久| 久久精品夜色噜噜亚洲a∨| 亚洲婷婷综合久久一本伊一区| 亚洲18女电影在线观看| 国产一区二区精品久久99| www.欧美.com| 555www色欧美视频| 国产精品久久久久久久久搜平片| 亚洲高清不卡在线| 国v精品久久久网| 6080国产精品一区二区| 国产精品少妇自拍| 奇米精品一区二区三区在线观看一| 成人av影视在线观看| 91精品久久久久久久久99蜜臂 | 日韩一区二区三区四区| 中文字幕精品一区二区三区精品| 香蕉成人啪国产精品视频综合网 | 国产女主播一区| 丝袜亚洲另类丝袜在线| 99精品久久免费看蜜臀剧情介绍| 日韩免费高清电影| 亚洲一区二区偷拍精品| 成人黄色av电影| 久久亚洲综合色| 日韩精品一级二级| 在线观看免费成人| 亚洲天堂2016| 国产大陆a不卡| 日韩女优制服丝袜电影| 五月天网站亚洲| 91首页免费视频| 国产视频一区在线播放| 久久99久久精品| 欧美精品久久99久久在免费线| 亚洲欧美日韩国产手机在线 | 中文字幕av资源一区| 美女在线视频一区| 欧美日韩精品一区二区三区 | 欧美日韩久久久一区| 成人欧美一区二区三区1314| 国产久卡久卡久卡久卡视频精品| 欧美一级二级三级乱码| 婷婷久久综合九色综合伊人色| 在线视频中文字幕一区二区| 亚洲欧洲精品一区二区三区不卡| 国产精品一区二区三区乱码| 精品伦理精品一区| 精品一区二区在线播放| 欧美电视剧在线看免费| 久久精品久久精品| 日韩欧美成人一区|