|
傻孩子大人电子菜单移植AVRGCC PROGMEM
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=457580&bbs_page_no=1&bbs_id=1000
/************************************menu.h**************************************/
#ifndef __MENU_H__
#define __MENU_H__
#include <avr/pgmspace.h>
typedef struct MenuItem_t
{
uint8_t Size;
uint8_t * Str;
void (*Sub)(void);
struct MenuItem_t * Child;
struct MenuItem_t * Parent;
}MenuItem_t;
#define MENU(A) A##Menu
#define MENU_STR(A,B) A##B##Str
#define MENU_SIZE(A) A##Size
#define MENU_STR_DEF(A,B,C) const char MENU_STR(A,B)[] PROGMEM=C
#define MENU_STR_EXT(A,B) extern char MENU_STR(A,B)[]
#define MENU_ITEM(A,B,C,D,E) {MENU_SIZE(A),(uint8_t *)MENU_STR(A,B),C,( MenuItem_t * )D,( MenuItem_t * )E}
#define NULL_SUB (void (*)(void))0
#define NULL_MENU (MenuItem_t *)0
#define MENU_SUB_DEF(A,B)\
void A##B##Sub(void)
#define MENU_SUB_EXT(A,B)\
extern void A##B##Sub(void)
#define MENU_SUB(A,B) A##B##Sub
#define MENU_ARRAY_DEF(A,B)\
const MenuItem_t A[B] PROGMEM =
#define MENU_ARRAY_EXT(A)\
extern const MenuItem_t A[]
#ifdef IN_MENU_C
#endif
#ifndef IN_MENU_C
extern const MenuItem_t MainMenu[];
#endif
#endif //__MENU_H__
/************************************menu.c**************************************/
#include "menu.h"
#define IN_MENU_C
/*******************************TimerMenu 选单**********************************/
#define TimerMenuSize 4
MENU_STR_DEF(TimerMenu,0,"1.显示时间");
MENU_STR_DEF(TimerMenu,1,"2.时钟调整:时");
MENU_STR_DEF(TimerMenu,2,"3.时钟调整:分");
MENU_STR_DEF(TimerMenu,3,"4.时钟调整:秒");
MENU_SUB_DEF(TimerMenu,0){/******用户函数******/}
MENU_SUB_DEF(TimerMenu,1){/******用户函数******/}
MENU_SUB_DEF(TimerMenu,2){/******用户函数******/}
MENU_SUB_DEF(TimerMenu,3){/******用户函数******/}
MENU_ARRAY_DEF(TimerMenu,TimerMenuSize)
{
/**********选单名*****序号******功能函数*********子选单********** 父选单********/
MENU_ITEM(TimerMenu, 0, MENU_SUB(TimerMenu,0), NULL_MENU, MainMenu),
MENU_ITEM(TimerMenu, 1, MENU_SUB(TimerMenu,1), NULL_MENU, MainMenu),
MENU_ITEM(TimerMenu, 2, MENU_SUB(TimerMenu,2), NULL_MENU, MainMenu),
MENU_ITEM(TimerMenu, 3, MENU_SUB(TimerMenu,3), NULL_MENU, MainMenu),
};
/*******************************CapMenu 选单**********************************/
#define CapMenuSize 1
MENU_STR_DEF(CapMenu,0,"0.显示频率");
MENU_SUB_DEF(CapMenu,0){/******用户函数******/}
MENU_ARRAY_DEF(CapMenu,CapMenuSize)
{
/**********选单名*****序号******功能函数*********子选单********** 父选单********/
MENU_ITEM(CapMenu, 0, MENU_SUB(CapMenu,0), NULL_MENU, MainMenu),
};
/*******************************SongMenu 选单**********************************/
#define SongMenuSize 1
MENU_STR_DEF(SongMenu,0,"Song选单0");
MENU_SUB_DEF(SongMenu,0){/******用户函数******/}
MENU_ARRAY_DEF(SongMenu,SongMenuSize)
{
/**********选单名*****序号******功能函数*********子选单********** 父选单********/
MENU_ITEM(SongMenu, 0, MENU_SUB(SongMenu,0), NULL_MENU, MainMenu),
};
/*******************************MainMenu 选单**********************************/
#define MainMenuSize 9
MENU_STR_DEF(MainMenu,0,"主选单TIMER");
MENU_STR_DEF(MainMenu,1,"主选单CAP");
MENU_STR_DEF(MainMenu,2,"主选单Song");
MENU_STR_DEF(MainMenu,3,"主选单3");
MENU_STR_DEF(MainMenu,4,"主选单4");
MENU_STR_DEF(MainMenu,5,"主选单5");
MENU_STR_DEF(MainMenu,6,"主选单6");
MENU_STR_DEF(MainMenu,7,"主选单7");
MENU_STR_DEF(MainMenu,8,"主选单8");
MENU_ARRAY_DEF(MainMenu,MainMenuSize)
{
/**********选单名*****序号******功能函数*********子选单********** 父选单********/
MENU_ITEM(MainMenu, 0, NULL_SUB, TimerMenu, NULL_MENU),
MENU_ITEM(MainMenu, 1, NULL_SUB, CapMenu, NULL_MENU),
MENU_ITEM(MainMenu, 2, NULL_SUB, SongMenu, NULL_MENU),
MENU_ITEM(MainMenu, 3, NULL_SUB, NULL_MENU, NULL_MENU),
MENU_ITEM(MainMenu, 4, NULL_SUB, NULL_MENU, NULL_MENU),
MENU_ITEM(MainMenu, 5, NULL_SUB, NULL_MENU, NULL_MENU),
MENU_ITEM(MainMenu, 6, NULL_SUB, NULL_MENU, NULL_MENU),
MENU_ITEM(MainMenu, 7, NULL_SUB, NULL_MENU, NULL_MENU),
MENU_ITEM(MainMenu, 8, NULL_SUB, NULL_MENU, NULL_MENU),
};
傻孩子:关于那个标题……我很: - -b 非常感谢大家支持…… |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|