新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機+lcd12864液晶屏菜單程序

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

        作者: 時間:2016-11-30 來源:網絡 收藏


        /*------------------------------------
        主界面處理
        ------------------------------------*/
        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(guideguide++;
        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


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 扎囊县| 抚州市| 桂阳县| 察雅县| 利川市| 屯门区| 博兴县| 黄大仙区| 五原县| 邵东县| 雅安市| 嵊州市| 重庆市| 隆德县| 黎川县| 犍为县| 江达县| 团风县| 太湖县| 弥渡县| 闽清县| 固始县| 临城县| 普陀区| 城固县| 平乐县| 凤凰县| 房产| 沂源县| 澎湖县| 宣汉县| 民县| 陕西省| 沅江市| 比如县| 彩票| 灵寿县| 滦南县| 彩票| 哈巴河县| 调兵山市|