打印
[AVR单片机]

手上项目太多。有没有手上没有事情的朋友!

[复制链接]
楼主: bjrhj
手机看帖
扫描二维码
随时随地手机跟帖
21
ocon| | 2010-7-28 16:56 | 只看该作者 回帖奖励 |倒序浏览
认真做事情的人才能成功。

使用特权

评论回复
22
daijianfeng| | 2010-7-28 18:26 | 只看该作者
1# bjrhj

使用特权

评论回复
23
xiaowai| | 2010-7-28 18:49 | 只看该作者
不知 我能否跟你一起合作
QQ:309979627

使用特权

评论回复
24
yxw0609131056| | 2010-7-28 18:54 | 只看该作者
什么项目?说说,如果我有兴趣,或许我可以助你一臂之力哦,因为我有的是时间

使用特权

评论回复
25
jt4117| | 2010-7-28 19:08 | 只看该作者
做产品没那么容易,原理图,PCB,焊接,调试,测试,写文档。
有那个时间,还不如锻炼锻炼身体,有个好身体,多活几年,比啥都强!!

使用特权

评论回复
26
yuyetufu| | 2010-7-28 19:36 | 只看该作者
不知道啥项目捏。说个大概下

使用特权

评论回复
27
bjrhj|  楼主 | 2010-7-29 11:39 | 只看该作者
好的。现在把需求提出来。
这个项目拖延了 7个月了。现在的进度是 PCB 已经回来。并且硬件调试基本完成。需要写菜单功能。
AVR128 驱动 夏普的彩屏。彩屏驱动买的现成模块。接口是并口驱动。图片如下
要求是写菜单和功能。
再具体需要见面谈一下。

使用特权

评论回复
28
diweo| | 2010-7-29 11:40 | 只看该作者
好奇

使用特权

评论回复
29
bjrhj|  楼主 | 2010-7-29 11:48 | 只看该作者
附件内容是PCB 的外观尺寸

20100729733.jpg (1.25 MB )

线路板

线路板

20100729734.jpg (1.52 MB )

彩屏图片

彩屏图片

使用特权

评论回复
30
bjrhj|  楼主 | 2010-7-29 11:57 | 只看该作者
这个项目。是升级产品。以前我们做的是数码管。现在需要改为液晶。但是ARM 不会。只能用单片机操作。这样用起来比较方便。液晶直接买的驱动模块。做起来比较省力。现在需要写一些菜单功能。
这个详细功能能是一个坐标测量仪器。他的精度非常高。传感器用的光栅和磁栅。这部分电路已经稳定不需要再做。现在需要做的是把原来的数码管产品升级到彩屏。只改显示部分。另外调试过程中有另一工程师陪护。
另外还有一些其他项目。我希望有时间的朋友能有利用业余时间完成。每周能保证一天到我这里调试。我在中关村一街。来回路费报销。午饭下馆子。夜里如果加班调试负责送。薪水面议。
项目都是一些单片机的项目。
我的联系方式:
QQ:18601621
  手机:13511004908 座机:010-62579848
  联系人:任工程师

使用特权

评论回复
31
Metalor| | 2010-7-29 14:36 | 只看该作者
感觉不难%……
但俺又没在北京……

使用特权

评论回复
32
lpcfans| | 2010-7-30 09:54 | 只看该作者
做产品没那么容易,原理图,PCB,焊接,调试,测试,写文档。
有那个时间,还不如锻炼锻炼身体,有个好身体,多活几年,比啥都强!!
jt4117 发表于 2010-7-28 19:08

o(∩_∩)o 哈哈。

使用特权

评论回复
33
lpcfans| | 2010-7-30 09:55 | 只看该作者
菜单不难。
LZ在北京哪儿?

使用特权

评论回复
34
lpcfans| | 2010-7-30 09:59 | 只看该作者
const unsigned char menu0_1[] FLASH={"1.自动操作"};
const unsigned char menu0_2[] FLASH={"2.手动操作"};
const unsigned char menu0_3[] FLASH={"3.系统设置"};

const unsigned char menu1[]  FLASH={"1.密码设置"};
const unsigned char menu2[]  FLASH={"2.车位设置"};
const unsigned char menu3[]  FLASH={"3.PLC选择"};
const unsigned char menu4[]  FLASH={"4.卡号设置"};
const unsigned char menu5[]  FLASH={"5.站号设置"};

const unsigned char menu6[]  FLASH={"1.系统密码设置"};
const unsigned char menu7[]  FLASH={"2.自动密码设置"};
const unsigned char menu8[]  FLASH={"3.手动密码设置"};
const unsigned char menu9[]  FLASH={"1.增加车位号码"};
const unsigned char menu10[] FLASH={"2.已设置号码数量"};
const unsigned char menu11[] FLASH={"1.增加卡片"};
const unsigned char menu12[] FLASH={"2.感应删除卡片"};
const unsigned char menu13[] FLASH={"3.手动删除卡片"};
const unsigned char menu14[] FLASH={"4.统计卡片数量"};

const unsigned char menu15[]  FLASH={"6.运行次数统计"};
#define  MAX_KEYTABSTRUCT_NUM 18
#define MENU_AUTOMIMA     1
#define MENU_SHOUMIMA      2

#define MENU_SYSTEMMIMA    3
#define MENU_MIMA       4
#define MENU_MIMA_SITONG      5
#define MENU_MIMA_ZHIDONG    6
#define MENU_MIMA_SHOUDONG     7

#define MENU_CHEWEI      8
#define MENU_CHEWEI_ADD    9
#define MENU_CHEWEI_CHAKAN     10

#define MENU_PLCSEL      11

#define MENU_KAHAO      12
#define MENU_KAHAO_ADD    13
#define MENU_KAHAO_GANYINDELL   14
#define MENU_KAHAO_SHOUDONGDELL   15
#define MENU_KAHAO_CHAKAN   16

#define MENU_ZHANHAO     17

#define MENU_GONUM      18
typedef struct
{
uchar MenuID;      //本菜单状态索引号
uchar ParMenuID;    //父菜单状态索引号
const uchar *MenuName;  //菜单文本内容
void (*CurrentOperate)(void); //本菜单的功能函数
}KeyTabStruct;
//菜单表,
const KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM] FLASH=
{
// 菜单ID       父菜单ID  菜单名     菜单功能函数
// MenuID,              ParMenuID,     MenuName,      CurFunction
{MENU_AUTOMIMA, 0, menu0_1, autodo_ex},
{MENU_SHOUMIMA, 0, menu0_2, shoudo_ex},
{MENU_SYSTEMMIMA, 0, menu0_3, NULL},
    {MENU_MIMA,    MENU_SYSTEMMIMA,   menu1,  NULL},
{MENU_MIMA_SITONG,  MENU_MIMA,      menu6,  set_system_mima},
{MENU_MIMA_ZHIDONG, MENU_MIMA,  menu7,  set_zhidong_mima},
{MENU_MIMA_SHOUDONG,MENU_MIMA,  menu8,      set_shoudong_mima},
{MENU_CHEWEI,      MENU_SYSTEMMIMA,   menu2,      NULL},
{MENU_CHEWEI_ADD,   MENU_CHEWEI,    menu9,  add_chewei},
{MENU_CHEWEI_CHAKAN,MENU_CHEWEI, menu10,  chakan_chehao_num},
{MENU_PLCSEL,   MENU_SYSTEMMIMA,   menu3,      select_plc},
{MENU_KAHAO,   MENU_SYSTEMMIMA,   menu4,      NULL},
{MENU_KAHAO_ADD, MENU_KAHAO,  menu11,  add_mifare_menu},
{MENU_KAHAO_GANYINDELL,MENU_KAHAO, menu12,  auto_del_mifare_menu},
{MENU_KAHAO_SHOUDONGDELL,MENU_KAHAO,menu13,  shou_del_mifare_menu},
{MENU_KAHAO_CHAKAN, MENU_KAHAO,  menu14,  count_mifare_menu},
{MENU_ZHANHAO,   MENU_SYSTEMMIMA,   menu5,  select_zaihao},
{MENU_GONUM,   MENU_SYSTEMMIMA,   menu15,  show_gonum}
};

typedef struct
{
unsigned char IndexMenuID[10];//本级菜单的菜单项的索引号的数组
char FocusMenuId; //为本级菜单的焦点
char FocusLine;  //本焦点在屏上是第几项
char StartLine;  //屏上的第一项菜单在IndexMenuID[10]上的索引值
}view_menu;
view_menu viewmenu;
//本函数得到本级菜单的当前菜单项与下个菜单项索引号的增量
//参数keyTabIndex:本级菜单的当前菜单的索引号
//返回参数:0:当前菜单项为本级菜单的最后一个菜单项,>0:表示下一个菜单项索引号与本级菜单项索引号的差值

使用特权

评论回复
35
lpcfans| | 2010-7-30 10:00 | 只看该作者
2
Dear all:
  key scan is troubled me ,in the circuit there are 15 keys,following struct is defined for key scan ,now I have a qustion to ask,how to assigned the following code into code,i use #progma code,but can not work at all,
typedef struct  
    {  
     unsigned int KeyTab_MenuIndex;      
     unsigned int KeyTab_MaxItems;           
     unsigned int KeyTab_PressOk;         
     unsigned int KeyTab_PressESC;        
     unsigned int KeyTab_PressDown;         
     unsigned int KeyTab_PressUp;        
     unsigned int KeyTab_PressLeft;         
     unsigned int KeyTab_PressRight;         
    }KeyTabStruct;  
KeyTabStruct KeyTab[];

KeyTabStruct xdata KeyTab [MAX_KEYTABSTRUCT_NUM] =
{   


//CurMenuID,       MaxMenuItem,      OkMenuID,              EscMenuID,        DownMenuID,          UpMenuID,         EFTMenuID,  RIGHTMenuID,   
{MENU_FACE,           0,              MENU_ROOT,               999,              999,               999,                999,         999 },
{MENU_ROOT,           8,            Inverter_Quick_Set,          999,     Inverter_Quick_Set,         999,               999,         999 },
{Inverter_Quick_Set, 0,         Inverter_Quick_Set_Father,     999,    Inverter_Param_Set,  Inverter_Keyword_Setup,   999,        999 },   
{Inverter_Param_Set, 0,         Inverter_Param_Set_Father,      999,       Motor_Para_Set,      Inverter_Quick_Set,    999,         999},     
{Motor_Para_Set,      0,         Motor_Para_Set_Father,          999,   Motor_Param_Estimate,    Inverter_Param_Set,    999,       999 },     
{Motor_Param_Estimate, 0,      Motor_Param_Estimate_Father,     999, Inverter_Experiment_Fun,   Motor_Para_Set,       999,        999},      
{Inverter_Experiment_Fun, 0, Inverter_Experiment_Fun_Father,    999, Inverter_Error_Inform,    Motor_Param_Estimate,      999,    999},     
{Inverter_Error_Inform, 0,    Inverter_Error_Inform_Father,     999, Inverter_State_Monitor, Inverter_Experiment_Fun, 999,     999},      
{Inverter_State_Monitor, 0,   Inverter_State_Monitor_Father,    999, Inverter_Keyword_Setup, Inverter_Error_Inform,   999,     999  },      
{Inverter_Keyword_Setup, 0,   Inverter_Keyword_Setup_Father,    999,   Inverter_Quick_Set,   Inverter_State_Monitor, 999,          999 },      
};

the variable in KeyTab are define as follow:
#define MENU_FACE  0
#define MENU_ROOT  1

使用特权

评论回复
36
lpcfans| | 2010-7-30 10:01 | 只看该作者
3
#include <reg51.h>

#define MAX_KEYTABSTRUCT_NUM                        2
#define MENU_FACE                                    0
#define MENU_ROOT                                    1
#define     MENU_VIEW                                2
#define            MENU_VIEW_ABOUTRECORDE                3
#define            MENU_VIEW_HANDSETCLOCK                4
#define        MENU_OPERATION                            5
#define            MENU_OPERATION_SETPOSITION            6
#define            MENU_OPERATION_READZJTOFLASH        7
#define            MENU_OPERATION_RDZJTORAM            8
#define            MENU_OPERATION_DELGIVENZL            9
#define            MENU_OPERATION_DELALLZJ                10
#define        MENU_TEST                                11
#define            MENU_TEST_RAMTEST                    12
#define            MENU_TEST_FLASHTEST                    13
#define        MENU_SYSTEMSET                            14
#define            MENU_SYSTEMSET_DEBUG                15
#define                MENU_SYSTEMSET_DEBUG_PASSWORD    16
#define                MENU_SYSTEMSET_DEBUG_SEEPICTURE    17
#define            MENU_SYSTEMSET_SETHANDCLK            18

sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
typedef struct
    {
    unsigned int KeyTab_MenuIndex;        //当前状态索引号
    unsigned int KeyTab_MaxItems;        //本级菜单最大条目数
    unsigned int KeyTab_PressOk;        //按下"回车"键时转向的状态索引号
    unsigned int KeyTab_PressEsc;        //按下"返回"键时转向的状态索引号
    unsigned int KeyTab_PressDown;        //按下"向下"键时转向的状态索引号
    unsigned int KeyTab_PressUp;        //按下"向上"键时转向的状态索引号
    void    (*CurrentOperate)();        //当前状态应该执行的功能操作
    }KeyTabStruct;

void MenuFunctionDemo1();
void MenuFunctionDemo2();
void MenuFunctionDemo3();
void MenuFunctionDemo4();
void MenuFunctionDemo5();
void MenuFunctionDemo6();
void MenuFunctionDemo7();
void MenuFunctionDemo8();
void MenuFunctionDemo9();
void MenuFunctionDemo10();
void MenuFunctionDemo11();
void MenuFunctionDemo12();
void MenuFunctionDemo13();
void MenuFunctionDemo14();
void MenuFunctionDemo15();
void MenuFunctionDemo16();
void MenuFunctionDemo17();
void MenuFunctionDemo18();
void MenuFunctionDemo19();
void MenuFunctionDemo1()
{
   
}
void MenuFunctionDemo2()
{
//    P1 = 0;
}
KeyTabStruct code KeyTab[MAX_KEYTABSTRUCT_NUM]=
    {
        //CurMenuID,              MaxMenuItem,    OkMenuID,        
                EscMenuID,                DownMenuID,   
                        UpMenuID,               
            CurFunction
        {MENU_FACE,                            0,
    MENU_ROOT,                        999,            
        999,                           
    999,                           
    *MenuFunctionDemo1},
        {MENU_ROOT,                            4,
    MENU_VIEW,                        MENU_FACE,        
        MENU_OPERATION,                        MENU_SYSTEMSET,   
                    *MenuFunctionDemo2}
/*        {MENU_VIEW,                            2,
    MENU_VIEW_ABOUTRECORDE,            MENU_ROOT,            
    MENU_OPERATION,                        MENU_SYSTEMSET,        
                *MenuFunctionDemo3},
        {MENU_VIEW_ABOUTRECORDE,            0,    999,        
                    MENU_VIEW,            
    MENU_VIEW_HANDSETCLOCK,                MENU_VIEW_HANDSETCLOCK,   
            *MenuFunctionDemo4},
        {MENU_VIEW_HANDSETCLOCK,            0,    999,        
                    MENU_VIEW,            
    MENU_VIEW_ABOUTRECORDE,                MENU_VIEW_ABOUTRECORDE,   
            *MenuFunctionDemo5},
        {MENU_OPERATION,                    5,
    MENU_OPERATION_SETPOSITION,        MENU_ROOT,            
    MENU_TEST,                          MENU_VIEW,                    
        *MenuFunctionDemo6},
        {MENU_OPERATION_SETPOSITION,        0,    999,            
                MENU_OPERATION,        
    MENU_OPERATION_READZJTOFLASH,        MENU_OPERATION_DELALLZJ,        
    *MenuFunctionDemo7},
        {MENU_OPERATION_READZJTOFLASH,        0,    999,            
                MENU_OPERATION,        
    MENU_OPERATION_RDZJTORAM,            MENU_OPERATION_SETPOSITION,        
    *MenuFunctionDemo8},
        {MENU_OPERATION_RDZJTORAM,            0,    999,        
                    MENU_OPERATION,        
    MENU_OPERATION_DELGIVENZL,            MENU_OPERATION_READZJTOFLASH,   
    *MenuFunctionDemo9},
        {MENU_OPERATION_DELGIVENZL,            0,    999,        
                    MENU_OPERATION,        
    MENU_OPERATION_DELALLZJ,            MENU_OPERATION_RDZJTORAM,        
    *MenuFunctionDemo10},
        {MENU_OPERATION_DELALLZJ,            0,    999,        
                    MENU_OPERATION,        
    MENU_OPERATION_SETPOSITION,            MENU_OPERATION_DELGIVENZL,        
    *MenuFunctionDemo11},
        {MENU_TEST,                            2,
    MENU_TEST_RAMTEST,                MENU_ROOT,            
    MENU_SYSTEMSET,                     MENU_OPERATION,            
            *MenuFunctionDemo12},
        {MENU_TEST_RAMTEST,                    0,    999,   
                        MENU_TEST,            
    MENU_TEST_FLASHTEST,                MENU_TEST_FLASHTEST,            
    *MenuFunctionDemo13},
        {MENU_TEST_FLASHTEST,                0,    999,        
                    MENU_TEST,            
    MENU_TEST_RAMTEST,                    MENU_TEST_RAMTEST,        
            *MenuFunctionDemo14},
        {MENU_SYSTEMSET,                    2,
    MENU_SYSTEMSET_DEBUG,            MENU_ROOT,            
    MENU_VIEW,                          MENU_TEST,               
            *MenuFunctionDemo15},
        {MENU_SYSTEMSET_DEBUG,                2,
    MENU_SYSTEMSET_DEBUG_PASSWORD,    MENU_SYSTEMSET,        
    MENU_SYSTEMSET_SETHANDCLK,            MENU_SYSTEMSET_SETHANDCLK,        
    *MenuFunctionDemo16},
        {MENU_SYSTEMSET_DEBUG_PASSWORD,        0,    999,            
                MENU_SYSTEMSET_DEBUG,    MENU_SYSTEMSET_DEBUG_SEEPICTURE,
    MENU_SYSTEMSET_DEBUG_SEEPICTURE,    *MenuFunctionDemo17},
        {MENU_SYSTEMSET_DEBUG_SEEPICTURE,    0,    999,            
                MENU_SYSTEMSET_DEBUG,    MENU_SYSTEMSET_DEBUG_PASSWORD,   
    MENU_SYSTEMSET_DEBUG_PASSWORD,        *MenuFunctionDemo18},
        {MENU_SYSTEMSET_SETHANDCLK,            0,    999,        
                    MENU_SYSTEMSET,        
    MENU_SYSTEMSET_DEBUG,                MENU_SYSTEMSET_DEBUG,            
    *MenuFunctionDemo19} */
    };
    //************************************************************************
//* Menu Struct:                                                         *
//************************************************************************
//* First Bmp--------------------->(MenuID=0)                            *
//*  ---+                                                                *
//*     |View--------------------->(MenuID=1)                            *
//*     +---+                                                            *
//*     |   |About Recorde-------->(MenuID=2)                            *
//*     |   +--------------                                              *
//*     |   |HandSet Clock-------->(MenuID=3)                            *
//*     |   +--------------                                              *
//*     |Operation---------------->(MenuID=4)                            *
//*     +---+                                                            *
//*     |   |Set Position--------->(MenuID=5)                            *
//*     |   +--------------                                              *
//*     |   |Rd Zj To Flash------->(MenuID=6)                            *
//*     |   +--------------                                              *
//*     |   |Rd Zl To Ram--------->(MenuID=7)                            *
//*     |   +--------------                                              *
//*     |   |Del Given Zl--------->(MenuID=8)                            *
//*     |   +--------------                                              *
//*     |   |Del All Zl----------->(MenuID=9)                            *
//*     |   +--------------                                              *
//*     |Test--------------------->(MenuID=10)                           *
//*     +---+                                                            *
//*     |   |Ram Test------------->(MenuID=11)                           *
//*     |   +--------------                                              *
//*     |   |Flash Test----------->(MenuID=12)                           *
//*     |   +--------------                                              *
//*     |System Set--------------->(MenuID=13)                           *
//*     +---+                                                            *
//*         |Debug---------------->(MenuID=14)                           *
//*         +---+                                                        *
//*         |   |PassWord--------->(MenuID=15)                           *
//*         |   +--------------                                          *
//*         |   |See Picture------>(MenuID=16)                           *
//*         |   +--------------                                          *
//*         |Set Hand Clk--------->(MenuID=17)                           *
//*         +--------------                                              *
//************************************************************************
//CurMenuID=本菜单ID
//MaxMenuItem=同级菜单最大项数
//OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了
//EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了
//DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子
//UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子
//CurFunction=本菜单所对应的菜单函数指针

void    (*KeyFuncPtr)();    //按键功能指针


//KeyTabStruct KeyMenuBuf =    //菜单初始值,
//    {MENU_VIEW,    2,    MENU_VIEW_ABOUTRECORDE,
    MENU_ROOT,MENU_OPERATION,MENU_SYSTEMSET,*MenuFunctionDemo3};   
      
unsigned char menuId_G = 0;
void main()
{
    unsigned char i;
    i = 1;
    switch(i)
    {
        case 1:
            if( KeyTab[menuId_G].KeyTab_PressOk != 999 )
            {
                P1_1 = 0;
                menuId_G = KeyTab[menuId_G].KeyTab_PressOk;  //得到当前状态索引号
                KeyFuncPtr = KeyTab[menuId_G].CurrentOperate;   //得到当前应执行函数地址
                ( *KeyFuncPtr )( );
                  
            }         
            break;
        case 2:
            if( KeyTab[menuId_G].KeyTab_PressOk != 999 )
            {
                menuId_G = KeyTab[menuId_G].KeyTab_PressOk; //得到当前状态索引号
                KeyFuncPtr = KeyTab[menuId_G].CurrentOperate;   //得到当前应执行函数地址
                ( *KeyFuncPtr )( );   
                P1_2 = 0;
            }
            break;
        default: {}
      }
      while(1) ;

}

使用特权

评论回复
37
lpcfans| | 2010-7-30 10:01 | 只看该作者
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
//
typedef struct
{
unsigned int KeyTab_MenuIndex;  //当前状态索引号
unsigned int KeyTab_MaxItems;  //本级菜单最大条目数
    unsigned int KeyTab_PressOk;     //按下"回车"键时转向的状态索引号
    unsigned int KeyTab_PressEsc;  //按下"返回"键时转向的状态索引号
    unsigned int KeyTab_PressDown;     //按下"向下"键时转向的状态索引号
    unsigned int KeyTab_PressUp;     //按下"向上"键时转向的状态索引号
void    (*CurrentOperate)();     //当前状态应该执行的功能操作
}KeyTabStruct;
void    (*KeyFuncPtr)();    //按键功能指针
//
#define S_S   0x80//上      =1000,0000=0x80,
#define S_X   0x40//下      =0100,0000=0x40,
#define S_Z   0x20//左      =0010,0000=0x20,
#define S_Y   0x10//右      =0001,0000=0x10,
#define S_ZS  0xa0//左上    =1010,0000=0xa0,
#define S_ZX  0x60//左下    =0110,0000=0x60,
#define S_YS  0x90//右上    =1001,0000=0x90,
#define S_YX  0x50//右下    =0101,0000=0x50,
#define S_SXZY  0xf0//上下左右=1111,0000=0xf0
  
//
#define KEY_OK 0x11
#define KEY_UP 0x12
#define KEY_ESC 0x13
//
#define KEY_LEFT 0x21
#define KEY_DOWN 0x22
#define KEY_RIGHT 0x23
//
#define KEY_1  0x31
#define KEY_2  0x32
#define KEY_3  0x33
//
#define KEY_4  0x41
#define KEY_5  0x42
#define KEY_6  0x43
//
#define KEY_7  0x51
#define KEY_8  0x52
#define KEY_9  0x53
//
#define KEY_XING 0x61
#define KEY_0  0x62
#define KEY_JING 0x63
//
#define KEY_POWER 0x71
#define KEY_NULL 0x00
//
//
#define MAX_KEYTABSTRUCT_NUM      19
#define MENU_FACE         0
#define MENU_ROOT         1
#define  MENU_VIEW        2
#define   MENU_VIEW_ABOUTRECORDE    3
#define   MENU_VIEW_HANDSETCLOCK    4
#define  MENU_OPERATION       5
#define   MENU_OPERATION_SETPOSITION   6
#define   MENU_OPERATION_READZJTOFLASH  7
#define   MENU_OPERATION_RDZJTORAM   8
#define   MENU_OPERATION_DELGIVENZL   9
#define   MENU_OPERATION_DELALLZJ    10
#define  MENU_TEST        11
#define   MENU_TEST_RAMTEST     12
#define   MENU_TEST_FLASHTEST     13
#define  MENU_SYSTEMSET       14
#define   MENU_SYSTEMSET_DEBUG    15
#define    MENU_SYSTEMSET_DEBUG_PASSWORD 16
#define    MENU_SYSTEMSET_DEBUG_SEEPICTURE 17
#define   MENU_SYSTEMSET_SETHANDCLK   18
//
#define Addr_Key    0xc000 //1100,0000,0000,0000
#define Addr_XRamBegin1  0x0000 //0000,0000,0000,0000//共32K
#define Addr_XRamEnd1    0x3fff //0011,1111,1111,1111
#define Addr_XRamBegin2  0x4000 //0100,0000,0000,0000
#define Addr_XRamEnd2    0x7fff //0111,1111,1111,1111
#define Addr_XFlashBegin 0x9000//1000,0000,0000,0000 16K/每自然扇区
#define Addr_XFlashEnd  0xbfff//1011,1111,1111,1111
#define Addr_XFlashSector 0xc001//1100,0000,0000,0001 4个自然扇区(把FLASH的地址线移到这个口内容的低位)
//Flash可用容量=4*16K=64K
//自然扇区的内容字节范围 (0->3)(0000,0000~0000,0011)共4块=64K,硬件上把A18,A17,A16锁住了,不能写)
//能读不能写的扇区号为4-31为(0000,0100~0001,1111)共28块=448K,可以作为菜单位置
//#define Addr_XFlashBegin     0x9000//1000,0000,0000,0000 16K/每自然扇区
//#define Addr_XFlashEnd  0xbfff//1011,1111,1111,1111
//能读能写的FLASH的连续地址如下:
//#define Addr_XFlashBegin 0x0000//共64K
//#define Addr_XFlashEnd   0xffff
//
// 操作FLASH地址时,
//1.算出页地址
//2. 对扇区解锁(读扇区不用解锁):(0x5555)=0xaa,(0x2aaa)=0x55,(0x5555)=0xa0;
//3。把高2位移入 [Addr_XFlashSector]=0的低2位,
//4。把原来的高2位置0,再或上10B
//5. 然后整个扇区读/写256字节
//片外数组0x0000~0x1fff;
unsigned char xdata Rev232Buffer[256]    _at_  0x0000; //->0x00ff
unsigned char xdata Send232Buffer[256]    _at_  0x0100; //->0x1ff
#define Addr_FlashWriteBuffer1        0x0200 //->0x2ff
#define Addr_FlashWriteBuffer2       0x0300 //->0x3ff
#define Addr_FlashReadBuffer1         0x0400 //->0x4ff
#define Addr_FlashReadBuffer2       0x0500 //->0x5ff
#define Addr_ZjWrRdBuffer          0x0800 //->0xfff
unsigned char xdata clock[12]     _at_  0x1000; //->0x100b
//
unsigned char xdata cGraphByte[8]    _at_  0x100e; //->0x1015
unsigned char xdata * xdata cpGraph    _at_  0x1016; //->0x1017
signed   char xdata cMenuHLight[0x10]   _at_ 0x1018;
KeyTabStruct xdata KeyTab[MAX_KEYTABSTRUCT_NUM] _at_ 0x1028;
unsigned char xdata CxTestByte1     _at_ 0x1145;
//片外单变量0x2000~0x2fff;
//通讯专用
unsigned char xdata cUartTemp1   _at_ 0x2000;
unsigned char xdata cUartTemp2   _at_ 0x2001;
unsigned char xdata cUartTemp3   _at_ 0x2002;
unsigned char xdata cUartFunSn   _at_ 0x2003;
unsigned char xdata cUartDataLenght _at_ 0x2004;
unsigned char xdata cUartAddSum  _at_ 0x2005;
unsigned char xdata cUartXorSum  _at_ 0x2006;
unsigned char xdata iUartTemp1  _at_ 0x2007;
unsigned char xdata iUartTemp2  _at_ 0x2008;
unsigned char xdata iUartTemp3  _at_ 0x2009;
//Flash专用
unsigned char xdata cPageAddr  _at_ 0x2010;
unsigned int  xdata iSectorAddr  _at_ 0x2011;
unsigned int  xdata iFlashToRamAddr _at_ 0x2013;
unsigned int  xdata iRamToFlashAddr _at_ 0x2015;
unsigned char xdata iFlashAddrH  _at_ 0x2017;
unsigned char xdata iFlashAddrM  _at_ 0x2018;
unsigned char xdata iFlashAddrL  _at_ 0x2019;
unsigned char xdata iFlashRdWrNum _at_ 0x201a;
//菜单专用
unsigned char xdata cMenuTemp1  _at_ 0x2020;
unsigned char xdata cMenuTemp2  _at_ 0x2021;
unsigned char xdata cMenuTemp3  _at_ 0x2022;
//
unsigned int  xdata iMenuID   _at_ 0x2023;
unsigned int  xdata iMenuNextID  _at_ 0x2025;
//
//画线专用
unsigned char xdata cLineTemp1  _at_ 0x2030;
unsigned char xdata cLineTemp2  _at_ 0x2031;
unsigned char xdata cLineTemp3  _at_ 0x2032;
unsigned char xdata cLineTemp4  _at_ 0x2033;
unsigned char xdata cLineTemp5  _at_ 0x2034;
unsigned char xdata cLineTemp6  _at_ 0x2035;
unsigned char xdata cLineTemp7  _at_ 0x2036;
unsigned char xdata cLineTemp8  _at_ 0x2037;
unsigned char xdata cLineTemp9  _at_ 0x2038;
unsigned char xdata cLineTemp10  _at_ 0x2039;
unsigned char xdata cLineTemp11  _at_ 0x203a;
unsigned char xdata cLineTemp12  _at_ 0x203b;
unsigned char xdata cLineTemp13  _at_ 0x203c;
//DispTextLine
unsigned char xdata cTextLineTemp1 _at_ 0x203d;
unsigned char xdata cTextLineTemp2 _at_ 0x203e;
unsigned char xdata cTextLineTemp3 _at_ 0x203f;
//图形字符专用
unsigned char xdata cGraphTemp1  _at_ 0x2040;
unsigned char xdata cGraphTemp2  _at_ 0x2041;
unsigned char xdata cGraphTemp3  _at_ 0x2042;
unsigned char xdata cGraphTemp4  _at_ 0x2043;
//主程序用
unsigned char xdata NowKey   _at_ 0x2044;
unsigned char xdata RxPos   _at_ 0x2045;
unsigned char xdata RxStep   _at_ 0x2046;
unsigned char xdata RxPrev   _at_ 0x2047;
unsigned char xdata RxNow   _at_ 0x2048;
unsigned char xdata RxDataLenght _at_ 0x2049;
unsigned char xdata TxPos   _at_ 0x204a;
unsigned char xdata TxNum   _at_ 0x204b;
//中断0用
unsigned char xdata cTemp_ex0  _at_ 0x204c;
//通讯中断用
unsigned int  xdata i_uart   _at_ 0x204d;
//写Flash用
unsigned int  xdata i_FlashWr  _at_ 0x204f;
unsigned char xdata c1_FlashWr  _at_ 0x2051;
// 读Flash用
unsigned int  xdata i_FlashRd  _at_ 0x2052;
unsigned char xdata c1_FlashRd  _at_ 0x2054;
//Make05Answe专用
unsigned int  xdata i_Make05Answer   _at_ 0x2055;
unsigned char xdata cAdd_Make05Answer _at_ 0x2057;
unsigned char xdata cXor_Make05Answer _at_ 0x2058;
//读时间用
unsigned char xdata i_RdTime   _at_ 0x2059;
// 显示文本行用
    unsigned char xdata col_DispTextLine _at_ 0x205a;
unsigned char code * xdata p_DispTextLine _at_ 0x205b;
//显示开机画面
unsigned char xdata i_FaceBmp   _at_ 0x205d;
unsigned char xdata j_FaceBmp   _at_ 0x205e;
unsigned char xdata k_FaceBmp   _at_ 0x205f;
unsigned char xdata c1_FaceBmp   _at_ 0x2060;
//DisponeTextChar
unsigned char xdata i_DisponeTextChar _at_ 0x2061;
unsigned char xdata j_DisponeTextChar _at_ 0x2062;
unsigned char xdata k_DisponeTextChar _at_ 0x2063;
    unsigned char xdata cTemp_DisponeTextChar _at_ 0x2064;
//键处理程序专用
    unsigned char xdata cKeyTemp1 _at_ 0x2065;
//定时器0专用
unsigned int  xdata iT0_1S   _at_ 0x2066;
unsigned char xdata cClock_Year  _at_ 0x2068;
unsigned char xdata cClock_Month _at_ 0x2069;
unsigned char xdata cClock_Day  _at_ 0x206a;
unsigned char xdata cClock_Hour  _at_ 0x206b;
unsigned char xdata cClock_Minute _at_ 0x206c;
unsigned char xdata cClock_Second _at_ 0x206d;

//cx


//Timer
#define TH0data 0xb8//20ms=0xb800,1ms=0xfc66
#define TL0data 0x00//
//
sbit LCD_CS=P1^0;
sbit LCD_RESET=P1^1;
sbit LCD_A0=P1^5;
sbit LCD_WR=P1^6;
sbit KEYINT=P3^2;
sbit I2C_SCK=P3^4;
sbit I2C_SDA=P3^5;
//
sbit KEYROW1=P1^5;
sbit KEYROW2=P1^6;
sbit KEYROW3=P1^7;
//
unsigned char bdata BitByte0;
sbit bOldOnline=BitByte0^7;
sbit b_ReceiveOver=BitByte0^6;
sbit b_KeyInt=BitByte0^5;
sbit b_Arrive1S=BitByte0^4;
unsigned char bdata BitByte1;
unsigned char bdata BitByte2;
unsigned char bdata BitValue;
sbit bOnline=BitValue^7;
sbit bPowerOff=BitValue^6;
unsigned char bdata BitValue1;
sbit bBit7=BitValue1^7;
sbit bBit6=BitValue1^6;
sbit bBit5=BitValue1^5;
sbit bBit4=BitValue1^4;
sbit bBit3=BitValue1^3;
sbit bBit2=BitValue1^2;
sbit bBit1=BitValue1^1;
sbit bBit0=BitValue1^0;

//
//
void lcd_write_d(unsigned char c1);
void lcd_write_c(unsigned char c1);
void LcdInit();
void MyInit();
//
void DispOneBoxTextChar(unsigned char Row,unsigned char Col,unsigned char c1,unsigned char DispAttrib);
void DispTwoBoxHexChar(unsigned char Row,unsigned char Col,unsigned char c1,unsigned char DispAttrib);
void DispGraphChar(unsigned char Row,unsigned char Col,unsigned char xdata *cArray,unsigned char DispAttrib);
void DispTextLine(unsigned char Row,unsigned char code *MenuText,unsigned char DispAttrib);
//
void ReadyForKey();
void DelayMs(unsigned int iMs);
void UartProcess();
void IAmZj();
void IAmOk();
void IAmUnKnow();
void FlashSectorWr(unsigned int SourceXRamAddr,unsigned int TargetFlashAddr);
void FlashSectorRd(unsigned int SourceFlashAddr,unsigned int TargetXRamAddr);
void Make05Answer();
void Make06Answer();
void I2Cstart(void);
void I2Csend(unsigned char);
unsigned char I2Csuback(void);
void I2Cmastack(void);
unsigned char I2Cread(void);
void I2Cnoack(void);
void I2Cstop(void);
void Make07Answer();
unsigned char set_time();
void Make08Answer();
void MakeBox(unsigned char row1,unsigned char col1,unsigned char row2,unsigned char col2);
void MenuFunctionNull();
void MenuFunctionDemo1();
void MenuFunctionDemo2();
void MenuFunctionDemo3();
void MenuFunctionDemo4();
void MenuFunctionDemo5();
void MenuFunctionDemo6();
void MenuFunctionDemo7();
void MenuFunctionDemo8();
void MenuFunctionDemo9();
void MenuFunctionDemo10();
void MenuFunctionDemo11();
void MenuFunctionDemo12();
void MenuFunctionDemo13();
void MenuFunctionDemo14();
void MenuFunctionDemo15();
void MenuFunctionDemo16();
void MenuFunctionDemo17();
void MenuFunctionDemo18();
void MenuFunctionDemo19();
//
void DispFaceBmp();
void DispMenu_Root();
void DispMenu_View();
void DispMenu_Operation();
void DispMenu_Test();
void DispMenu_SystemSet();
void DispMenu_Debug();
//
void JudgeHLight();
//
unsigned char ReadTime();
void ShowDesktopTime();
//
unsigned char code Echar[96][8];
unsigned char code FaceBmp[112][8];
//
unsigned char code *Menu_Root[4]=
{
" View         ",
" Operation    ",
" Test         ",
" System Set   "
};
unsigned int code Menu_RootID[4]=
{
MENU_VIEW,
MENU_OPERATION,
MENU_TEST,
MENU_SYSTEMSET
};
//
unsigned char code *Menu_View[2]=
{
" About ZL     ",
" HandSet CLK  "
};
unsigned int code Menu_ViewID[2]=
{
MENU_VIEW_ABOUTRECORDE,
MENU_VIEW_HANDSETCLOCK
};
//
unsigned char code *Menu_Operation[5]=
{
" Set Position ",
" Rd Zj To ROM ",
" Rd ZL To Ram ",
" Del Given ZL ",
" Del All ZL   "
};
unsigned int code Menu_OperationID[5]=
{
MENU_OPERATION_SETPOSITION,
MENU_OPERATION_READZJTOFLASH,
MENU_OPERATION_RDZJTORAM,
MENU_OPERATION_DELGIVENZL,
MENU_OPERATION_DELALLZJ
};
//
unsigned char code *Menu_Test[2]=
{
" Ram Test     ",
" Flash Test   "
};
unsigned int code Menu_TestID[2]=
{
MENU_TEST_RAMTEST,
MENU_TEST_FLASHTEST
};
//
unsigned char code *Menu_SystemSet[2]=
{
" Debug        ",
" Set Hand Clk "
};
unsigned int code Menu_SystemSetID[2]=
{
MENU_SYSTEMSET_DEBUG,
MENU_SYSTEMSET_SETHANDCLK
};
//
unsigned char code *Menu_Debug[2]=
{
" PassWord     ",
" See Picture  "
};
unsigned int code Menu_DebugID[2]=
{
MENU_SYSTEMSET_DEBUG_PASSWORD,
MENU_SYSTEMSET_DEBUG_SEEPICTURE
};
//
unsigned char code MenuNULL[]={"              "};
//

使用特权

评论回复
38
lpcfans| | 2010-7-30 10:03 | 只看该作者
菜单

一个占用内存极少的菜单系统的实现.pdf

1006.82 KB

使用特权

评论回复
39
lpcfans| | 2010-7-30 10:03 | 只看该作者
建立一个树状的菜单结构,用链表实现

链表中包含:

1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;

2、进入该菜单时需要执行的初始化函数指针

3、退出该菜单时需要执行的结束函数指针

4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确

认、退出。

采用这种办法,可以方便的添加或删减菜单。并且只需要在其头文件中修改初始变量就可

以实现,完全无须修改C文件中的任何函数。

具体结构定义

我的定义,做个参考:

#define  MENU_HLP_EN                      //菜单帮助信息使能

typedef struct

{

    void (*pMenuTaskInit)(void);          //指向菜单任务初始化函数的指针

    void (*pMenuTaskEnd)(void);           //指向菜单任务结束函数的指针

}MENU_TASK_TYP;

typedef struct MenuTyp

{

    INT8U              *MenuName;         //菜单名称字符串

    WORK_MOD            WorkMod;          //工作状态编号

    MENU_TASK_TYP      *pMenuTask;        //指向菜单任务的指针

    void (**pTaskKeyDeal)(void);          //指向菜单任务按键处理函数数组的指针

  #ifdef MENU_HLP_EN

    INT8U              *MenuHlp;          //菜单帮助字符串

  #endif

    struct MenuTyp     *pParent;          //指向上层菜单的指针

    struct MenuTyp     *pChild;           //指向子菜单的指针

    struct MenuTyp     *pRight;           //指向右菜单的指针

    struct MenuTyp     *pLeft;            //指向左菜单的指针

}MENU_TYP;

我根据网上的资料做的一个菜单:

/****************菜单数据结构**********************/

struct KeyTabStruct{

    uint8  MenuIndex;        //当前状态索引号

    uint8  MaxItems;        //本级菜单最大条目数

    uint8  ShowLevel;        //菜单显示内容

        uint8  PressOk;        //按下"回车"键时转向的状态索引号

        uint8  PressEsc;        //按下"返回"键时转向的状态索引号

        uint8  PressDown;        //按下"向下"键时转向的状态索引号

        uint8  PressUp;        //按下"向上"键时转向的状态索引号

    void   (*CurrentOperate)();        //当前状态应该执行的功能操作

};

uint8   MenuID;             //菜单ID号

uint8   MenuNextID;         //下级菜单ID号

//CurMenuID=本菜单ID

//MaxMenuItem=同级菜单最大项数

//OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了

//EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了

//DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子

//UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子

//CurFunction=本菜单所对应的菜单函数指针

const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={

       //CurMenuID,            axMenuItem,    MenuShowLevel,    OkMenuID,      EscMenuID,        DownMenuID,        UpMenuID,    CurFunction

     {MENU_EDIT,            0,             0,  MENU_DATA_VIEW,         MENU_NO,              MENU_NO,     MENU_NO,         *MenuEdit},

     {MENU_DATA_VIEW,        3,             1,          MENU_DATA_VIEW_FIRE,    MENU_EDIT,           MENU_SYS_EDIT,    MENU_PRINT_DATA,*MenuEdit},

    {MENU_DATA_VIEW_FIRE,   5,       MENU_NO,        MENU_NO,          MENU_DATA_VIEW,     MENU_DATA_VIEW_TROUBLE, MENU_STEP_FOLLOW, *MenuDataViewIn},

     {MENU_DATA_VIEW_TROUBLE, 5,        MENU_NO,           MENU_NO,              MENU_DATA_VIEW,     MENU_DATA_VIEW_REPEAT,   MENU_DATA_VIEW_FIRE,  *MenuDataViewIn},

    {MENU_DATA_VIEW_REPEAT,         5,            MENU_NO,         

MENU_NO,              MENU_DATA_VIEW,         MENU_FACE_CHECK,      

MENU_DATA_VIEW_TROUBLE,  *MenuDataViewIn},

    {MENU_FACE_CHECK,        5,          MENU_NO,         

MENU_NO,          MENU_DATA_VIEW,          MENU_STEP_FOLLOW,        

MENU_DATA_VIEW_REPEAT,     *MenuFaceCheck},

    {MENU_STEP_FOLLOW,        5,          MENU_NO,         

MENU_NO,          MENU_DATA_VIEW,        MENU_DATA_VIEW_FIRE,        MENU_FACE_CHECK,

    *MenuStepFollow},

    {MENU_SYS_EDIT,            3,            

2,            MENU_SUM_SET,        MENU_EDIT,           

MENU_PRINT_DATA,        MENU_DATA_VIEW,        *MenuEdit},

    {MENU_SUM_SET,                6,          MENU_NO,         

MENU_NO,          MENU_SYS_EDIT,        MENU_EDIT_INSULATE,            

MENU_TIME_SET,        *MenuSumSet},

    {MENU_EDIT_INSULATE,        6,          MENU_NO,         

MENU_NO,          MENU_SYS_EDIT,            MENU_EDIT_HZ,             MENU_SUM_SET,

        *MenuEditInsulate},

    {MENU_EDIT_HZ,                6,          MENU_NO,         

MENU_NO,          MENU_SYS_EDIT,          MENU_LD_CONTROL,         

MENU_EDIT_INSULATE,    *MenuEditHZ},

    {MENU_LD_CONTROL,        6,         

MENU_NO,               MENU_NO,          MENU_SYS_EDIT,          MENU_LD_DELAY,

               MENU_EDIT_HZ,    *MenuLDControl},

    {MENU_LD_DELAY,            6,         

MENU_NO,            MENU_NO,          MENU_SYS_EDIT,        MENU_TIME_SET,      

MENU_LD_CONTROL,        *MenuLDDelay},

    {MENU_TIME_SET,                6,          MENU_NO,           

MENU_NO,          MENU_SYS_EDIT,        MENU_SUM_SET,        MENU_LD_DELAY,

            *MenuTimeSet},

    {MENU_PRINT_DATA,            3,             3,      

MENU_PRINT_DATA_FIRE,        MENU_EDIT,          MENU_DATA_VIEW,      

MENU_SYS_EDIT,        *MenuEdit},

    {MENU_PRINT_DATA_FIRE,        4,         

MENU_NO,            MENU_NO,        MENU_PRINT_DATA,     

MENU_PRINT_DATA_TROUBLE,  MENU_PRINT_SET,        *MenuPrintDataIn},

        {MENU_PRINT_DATA_TROUBLE,       4,            MENU_NO,           

MENU_NO,            MENU_PRINT_DATA,      MENU_PRINTER_CHECK,      

MENU_PRINT_DATA_FIRE,     *MenuPrintDataIn},

        {MENU_PRINTER_CHECK,            4,            MENU_NO,           

MENU_NO,            MENU_PRINT_DATA,      MENU_PRINT_SET,         

MENU_PRINT_DATA_TROUBLE,  *MenuPrintDataIn},

        {MENU_PRINT_SET,                4,            MENU_NO,           

MENU_NO,            MENU_PRINT_DATA,      MENU_PRINT_DATA_FIRE,   

MENU_PRINTER_CHECK,       *MenuPrintSet},

};

/**************************************编程菜单显示数据

******************************/

const struct MenuDispData   MenuEditShow[][MENU_MAX] = {

       {{MENU_NO               , 0, 0, "选择:         消音→退出"},    //主菜单

    {MENU_DATA_VIEW        , 1, 6, "⒈数据查看"},

    {MENU_SYS_EDIT         , 2, 6, "⒉系统编程"},

    {MENU_PRINT_DATA       , 3, 6, "⒊数据打印"}},

       {{MENU_NO               , 0, 0, "数据查看:     消音→退出"},    //数据查



        {MENU_DATA_VIEW_FIRE   , 1, 4, "⒈火警"},

        {MENU_DATA_VIEW_TROUBLE, 2, 4, "⒉故障"},

        {MENU_DATA_VIEW_REPEAT , 3, 4, "⒊重码"},

        {MENU_FACE_CHECK       , 1,12, "⒋面板检测"},

        {MENU_STEP_FOLLOW      , 2,12, "⒌单步跟踪"}},

       {{MENU_NO               , 0, 0, "系统编程:     消音→退出"},   //系统编程

        {MENU_SUM_SET          , 1, 0, "⒈容量设置"},

        {MENU_EDIT_INSULATE    , 2, 0, "⒉隔离点"},

        {MENU_EDIT_HZ          , 3, 0, "⒊汉字描述"},

        {MENU_LD_CONTROL       , 1,12, "⒋联动控制"},

        {MENU_LD_DELAY         , 2,12, "⒌模块延时"},

        {MENU_TIME_SET         , 3,12, "⒍时钟调整"}},

       {{MENU_NO               , 0, 0, "数据打印:     消音→退出"},   //数据打印

        {MENU_PRINT_DATA_FIRE  , 1, 0, "⒈火警数据"},

        {MENU_PRINT_DATA_TROUBLE,2, 0, "⒉故障数据"},

        {MENU_PRINTER_CHECK    , 3, 0, "⒊打印机自检"},

        {MENU_PRINT_SET        , 1,12, "⒋打印设置"}},      

};

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
machunshui + 1
40
lpcfans| | 2010-7-30 10:04 | 只看该作者
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则