久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機+lcd12864液晶屏菜單程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年08月07日   【字體:

效果視頻

這個是主界面


這個是主菜單界面


這個是設置時間的子界面


這個是設置日期


設置背景光


這是設置了按鍵音和鬧鈴以后,主界面出現狀態標志

 


鬧鈴的界面,喇叭出現鈴聲。


生日倒計時提醒功能。

 

全部完整的源代碼下載:http://www.zg4o1577.cn/bbs/dpj-20391-1.html
process.h文件:
/*------------------------------------
名稱:菜單處理模塊
編寫:YuMin_Dong
時間:2013.01.24
------------------------------------*/
#ifndef _PROCESS_H_
#define _PROCESS_H_

bit Menu_Flag;//設置畫面顯示標志
 
bit FanHui1;//是否退出主菜單標簽
bit Refresh_SetTime; //設置了時間需要刷新顯示置位改表現
bit Menu1,Menu2,Menu3,Menu4,Menu5,Menu6,Enter_Menu; //Menu0定義在LCD12864.H中了,因為顯示時間函數重復利用了.
//UINT8 MenuKey_Count;    //菜單鍵按下的次數
//UINT8 fen,shi,miao;//秒表功能用
bit Again;   //為了靜態顯示定義該標志,在子菜單下,第一次進入顯示一次界面然后在不修改前不會去刷新它
//bit Speaker_Flag;   //按鍵音標志
bit Set_Bright,Set_Speaker;  //亮滅背景光和按鍵音開關選項標志


bit Bell_Flag;
bit Menu1_Flag,Menu2_Flag;

/*------------------------------------
   按鍵控制位定義
------------------------------------*/
sbit KEY_MENU=P3^2; //選擇鍵,調用中斷,及時性
sbit KEY_UP=P0^0;  //上調
sbit KEY_DOWN=P0^1;  //下調
sbit KEY_ENTER=P0^2; //確定

sbit SPEAKER=P2^7;  //驅動喇叭位

sbit BRIGHT=P0^7; //背光控制位

 


/*------------------------------------
   主界面處理
------------------------------------*/
void MainMenu_Pro()
{
  if(guide!=guide_old) //箭頭位和之前的不同的話證明按鍵了,刷新顯示
  {
  LCD_RefreshMenu();  //刷新菜單顯示
  guide_old=guide;  //LCD靜態顯示,不然快速刷屏不好看
  LCD_WriteCommand(0x30); //修正回一般指令模式
  LCD_WriteCommand(0x82);
  LCD_SendString("功能菜單");//菜單標題
  }
   if(!KEY_DOWN)  //
   {
   DelayMs(10);
    if(!KEY_DOWN)
    {
    TR1=1;
    while(!KEY_DOWN)
    ;
    if(guide<MENU_NUM-1)
    guide++;
    TR1=0;
    }
   }
   
   else if(!KEY_UP)
   {
   DelayMs(10);
    if(!KEY_UP)
    {
    TR1=1;
    while(!KEY_UP)
    ;
    if(guide>0)
    guide--;
    TR1=0;
    }
   }
   
   else if(!KEY_ENTER)
    {
    DelayMs(10);
     if(!KEY_ENTER)
     {
     TR1=1;
     while(!KEY_ENTER)
     ;
      switch(guide)
      {
      case 0: Menu0=1;Enter_Menu=1;break;
      case 1: Menu1=1;Enter_Menu=1;break;
      case 2: Menu2=1;Enter_Menu=1;break;
      case 3: Menu3=1;Enter_Menu=1;break;
      case 4: Menu4=1;Enter_Menu=1;break;
      case 5: Menu5=1;Enter_Menu=1;break;
      case 6: FanHui1=1;Menu_Flag=0;guide=0;
        LCD_WriteCommand(0x01);break;  //輪詢到有enter鍵,當guide指向返回時候直接去掉FanHui1控制的父菜單循環
      default:return;
      }
     TR1=0;
     }
    }
}

/*------------------------------------
  Menu0設置時間子菜單處理
------------------------------------*/
void Menu0_Pro()
{
UINT8 temp;
  if(!Again)
  {
  LCD_ClearGDRAM();
  Set_Hour=1;   //第一次進入時候直接顯示調小時位
  Again=1;   //執行一次的標置置高,表明運行到該if條件下不執行下面語句
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("設置時間:");
  LCD_WriteCommand(0x98);
  LCD_SendString("ENTER 鍵保存修改");
  DS1302_ReadTime();
  Second=0;
  }
  
  if(Refresh_SetTime)   //當調節了刷新顯示
  {
  Refresh_SetTime=0;
  Display_Time();
  //Display_SetTime();
  }
  
  if(!KEY_UP)
  {
  DelayMs(10);
   if(!KEY_UP)
   {
   TR1=1;
   //Refresh_SetTime=1;
   while(!KEY_UP);
   TR1=0;
    if(Set_Hour)
    {
    temp=Hour/16;   //這里需要進行BCD數到十進制數的轉換
    Hour=Hour%16+temp*10;
     if(Hour<23)
     Hour++;
     else Hour=0;
    temp=Hour/10;   //轉換完以后再轉換會BCD數
    Hour=Hour%10+temp*16;
     //Display_Time();
    }
    else
    {
    temp=Minute/16;
    Minute=Minute%16+temp*10;
     if(Minute<59)
     Minute++;
     else Minute=0;
    temp=Minute/10;
    Minute=Minute%10+temp*16;
    }
    //Display_Time();
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_DOWN)
  {
  DelayMs(10);
   if(!KEY_DOWN)
   {
   TR1=1;
   //Refresh_SetTime=1;
   while(!KEY_DOWN);
   TR1=0;
    if(Set_Hour)
    {
    temp=Hour/16;
    Hour=Hour%16+temp*10;
     if(Hour>0)
     Hour--;
     else Hour=23;
    temp=Hour/10;
    Hour=Hour%10+temp*16;
     //Display_Time();
    }
    else
    {
    temp=Minute/16;
    Minute=Minute%16+temp*10;
     if(Minute>0)
     Minute--;
     else Minute=59;
    temp=Minute/10;
    Minute=Minute%10+temp*16;
     
    }
   //Display_Time();
   Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
    Enter_Menu=0;
    Menu0=0;
    guide_old++;
    Again=0;
    guide=0;
    Set_Hour=0;
    //Set_Minute=0;
    DS1302_WriteTime();
    LCD_ClearGDRAM();
    }
   }
  

}

/*------------------------------------
  Menu1設置日期子菜單處理
------------------------------------*/
void Menu1_Pro()
{
UINT8 temp;
  if(!Again)
  {
  LCD_ClearGDRAM();
  Set_Date=0;
  Again=1;
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("設置日期:");
  LCD_WriteCommand(0x98);
  LCD_SendString("ENTER 鍵保存修改");
  DS1302_ReadDate();
  }
  
  if(Menu1_Flag)    //每次Menu1下最少輪詢5個if條件,最7多個if.實驗證明,能帶得了,效果還行
  {
  Menu1_Flag=0;
  //Refresh_SetTime=1;
  Set_Date++;
  }
  
  if(Set_Date>2)
  Set_Date=0;
  
  if(Refresh_SetTime)   //當調節了刷新顯示
  {
  Refresh_SetTime=0;
  Display_SetDate();
  }
  
  if(!KEY_UP)
  {
  DelayMs(10);
   if(!KEY_UP)
   {
   TR1=1;
   while(!KEY_UP);
   TR1=0;
    if(Set_Date==0)
    {
    temp=Year/16;
    Year=Year%16+temp*10;
     if(Year<99)
     Year++;
     else Year=0;
    temp=Year/10;
    Year=Year%10+temp*16;
    }
    else if(Set_Date==1)
    {
    temp=Month/16;
    Month=Month%16+temp*10;
     if(Month<12)
     Month++;
     else Month=1;
    temp=Month/10;
    Month=Month%10+temp*16;
    }
    
    else if(Set_Date==2)
    {
    temp=Date/16;
    Date=Date%16+temp*10;
     if(Date<31)
     Date++;
     else Date=1;
    temp=Date/10;
    Date=Date%10+temp*16;
    }
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_DOWN)
  {
  DelayMs(10);
   if(!KEY_DOWN)
   {
   TR1=1;
   while(!KEY_DOWN);
   TR1=0;
    if(!Set_Date)
    {
    temp=Year/16;
    Year=Year%16+temp*10;
     if(Year>0)
     Year--;
     else Year=99;
    temp=Year/10;
    Year=Year%10+temp*16;
    }
    else if(Set_Date==1)
    {
    temp=Month/16;
    Month=Month%16+temp*10;
     if(Month>1)
     Month--;
     else Month=12;
    temp=Month/10;
    Month=Month%10+temp*16;
    }
    
    else if(Set_Date==2)
    {
    temp=Date/16;
    Date=Date%16+temp*10;
     if(Date>1)
     Date--;
     else Date=31;
    temp=Date/10;
    Date=Date%10+temp*16;
    }
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
    Enter_Menu=0;
    Menu1=0;
    guide_old++;
    Again=0;
    //guide=0;
    //Set_Hour=0;
    //Set_Minute=0;
    DS1302_WriteDate();
    LCD_ClearGDRAM();
    }
   }
  

}

/*------------------------------------
  Menu2鬧鈴功能
------------------------------------*/
void Menu2_Pro()
{
UINT8 temp;
  if(!Again)
  {
  LCD_ClearGDRAM();
  Set_Bell=0;
  //Set_Hour=1;   //第一次進入時候直接顯示調小時位
  Again=1;   //執行一次的標置置高,表明運行到該if條件下不執行下面語句
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("設置鬧鈴:");
  LCD_WriteCommand(0x98);
  LCD_SendString("  開啟      關閉");
  }
  
  if(Menu2_Flag)
  {
  Menu2_Flag=0;
  Set_Bell++;
  Refresh_SetTime=1;
  } 
  
  if(Set_Bell>3)
  Set_Bell=0;
  
  
  if(Refresh_SetTime)   //當調節了刷新顯示
  {
  Refresh_SetTime=0;
  Display_Bell();
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x98);
  LCD_SendString("  ");
  LCD_WriteCommand(0x9d);
  LCD_SendString("  ");
   if(Set_Bell>1)
   {
    if(Set_Bell==2)
    LCD_WriteCommand(0x98);
    else
    LCD_WriteCommand(0x9d);
   LCD_DisplayCGRAM(1);
   }
  }
  
  if(!KEY_UP)
  {
  DelayMs(10);
   if(!KEY_UP)
   {
   TR1=1;
   while(!KEY_UP);
   TR1=0;
    if(Set_Bell==0)
    {
     if(Bell_Hour<23)
     Bell_Hour++;
     else Bell_Hour=0;
    }
    else if(Set_Bell==1)
    {
     if(Bell_Minute<59)
     Bell_Minute++;
     else Bell_Minute=0;
    }
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_DOWN)
  {
  DelayMs(10);
   if(!KEY_DOWN)
   {
   TR1=1;
   while(!KEY_DOWN);
   TR1=0;
    if(Set_Bell==0)
    {
     if(Bell_Hour>0)
     Bell_Hour--;
     else Bell_Hour=23;
    }
    else if(Set_Bell==1)
    {
     if(Bell_Minute>0)
     Bell_Minute--;
     else Bell_Minute=59;
     
    }
   Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
    Enter_Menu=0;
    Menu2=0;
    guide_old++;
    Again=0;
    
    //將鬧鐘時轉換BCD以方便和ds1302讀出的數據比較
    temp=Bell_Hour/10; Bell_Hour=Bell_Hour%10+temp*16;
    temp=Bell_Minute/10; Bell_Minute=Bell_Minute%10+temp*16;
    
    if(Set_Bell==2)
    Bell_Flag=1;
    else Bell_Flag=0;
    LCD_ClearGDRAM();
    }
   }
}

/*------------------------------------
  Menu3背光功能
------------------------------------*/
void Menu3_Pro()
{
 if(!Again)
 {
 LCD_ClearGDRAM();   //LCD清屏幕
 Again=1;     //表明這個分支每次進入者只執行一次
 //Set_Bright=0;
 Refresh_SetTime=1;
 LCD_WriteCommand(0x30);
 LCD_WriteCommand(0x80);
 LCD_SendString("背景光開關設置:");
 LCD_WriteCommand(0x90);
 LCD_SendString("  開      關");
 LCD_WriteCommand(0x98);
 LCD_SendString("ENTER 鍵保存修改");
 }
  
  if(Refresh_SetTime)   //當調節了刷新顯示
  {
  Refresh_SetTime=0;
   if(Set_Bright)
   {
   LCD_WriteCommand(0x94);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x90);
   LCD_SendString("  ");
   }
   else
   {
   LCD_WriteCommand(0x90);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x94);
   LCD_SendString("  ");
   }
  }
  
   if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
     if(Set_Bright) BRIGHT=0;
     else BRIGHT=1;
     
    Enter_Menu=0;
    Menu3=0;
    guide_old++;
    Again=0;
    LCD_ClearGDRAM();
    }
   }
}

/*------------------------------------
  Menu4按鍵音功能
------------------------------------*/
void Menu4_Pro()
{
  if(!Again)
  {
  LCD_ClearGDRAM();
  Again=1;
  //Set_Speaker=0;
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("按鍵音開關設置:");
  LCD_WriteCommand(0x90);
  LCD_SendString("  開      關");
  LCD_WriteCommand(0x98);
  LCD_SendString("ENTER 鍵保存修改");
  }
  
  if(Refresh_SetTime)   //當調節了刷新顯示
  {
  Refresh_SetTime=0;
   if(Set_Speaker)
   {
   LCD_WriteCommand(0x94);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x90);
   LCD_SendString("  ");
   }
   else
   {
   LCD_WriteCommand(0x90);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x94);
   LCD_SendString("  ");
   }
  }
  
   if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
     if(Set_Speaker) ET1=0;
     else ET1=1;
     
    Enter_Menu=0;
    Menu4=0;
    guide_old++;
    Again=0;
    //guide=0;
    LCD_ClearGDRAM();
    }
   }
  

}

/*------------------------------------
  Menu5生日提醒功能
------------------------------------*/
void Menu5_Pro()
{
UINT16 temp;
LCD_ClearGDRAM();
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x80);
LCD_SendString("距我生日還有:");
LCD_WriteCommand(0x88);
LCD_SendString("距洋洋生日還有:");
temp=Month/16;
Month=Month%16+temp*10;

temp=Date/16;
Date=Date%16+temp*10;

 switch(Month)
 {
 case 1: temp=249-Date;break;
 case 2: temp=218-Date;break;
 case 3: temp=190-Date;break;
 case 4: temp=159-Date;break;
 case 5: temp=129-Date;break;
 case 6: temp=98-Date;break;
 case 7: temp=67-Date;break;
 case 8: temp=37-Date;break;
 case 9: if(Date<=6) temp=6-Date;
   else temp=365-30+Date;break;
 case 10:temp=(31-Date)+334;break;
 case 12:temp=(30-Date)+304;break;
 default: return;
 } 

 if(!(Year%0x4))
 temp+=1;

LCD_WriteCommand(0x06);
LCD_WriteCommand(0x90);
LCD_WriteData(temp/100|0x30);
LCD_WriteData(temp%100/10|0x30);
LCD_WriteData(temp%10|0x30);
temp+=12;
LCD_WriteCommand(0x98); 
LCD_WriteData(temp/100|0x30);
LCD_WriteData(temp%100/10|0x30);
LCD_WriteData(temp%10|0x30);
LCD_WriteCommand(0x93);
LCD_SendString("天");
LCD_WriteCommand(0x9b);
LCD_SendString("天");
 while(Menu5)
 {
  if(!KEY_ENTER)
  {
  DelayMs(10);
   if(!KEY_ENTER)
   {
   TR1=1;
   while(!KEY_ENTER);
   TR1=0;
   Menu5=0;
   LCD_ClearGDRAM();
   Enter_Menu=0;
   guide_old++;
   }
  }
 }
DS1302_ReadDate();
}

#endif
 

關閉窗口

相關文章

主站蜘蛛池模板: 国产精品久久久久久一区二区三区 | av入口| 岛国av免费在线观看 | 精品久久久久久久久久久 | 久久久高清 | 日本高清在线一区 | 欧美三区视频 | 久久国产精品一区二区三区 | 国产欧美久久一区二区三区 | 国产日韩欧美精品一区二区 | 欧美色性 | 黄色福利 | 日韩欧美综合在线视频 | 伊人久久免费视频 | 国产精品无码专区在线观看 | 久久99精品久久久 | 亚洲精品国产偷自在线观看 | 欧美大片一区二区 | 久久久久国产一区二区三区四区 | 成人午夜毛片 | 天天摸天天干 | 国产成人精品午夜视频免费 | xxx国产精品视频 | 精品伊人久久 | 精品一区二区三区四区五区 | 在线国产精品一区 | 日本又色又爽又黄又高潮 | 国产九九精品 | 午夜影视| 国产精品欧美一区二区三区不卡 | 日本视频中文字幕 | 精品二区 | 成人毛片视频免费 | 97国产精品 | 欧美成人高清 | 亚洲国产精品一区二区第一页 | 2019精品手机国产品在线 | av网站在线播放 | 欧美日韩不卡 | 日本视频免费 | 在线播放一区二区三区 |