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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1152|回復: 1
打印 上一主題 下一主題
收起左側

AVR多級菜單調試通過

[復制鏈接]
跳轉到指定樓層
樓主
ID:526301 發表于 2019-6-2 23:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <iom8515v.h>            
#include <LCD1602.h>
#include <timer.h>
#include <key.h>

volatile unsigned int time_10ms_ok = 0;

void LED1ON(void)
{
  PORTD |=  BIT(0);
}

void NullSubs(void)                                            //空函數                  
{                                   }   


struct MenuItem  MainMenu[6] =             //結構體主菜單
{       
                {6,"1.fingerprint",&LED1ON,fingerprint,&Null},
                {6,"2.password set",&NullSubs,password,&Null},
                {6,"3.IC card set",&NullSubs,fingerprint,&Null},
                {6,"4.telecontrol",&NullSubs,fingerprint,&Null},
                {6,"5.system set",&NullSubs,fingerprint,&Null},
                {6,"6.rec inquire",&NullSubs,fingerprint,&Null},
};

struct MenuItem fingerprint[4] =                  //子菜單
{
                {4,"1.add fp",&NullSubs,&Null,MainMenu},
                {4,"2.del fp",&NullSubs,&Null,MainMenu},
};

struct MenuItem password[4] =                  //子菜單
{
                {4,"1.add password",&NullSubs,&Null,MainMenu},
                {4,"2.del password",&NullSubs,&Null,MainMenu},
};

struct MenuItem (*MenuPoint) = MainMenu;

void ShowMenu(void)
{
        unsigned char i = 0;
        MaxItems = MenuPoint[0].MenuCount;                //獲取當前菜單的條目數
        DisplayPoint = DisplayStart;                      //顯示菜單的編號
        if( MaxItems > LCD1602_Max_Display_Line ) //如果大于能顯示的菜單數做處理
        {
               for ( i = 0;i < LCD1602_Max_Display_Line;i++ )
               {
                   LCD_puts(1,i,MenuPoint[DisplayPoint].DisplayString);//2行分別顯示兩個菜單
               if ((DisplayPoint) == (UserChoose))
                   {
                   LCD_putc(0,0,0x7e);   //寫小箭頭
                   }
                   else
                   {
                   LCD_putc(0,i,' ');          //寫空格
                   }
               DisplayPoint += 1;   //字符串偏移量+1
                   if ((DisplayPoint) == (MaxItems))
                   {
               DisplayPoint = 0;
                   }
               }
    }
}

void ExcuteMenu(void)
{
        unsigned char GetKeyNum;
       
        if (time_10ms_ok)
        {                 //確定有功能按鍵被按下的情況下才執行其功能
           time_10ms_ok = 0;
           GetKeyNum = key_driver();
           if((GetKeyNum == 1)||(GetKeyNum == 2))
      {   
            switch (GetKeyNum)
            {
            case S_key://短按鍵
             UserChoose++;
                 if (UserChoose == MaxItems)
                 {
                 UserChoose = 0;//當用戶的選擇數大于最大菜單數量,則選定的清零到第一個
                 }
             GetKeyNum=0;
                 break;

            case L_key:  //長按鍵
             if (MenuPoint[UserChoose].ChildrenMenus != &Null)
                 {   
             MenuPoint=MenuPoint[UserChoose].ChildrenMenus;  //指向子菜單
                 SavePoint=UserChoose;  //顯示菜單的編號
                 UserChoose=0;
             DisplayStart=0;
             }
             else if (MenuPoint[UserChoose].ParentMenus != &Null)
                 {                                  
                 MenuPoint= MenuPoint[UserChoose].ParentMenus; //指向父菜單
                 UserChoose= 0;
                 DisplayStart= SavePoint-1;
                 UserChoose= SavePoint;        //恢復先前的菜單
             }
        if ((MenuPoint[UserChoose].Subs)!= NullSubs)
                     {
                         (*MenuPoint[UserChoose].Subs)();
                         }
             GetKeyNum=0;
             break;
             default: break;
            }
        //*--------------------------------------------------------------------
        //*菜單循環處理
        if ((UserChoose < DisplayStart) || (UserChoose >= (DisplayStart + 1 )))
            {
        DisplayStart = UserChoose;
        }  
        write_com(0x01);
        delay_nms(3);
        ShowMenu();
        }
  }
}


void main(void)                 
{

DDRB=0xff;                     //B口為輸出
DDRD=0x7f;
PORTD=0x80;
TCNT1H=0xD8;
TCNT1L=0xF0;
TCCR1B=0x02;
TIMSK=0x80;                                   // 允許中斷
SEI();
init_LCD();
ShowMenu();
while(1)
{
ExcuteMenu();
}              
}

#pragma interrupt_handler timer1:7
void timer1(void)
{
   time_10ms_ok=1;
   TCNT1H=0xD8;
   TCNT1L=0xF0;
   TIMSK=0x80;  
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-6-3 00:31 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草成人 | 亚洲一区二区三区免费观看 | 欧美精品网| 婷婷综合 | 国产ts人妖一区二区三区 | 在线看片福利 | 99久久精品免费看国产免费软件 | 黄色a三级 | 爱爱免费视频网站 | 国产一区二区三区视频 | 国内精品视频在线观看 | 91 中文字幕| 国产精品一区二区久久 | 成人久久18免费网站麻豆 | 日韩在线一区二区三区 | 日韩在线播放av | 国产精品久久久久久吹潮日韩动画 | 国产天天操 | 欧美综合精品 | 国产精品18久久久久久久 | 欧美色综合一区二区三区 | 免费三级黄| 中文字幕精品一区 | 国产一级片网站 | 免费看淫片 | caoporn免费在线视频 | 91精品在线播放 | 国产区在线观看 | 国产精品99久久久久久久久久久久 | 成人h免费观看视频 | 久久精品免费 | 中文字幕视频一区 | 精品乱人伦一区二区三区 | 日韩欧美在 | 亚洲国产激情 | 一区免费观看 | 色婷婷精品国产一区二区三区 | 一区在线视频 | 中文字幕乱码一区二区三区 | 久久精品一| 国产乱码精品1区2区3区 |