嵌入式系统课程设计报告


1. 题目

基于ARM的嵌入式电子点菜系统

2. 系统简介

在基于ARM的嵌入式环境下,本电子点菜系统可实现的功能有:支持触摸屏图形选菜以及记录菜单等功能。界面美观,功能合理,基本达到了实验要求的内容。

3. 系统设计

3.1设计背景

随着我国的餐饮企业的蓬勃发展,餐饮行业成为国内最早的一个完  全市场化的行业,个体民营占绝对优势和主导的行业,市场竞争非常充分,在广大的餐饮企业的经营者的不懈努力下,餐饮行业取得了非常突出的发展和进步。

3.2设计意义

传统的点菜方式由人工来传递菜单,不仅浪费时间、效率低下;一旦生意火热,单据多,信息量大时,分单、传菜等环节很容易出现错误,从而直接影响服务质量。导致企业造成不必要的损失。

而本文介绍的电子点菜系统,大大降低人力资源成本,加快各环节之间的数据流通,对企业软环境的档次有较大提高。在以特色服务吸引客户的同时,有效提高餐饮机构的服务质量和工作效率,为餐饮业创造更多利润。

3.3总体设计

图1 实验程序流程图

3.4代码编译及注释

本实验要求实现部分:

(1)、MainTask中按键消息获取,处理

(2)、按键处理函数OnKey()函数

(3)、创建串口处理任务Serial_Receive_Task(void *Id)

(4)、 实现串口消息换取,处理(在LCD或数码管上显示)函数OnReceive(char nRdata)

初始化操作:

void initOSGUI()//初始化操作系统的图形界面

{

      initOSMessage();

      initOSList();

      initOSDC();

      initOSCtrl();

      initOSFile();

}

/////////////////////////////////////////////////////

//                  Main function.                //

////////////////////////////////////////////////////

int main(void)

{

      ARMTargetInit(); //开发板初始化

      OSInit(); //操作系统初始化     

      uHALr_ResetMMU();//复位MMU

      LCD_Init(); //初始化LCD模块

      LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据

      LCD_printf("320 x 240  Text Mode\n");

      initOSGUI();//初始化图形界面

      LoadFont();//调Unicode字库

      LoadConfigSys();//使用config.sys文件配置系统设置

      LCD_printf("Create task on uCOS-II...\n");

      OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 创建系统任务

3.4.1 触摸功能设计实现

设计思想是让LCD 显示屏每页显示六道菜,触摸实现点菜确认,所以在触摸屏上安排了九个区间的触摸功能用以下代码完成触摸区域。

   recta.left=0;

      recta.top=0;

      recta.right=320;

      recta.bottom=30;

//定义触摸区域大小

   pTouch_Position=&Touch_Position;

      prect=▭

      precta=&recta;   

          prectb=&rectb;   

      prectc=&rectc;   

      prectd=&rectd;

      precte=&recte;   

      prectf=&rectf;    

如上,定义上下左右四个区间的大小来完成触摸区域,六道菜六个触摸区域

区域大小根据图片大小而定。

触摸区域完成后,就是实现触摸点菜功能了,在这里,我们用到了消息循环,即

InitInterface();

      Uart_Printf("这是01号桌");

在进入点菜界面之前有一个欢迎界面,需要通过按键进入点菜界面,这里使用for循环用来判断。

for(;;){

      pMsg=WaitMessage(0); //等待消息

      switch(pMsg->Message){

      case OSM_KEY:

这里的case OSM_KEY表示按键事件,后面用了一个judge函数来进行判断

if(judge==0)

      {num=0;

 state=0;

       statea=0;

       stateb=0;

       statec=0;

       stated=0;

       statee=0;

       statef=0;

                          

if(onKey(pMsg->WParam,pMsg->LParam))

{

       judge=1;

       pdc = CreateDC();

       ShowBmp(pdc,bmpnamelogo1, 70, 1);

       ShowBmp(pdc,bmpnamelogo2, 200, 1);

       ShowBmp(pdc,bmpnamelogo3, 70, 80);

       ShowBmp(pdc,bmpnamelogo4, 200, 80);

       ShowBmp(pdc,bmpnamelogo5, 70, 160);

       ShowBmp(pdc,bmpnamelogo6, 200, 160);

       OSTimeDly(100);

judge==1表示发生了这个事件,进入点菜界面。

进入点菜界面后,可以看见每排2道菜,一共六道菜,这是用到了消息循环,同时用用了一次if judge来进行点菜判断,同时定义IsInRect2(prect1,pTouch_Position)函数来判断prect1指向的区域是否有触摸动作,有则同样跳转到菜单画面,case OSM_TOUCH_SCREEN:表示触摸屏动作后系统需响应的进程。

if(judge==1)

{

if(IsInRect2(precta, pTouch_Position))

{

              if(statea==0)

{

            ShowBmp(pdc,dj_Pict, 20,5);

statea=1;

Uart_Printf("01号桌点了小鸡炖蘑菇\t");

sysnumber=sysnumber+price[0];

Int2Unicode(sysnumber,str);

SetTextCtrlText(pTextCtrl, str,TRUE);

num=sysnumber;

}

Else

{

FillRect( pdc, 20,5,40,25, GRAPH_MODE_NORMAL, COLOR_WHITE);

DrawRectFrame(pdc, 20, 5, 40, 25);

statea=0;

Uart_Printf("01号桌取消您点了小鸡炖蘑菇\t");

sysnumber=sysnumber-price[0];

Int2Unicode(sysnumber,str);

SetTextCtrlText(pTextCtrl, str,TRUE);

num=sysnumber;

}

}

else if(IsInRect2(prectb, pTouch_Position))

               ·

               ·

               ·

DeleteMessage(pMsg);//删除消息,释放资源

OSTimeDly(200);

}

   DestoryDC(pdc);

}

用消息循环来实现点菜和取消点菜的过程,点一下图片为点菜,再点一下就取消了点菜。

3.4.2菜单记录的设计实现

在最开始初始化完成之后,创建了文本框在点菜界面右下角用来记录菜单,具体代码如下:

pTextCtrl=CreateTextCtrl(101, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);

SetTextCtrlText(pTextCtrl, str,TRUE);//设置文本框内容

在定义图片之前设置了每道菜的单价:

int price[6]={50,50,80,280,180,80};

之后每点一道菜,系统自动判断类别并进行菜单记录,增删菜价。

SetTextCtrlText(pTextCtrl, str,TRUE);

4. 系统实现

(1)在ADS1.2中,新建一个项目menu,把操作系统所需要的头文件(*.h)和库文件(*.alf)加入工程中。

(2)在创建的Main.c文件中,在Main_Task任务中添加代码,初始化一些变量包括:创建绘图用的DC(createDC)并在绘图完成后删除它(DestoryDC);启动消息循环,等待键盘扫描任务和触摸屏任务发来的消息,并调用相应的函数进行处理。

(3)创建界面函数e.c并添加代码,主要定义InitInterface()函数,进行界面初始化并显示图像,包括创建列表框控件InitCtrl()和显示初始图片。InitPicture()。

(4)编译通过后,下载到试验台中运行。

(5)附(系统源代码Main.c):

#include"..\ucos-ii\includes.h"               /* uC/OS interface */

#include "..\ucos-ii\add\osaddition.h"

#include "..\inc\drv.h"

#include "..\inc\drv\zlg7289.h"

#include <string.h>

#include "..\inc\template.h"

#include"..\inc\experiment.h"

#include "..\inc\OSFile.h"

#include "..\inc\drv\Ustring.h"

#include <math.h>

#include "..\UCOS-II\uhal\uart.h"

//#include "..\inc\exio.h"

extern int Zlg7289SIOBand;

extern int Zlg7289SIOCtrl;

int num=0;

#pragma import(__use_no_semihosting_swi)  // ensure no functions that use semihosting

///******************任务定义***************///

OS_STK Main_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈

void Main_Task(void *Id);             //Main_Test_Task

#define Main_Task_Prio     13

OS_STK Dynamic_Display_Task_Stack[STACKSIZE*8]={0, };   

void Dynamic_Display_Task(void *Id);             

#define Dynamic_Display_Task_Prio     52

/**************已经定义的OS任务*************

tcp监控任务          11

以太网物理层监控任务      8

触摸屏任务            9

键盘任务         10

lcd刷新任务          59

系统任务         1

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

///*****************事件定义*****************///

OS_EVENT *Nand_Rw_Sem;                   //Nand_Flash读写控制权旗语

//and you can use it as folloeing:

//    Nand_Rw_Sem=OSSemCreate(1);        //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//

//    OSSemPend(Nand_Rw_Sem,0,&err);

//    OSSemPost(Nand_Rw_Sem);

OS_EVENT *Uart_Rw_Sem;                   //Uart读写控制权旗语

//and you can use it as folloeing:

//    Uart_Rw_Sem=OSSemCreate(1);        //创建Uart读写控制权旗语,初值为1满足互斥条件//

//    OSSemPend(Uart_Rw_Sem,0,&err);

//    OSSemPost(Uart_Rw_Sem);

//////////////////////////////////////////////////////////

void initOSGUI()   //初始化操作系统的图形界面

{

    initOSMessage();

    initOSList();

    initOSDC();

    initOSCtrl();

    initOSFile();

}

/////////////////////////////////////////////////////

//                  Main function.                //

////////////////////////////////////////////////////

int main(void)

{

    ARMTargetInit(); //开发板初始化

    OSInit(); //操作系统初始化     

    uHALr_ResetMMU();//复位MMU

    LCD_Init();             //初始化LCD模块

    LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据

    LCD_printf("320 x 240  Text Mode\n");

    initOSGUI();//初始化图形界面

    LoadFont();//调Unicode字库

    LoadConfigSys();//使用config.sys文件配置系统设置

    LCD_printf("Create task on uCOS-II...\n");

    OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 创建系统任务

    ////////////////////////////////////////////////////

    // 创建串口任务

   

    //OSTaskCreate(Dynamic_Display_Task,(void *)0,(OS_STK *)&Dynamic_Display_Task_Stack[STACKSIZE*8-1],Dynamic_Display_Task_Prio);

   

    ////////////////////////////////////////////////////

                                       

    OSAddTask_Init();//创建系统附加任务

    LCD_printf("Starting uCOS-II...\n");

    LCD_printf("Entering graph mode...\n");

    LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式

    InitRtc();//初始化系统时钟

    Nand_Rw_Sem=OSSemCreate(1);   //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//

    OSStart();//操作系统任务调度开始

    //不会执行到这里

    return 0;

}

/*char *KeyTable[]={"NumLock","/","*","-","7","8","9","+","4","5","6","1","2","3","Enter","0","."};

void onKey(int nkey, int fnkey)

{

    PDC pdc;//创建绘图设备上下文结构

    U16 ch[10];

    ClearScreen();//清屏

   

    pdc=CreateDC();//创建绘图设备上下文

    Uart_Printf("key=%s\n", KeyTable[nkey]);

    strChar2Unicode(ch, KeyTable[nkey]);

   

    //将数据转化成Unicode 转化函数参考\\INC\\DRV\\ustring.h

    SetPenColor(pdc,RGB( 255,0,0));

    LCD_printf(KeyTable[nkey]);

           LCD_printf("\n");

    //TextOut(pdc,100,100,ch ,TRUE, FONTSIZE_MIDDLE);

    //文本模式下显示文字

   

    DestoryDC(pdc);//删除绘图设备上下文   

}

*/

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 void Main_Task(void *Id)             //Main_Test_Task

{

    POSMSG pMsg=0;

    int judge=0;

    int sysnumber=0;

    int i=0;

    int j=0;

    U16 str[20];

        PDC pdc;

    int price[6]={50,50,80,280,180,80};

    char dj_Pict[12]={'1','2','8','_','3','7',' ',' ','B','M','P',0};

    char dj_Pict1[12]={'1','2','8','_','3','5',' ',' ','B','M','P',0};

    char dj_Pict2[12]={'1','2','8','_','3','6',' ',' ','B','M','P',0};

    char bmpnamelogo1[12]={'0','0','0','_','0','1',' ',' ','B','M','P',0};

    char bmpnamelogo2[12]={'0','0','0','_','0','2',' ',' ','B','M','P',0};

    char bmpnamelogo3[12]={'0','0','0','_','0','3',' ',' ','B','M','P',0};

    char bmpnamelogo4[12]={'0','0','0','_','0','4',' ',' ','B','M','P',0};

    char bmpnamelogo5[12]={'0','0','0','_','0','5',' ',' ','B','M','P',0};

    char bmpnamelogo6[12]={'0','0','0','_','0','6',' ',' ','B','M','P',0};

   

    int state,statea,stateb,statec,stated,statee,statef;

    structPOINT Touch_Position,*pTouch_Position;

    structRECT rect,recta,rectb,rectc,rectd,recte,rectf;

    structRECT *prect,*precta,*prectb,*prectc,*prectd,*precte,*prectf;

    PTextCtrl pTextCtrl;

    state=0;

    statea=0;

    stateb=0;

    statec=0;

    stated=0;

    statee=0;

    statef=0;

   

    recta.left=0;

    recta.top=0;

    recta.right=320;

    recta.bottom=30;

    rectb.left=0;

    rectb.top=32;

    rectb.right=320;

    rectb.bottom=62;

    rectc.left=0;

    rectc.top=64;

    rectc.right=320;

    rectc.bottom=94;

    rectd.left=0;

    rectd.top=96;

    rectd.right=320;

    rectd.bottom=126;

    recte.left=0;

    recte.top=128;

    recte.right=320;

    recte.bottom=158;

    rectf.left=0;

    rectf.top=160;

    rectf.right=320;

    rectf.bottom=190;

    rect.left=80;

    rect.top=200;

    rect.right=300;

    rect.bottom=240;

    pTouch_Position=&Touch_Position;

    prect=&rect;

    precta=&recta;   

 prectb=&rectb;     

    prectc=&rectc;   

    prectd=&rectd;

    precte=&recte;   

    prectf=&rectf;    

    ClearScreen();

    InitInterface();

    Uart_Printf("这是01号桌");

    //消息循环

    for(;;){

           pMsg=WaitMessage(0); //等待消息

           switch(pMsg->Message){

           case OSM_KEY:

           //Uart_Printf("%d",pMsg->WParam);

                  if(judge==0)

                         {num=0;

                       state=0;

                 statea=0;

                 stateb=0;

                 statec=0;

                 stated=0;

                 statee=0;

                 statef=0;

                         if(onKey(pMsg->WParam,pMsg->LParam))

                         {

                          judge=1;

                          pdc = CreateDC();

                 ShowBmp(pdc,bmpnamelogo1, 70, 1);

                 ShowBmp(pdc,bmpnamelogo2, 200, 1);

                 ShowBmp(pdc,bmpnamelogo3, 70, 80);

                 ShowBmp(pdc,bmpnamelogo4, 200, 80);

                 ShowBmp(pdc,bmpnamelogo5, 70, 160);

                 ShowBmp(pdc,bmpnamelogo6, 200, 160);

                 OSTimeDly(100);

                       SetRect(&rect, 180,205,260,225);      //设置PID参数轴1P的文本框

                 pTextCtrl=CreateTextCtrl(101, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);//创建文本框

                 Int2Unicode(sysnumber,str);//将整形数据转换为Unicode数据

                 //SetWndCtrlFocus(NULL, ID_MainTextCtrl);//将焦点移到文本框中

                 SetTextCtrlText(pTextCtrl, str,TRUE);//设置文本框内容

                 //EXIO_8255A_CTRL=0x80;

                          //EXIO_8255A_PORTC=0xff;

                 OSTaskCreate(Dynamic_Display_Task,  (void *)0,  (OS_STK *)&Dynamic_Display_Task_Stack[STACKSIZE*8-1],  Dynamic_Display_Task_Prio);// 1

                }}

                   else if(judge==1)

                  {//Uart_Printf("%d",pMsg->WParam);

                         switch(pMsg->WParam){

                                case 15: if(statea==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,5);

                                              statea=1;

                                              Uart_Printf("01号桌点了小鸡炖蘑菇\t");

                                              sysnumber=sysnumber+price[0];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

          

                                       }

                                else

                                       {

                                       FillRect( pdc, 20,5,40,25, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 5, 40, 25);

                                       statea=0;

                                       Uart_Printf("01号桌取消您点了小鸡炖蘑菇\t");

                                       sysnumber=sysnumber-price[0];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                break;

                                case 11: if(stateb==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,37);

                                              stateb=1;

                                              Uart_Printf("01号桌点了酸菜炖粉条\t");

                                              sysnumber=sysnumber+price[1];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,37,40,57, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 37, 40, 57);

                                       stateb=0;

                                       Uart_Printf("01号桌取消了酸菜炖粉条\t");

                                       sysnumber=sysnumber-price[1];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                       }

                                break;

                                case 12: if(statec==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,69);

                                              statec=1;

                                              Uart_Printf("01号桌点了红烧狮子头\t");

                                              sysnumber=sysnumber+price[2];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,69,40,89, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 69, 40, 89);

                                       statec=0;

                                       Uart_Printf("01号桌取消了红烧狮子头\t");

                                       sysnumber=sysnumber-price[2];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                break;

                                case 13:if(stated==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,101);

                                              stated=1;

                                              Uart_Printf("01号桌点了烤乳猪\t");

                                              sysnumber=sysnumber+price[3];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,101,40,121, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 101, 40, 121);

                                       stated=0;

                                       Uart_Printf("01号桌取消了烤乳猪\t");

                                       sysnumber=sysnumber-price[3];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                       }

                                break;

                                case 8: if(statee==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,133);

                                              statee=1;

                                              Uart_Printf("01号桌点了太子蟹\t");

                                              sysnumber=sysnumber+price[4];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,133,40,153, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20,133, 40, 153);

                                       statee=0;

                                       Uart_Printf("01号桌取消了太子蟹\t");

                                       sysnumber=sysnumber-price[4];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                break;

                                case 9: if(statef==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,165);

                                              statef=1;

                                              Uart_Printf("01号桌点了文昌鸡\t");

                                              sysnumber=sysnumber+price[5];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                                     num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,165,40,185, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20,165, 40,185);

                                       statef=0;

                                       Uart_Printf("01号桌取消了文昌鸡\t");

                                       sysnumber=sysnumber-price[5];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                       }

                                break;

                                case 14:ClearScreen();

                             ShowBmp(pdc,dj_Pict1, 60,40);

                             judge=2;

                OSTimeDly(1500);

                                ClearScreen();

                                ShowBmp(pdc,dj_Pict2, 0,0);

                                judge=0;

                                sysnumber=0;

                                break;

                                default:

                                       break;

                                }

                  }

                  break;

           case OSM_LISTCTRL2_SELCHANGE:

                  onListCtrl2SelChange(pMsg->WParam,pMsg->LParam);

                  break;

           case OSM_MENU_SELCHANGE:

                  onMenuSelChange(pMsg->WParam,pMsg->LParam);

                  break;

           case OSM_TOUCH_SCREEN://OSM_TOUCH_SCREEN:

                         Touch_Position.x=pMsg->WParam&0xffff;

                         Touch_Position.y=pMsg->WParam>>16;

                         if(judge==1)

           {

                         if(IsInRect2(precta, pTouch_Position))

                         {

                             if(statea==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,5);

                                              statea=1;

                                              Uart_Printf("01号桌点了小鸡炖蘑菇\t");

                                              sysnumber=sysnumber+price[0];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                       }

                                else

                                       {

                                       FillRect( pdc, 20,5,40,25, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 5, 40, 25);

                                       statea=0;

                                       Uart_Printf("01号桌取消您点了小鸡炖蘑菇\t");

                                       sysnumber=sysnumber-price[0];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                }

                         else if(IsInRect2(prectb, pTouch_Position))

                         {

                             if(stateb==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,37);

                                              stateb=1;

                                              Uart_Printf("01号桌点了酸菜炖粉条\t");

                                              sysnumber=sysnumber+price[1];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,37,40,57, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 37, 40, 57);

                                       stateb=0;

                                       Uart_Printf("01号桌取消了酸菜炖粉条\t");

                                       sysnumber=sysnumber-price[1];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                num=sysnumber;

                                       }

                                }

                         else if(IsInRect2(prectc, pTouch_Position))

                         {

                             if(statec==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,69);

                                              statec=1;

                                              Uart_Printf("01号桌点了红烧狮子头\t");

                                              sysnumber=sysnumber+price[2];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,69,40,89, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 69, 40, 89);

                                       statec=0;

                                       Uart_Printf("01号桌取消了红烧狮子头\t");

                                       sysnumber=sysnumber-price[2];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                }

                         else if(IsInRect2(prectd, pTouch_Position))

                         {

                             if(stated==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,101);

                                              stated=1;

                                              Uart_Printf("01号桌点了烤乳猪\t");

                                              sysnumber=sysnumber+price[3];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,101,40,121, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20, 101, 40, 121);

                                       stated=0;

                                       Uart_Printf("01号桌取消了烤乳猪\t");

                                       sysnumber=sysnumber-price[3];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                }

                         else if(IsInRect2(precte, pTouch_Position))

                         {

                            //FillRect( pdc, 20,5,40,25, GRAPH_MODE_NORMAL, COLOR_WHITE);

                             if(statee==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,133);

                                              statee=1;

                                                     Uart_Printf("01号桌点了太子蟹\t");

                                              sysnumber=sysnumber+price[4];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,133,40,153, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20,133, 40, 153);

                                       statee=0;

                                       Uart_Printf("01号桌取消了太子蟹\t");

                                       sysnumber=sysnumber-price[4];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                num=sysnumber;

                                       }

                                }

                         else if(IsInRect2(prectf, pTouch_Position))

                         {

                             if(statef==0)

                                   {

                                      ShowBmp(pdc,dj_Pict, 20,165);

                                              statef=1;

                                              Uart_Printf("01号桌点了文昌鸡\t");

                                              sysnumber=sysnumber+price[5];

                                              Int2Unicode(sysnumber,str);

                                              SetTextCtrlText(pTextCtrl, str,TRUE);

                                              num=sysnumber;

                                   }

                                else

                                       {

                                       FillRect( pdc, 20,165,40,185, GRAPH_MODE_NORMAL, COLOR_WHITE);

                                       DrawRectFrame(pdc, 20,165, 40,185);

                                       statef=0;

                                       Uart_Printf("01号桌取消了文昌鸡\t");

                                       sysnumber=sysnumber-price[5];

                                       Int2Unicode(sysnumber,str);

                                       SetTextCtrlText(pTextCtrl, str,TRUE);

                                       num=sysnumber;

                                       }

                                }

                         else if(IsInRect2(prect, pTouch_Position))

                         {     ClearScreen();

                             ShowBmp(pdc,dj_Pict1, 60,40);

                             judge=2;

                OSTimeDly(1500);

                                ClearScreen();

                                ShowBmp(pdc,dj_Pict2, 0,0);

                                judge=0;

                                sysnumber=0;

                                }

              }

                         break;

           default:

                  OSOnSysMessage(pMsg);

                  break;

           }

           DeleteMessage(pMsg);//删除消息,释放资源

           OSTimeDly(200);

    }

    DestoryDC(pdc);

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 void Dynamic_Display_Task(void *Id)

{

       U32 key;

         for(;;)

         {  key=num;

      //PDC pdc;//创建绘图设备上下文结构

           ZLG7289_ENABLE();//使zlg7289占有同步串口

           Delay(5);//延时

        WriteSDIO(ZLG7289_CMD_DATA1|0);//数码管以方式0译码,第一个数码管亮

           WriteSDIO(key%10);//显示个位

           Delay(1);//延时

           if(key>99)

           {//键值大于99显示十位

                  WriteSDIO(ZLG7289_CMD_DATA1|2);//发送十位数据

                  WriteSDIO((unsigned char)(key/100));

                  Delay(1);

                  //WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示

                  //WriteSDIO(5);

                  WriteSDIO(ZLG7289_CMD_DATA1|1);//发送十位数据

                  WriteSDIO((unsigned char)((key%100)/10));

                  Delay(1);

                  WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示

                  WriteSDIO(7);

           }

           else if(key>9)

           {//键值大于9显示十位

                  WriteSDIO(ZLG7289_CMD_DATA1|1);//发送十位数据

                  WriteSDIO((unsigned char)(key/10));

                  Delay(1);

                  WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示

                  WriteSDIO(3);

           }

           else

           {//键值小于10不显示十位

                  WriteSDIO(ZLG7289_CMD_HIDE);//使个位数码管显示

                  WriteSDIO(1);

           }

           ZLG7289_DISABLE();//zlg7289放弃同步串口控制权

           OSTimeDly(1);          

           }

}

5. 总结

基于ARM的嵌入式电子点菜系统,本系统在硬件实现以及软件编译实现过程中相对不是很复杂,参考《基于ARM的嵌入式系统设计实验与实践教程》,再结合自己的设计和改进可以实现,一般来说不会碰到太大的问题。虽然没有大的问题,但是不断有小的问题产生,他们藏匿在系统的各个细小的环节当中,让你的系统总是不能如你所愿的完美实现。我们在实现这个系统的过程中就遇见了不少问题,罗列如下:

(1)图片格式及的选择问题

由于本系统要用到大量的图片作文参考,图片的选择很关键。我们再添加图片的时候,总是不能让图片的大小和清晰度符合触摸屏的大小和分辨率,也不能完全符合我们的希望。经过长时间的探讨和研究,结合参考书,最后确定应该使用的图片格式为BPM格式,图片的大小为主界面320*240,点菜界面根据图片的数量而定,我们使用的有六道菜,所以点菜界面有六张图片,大小都以88*66为最佳,最终达到了我们的要求。

(2)触摸屏的问题

由于本系统最基本的功能要求实现触摸屏触摸点菜的功能,要求实验台的触摸屏功能完好。但是我们所在的2个实验室将近40多个实验台没有几个触摸屏功能是好的,大多数触摸灵敏度不够或者过于灵敏。我们在书记主要功能即触摸点菜功能时参考了教科书以及自己的设计进行了这部分的代码编译,但是在触摸屏上检测的时候,效果很不理想,触摸点菜功能时好时坏。我们对代码进行了许多改进和完善,并且还用坐标的方式进行了检测,发现在用单个的横纵坐标来实现触摸功能的时候触摸功能是好的,但是一转化为包含图片区域空间时触摸功能就又不好用了,换了几个实验台依然如此。当然我们也不是很确定是不是触摸屏的问题,鉴于进度慢慢落后,我们就放弃了继续查找原因并改进,希望老师能予以理解。

以上就是在设计和实现本系统时的两个主要问题,通过我们的努力和多方面寻找原因,最后也不能说完全解决了问题,但是基本上达到了我们的要求。本次课程设计实验不仅增强了我们的嵌入式硬件设计能力,两人一组的协同合作也增强了团队意识,还提升了编码水平,总的来说获益匪浅。

6. 参考文献

武俊鹏 张国印 姚爱红 赵国冬.基于ARM的嵌入式系统设计实验与实践教程[M].北京:清华大学出版社.

相关推荐