原创 1602翻页模式的编程思路

2008-12-29 15:13 3164 9 12 分类: MCU/ 嵌入式

因为这是我从一个大的工程项目里摘出来的的一个翻页模式模块程序,


在这里与大家分享:


if(Key_no)              // if key has pressed, first action is turn on back light


   {
  switch(pageno)
  {
   case 0:
    page0_operate();
    break;
   case 1:
    page1_operate();
    break;
   case 2:
    page2_operate();
    break;
   case 3:
    page3_operate();
    break;
   case 4:
    page4_operate();
    break;
   case 5:
    Page5_Operate();
    break;
   case 6:
    Page6_Operate();
    break;
   case 7:
    Page7_Operate();
    break;
   case 8:
    Page8_Operate();
    break;
   case 9:
    Page9_Operate();
    break;
   case 10:
    Page10_Operate();
    break;
   case 11:
    Page11_Operate();
    break;
//   case 12:
//    Page12_Operate();
//    break;
   case 13:
    Page13_Operate();
    break;
   case 14:
    Page14_Operate();
    break;
   case 15:      //display reg/cont perods and sum of reg user
    Page15_Operate();
    break;
   case 16:      //disp last operate type and MAC addr
    Page16_Operate();
    break;


   default:
    pageno=0;
    break;
  }
 Key_no = 0;
 disppage();
 }
}



此程序模块先做键盘操作,在显示


 



void page0_operate(void)
{
 if(Key_no&0x20)   //P25 down键
  pageno++;
}


 


 


void page1_operate(void) //clock page时钟操作模式

 UCHAR idata temp;
 if(pagelocate==0)    //没有出现光标模式,只是显示模式
 {
  if(Key_no&0x20)   //down: next page
   pageno++;
  else if(Key_no&0x40)    // P26 up:last page
   pageno--;
  else if(Key_no&0x80) //P27 ESC键
   pageno=0;   //也就是最初模式页0模式
  else if(Key_no&0x10) //P24 ENTER键
   pagelocate=1;   //第一次按enter键进入1~6的编辑模式光标停留在第一个字符
 }
 else if(pagestatus==0)      //按enter键进入编辑模式光标1~6移动,shift between each location
 {
  if((Key_no&0x40)&&(pagelocate>1))   
   pagelocate--;  //往向一光标移动
  else if((Key_no&0x20)&&(pagelocate<6))
   pagelocate++;  //往下一光标移动
  else if(Key_no&0x80)  //exit move in page 退出编辑模式
   pagelocate=0;
  else if(Key_no&0x10)   //再次按enter进入编辑每个字符模式
  {
   pagestatus = 1;   //enter edit mode 确实进入编辑模式
   time_buf[6]=0;
  }
 }
 else       //edit:change value at cursor 编辑每个字符的模式,也就是pagestatus = 1模式
 {
  if(Key_no&0x80)
   pagestatus=0;  //exit without change 按esc键退出编辑每个字符模式进入1~6字符模式
  else if(Key_no&0x10) //exit and save changed value 按enter键保存修改字符
  {
   pagestatus=0;
   Writetime1();
   }
  else if(Key_no&0x40) //value ++ 按up键累加功能
  {
   switch(pagelocate)
   {
    case 1: temp=(time_buf[0]>>4)*10+(time_buf[0]&0x0f);
      if(temp<99)   //year 00~99
           temp++;
        else
          temp=0;
      time_buf[0]=((temp/10)<<4)+temp%10;
        break;
    case 2: temp=(time_buf[1]>>4)*10+(time_buf[1]&0x0f);
      if(temp<12)   //month 1~12
           temp++;
         else
          temp=1;
      time_buf[1]=((temp/10)<<4)+temp%10;
         break;


    case 3: temp=(time_buf[2]>>4)*10+(time_buf[2]&0x0f);
      if(temp<31)   //date 1~31
           temp++;
         else
          temp=1;
         time_buf[2]=((temp/10)<<4)+temp%10;
      break;


    case 4:if(time_buf[3]<6)   //day of week 0~6
           time_buf[3]++;
        else
          time_buf[3]=0;
        break;
    case 5: temp=(time_buf[4]>>4)*10+(time_buf[4]&0x0f);
      if(temp<23)   //hour 0~23
           temp++;
      else
          temp=0;
      time_buf[4]=((temp/10)<<4)+temp%10;
         break;
    case 6: temp=(time_buf[5]>>4)*10+(time_buf[5]&0x0f);
      if(temp<59)   //minute 0~59
           temp++;
         else
          temp=0;
      time_buf[5]=((temp/10)<<4)+temp%10;
         break;
    default: break;
      
   }
  }
  else if(Key_no&0x20) //value -- 按down键累减功能
  {
   switch(pagelocate)
   {
    case 1: temp=(time_buf[0]>>4)*10+(time_buf[0]&0x0f);
      if(temp>0)   //year 00~99
           temp--;
        else
          temp=99;
      time_buf[0]=((temp/10)<<4)+temp%10;
        break;
    case 2: temp=((time_buf[1]>>4)*10)+(time_buf[1]&0x0f);
      if(temp>1)   //month 1~12
           temp--;
         else
          temp=12;
      time_buf[1]=((temp/10)<<4)+temp%10;
         break;


    case 3: temp=(time_buf[2]>>4)*10+(time_buf[2]&0x0f);
      if(temp>1)   //date 1~31
           temp--;
         else
          temp=31;
         time_buf[2]=((temp/10)<<4)+temp%10;
      break;


    case 4:if(time_buf[3]>0)   //day of week 0~6
           time_buf[3]--;
        else
          time_buf[3]=6;
        break;
    case 5: temp=(time_buf[4]>>4)*10+(time_buf[4]&0x0f);
      if(temp>0)   //hour 0~23
           temp--;
      else
          temp=23;
      time_buf[4]=((temp/10)<<4)+temp%10;
         break;
    case 6: temp=(time_buf[5]>>4)*10+(time_buf[5]&0x0f);
      if(temp>0)   //minute 0~59
           temp--;
         else
          temp=59;
      time_buf[5]=((temp/10)<<4)+temp%10;
         break;
    default: break;
      
   }
      }
   


 }
}


此程序位一个1602翻页模式程序模块,主要编程思路:首先有四个按键 ESC UP DOWN ENTER 在每个页面模式他的功能键又不一样
分析思路如下:首先主要实现三个页面模式,一为正常阅读模式,二为光标移动模式,三为光标确定模式,
在正常模式下 UP 表示上一页,DOWN 表示下一页,ENTER表示进入第二个光标移动模式,在第二个光标移动模式下,UP表示累减光标,DOWN表示累加光标,ENTER表示确认进入三个光标确定模式。在第三个光标确定模式下UP 表示要修改的数字的累减,DOWN表示要修改的数字累加 ENTER 表示确认并保存退出到上一级模式。

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户157103 2009-1-3 19:39

不错,谢谢分享

用户1398279 2009-1-1 17:32

的确是很好的思路!

用户513348 2008-12-30 19:57

看得人很多,竟没人回复和顶,哎~~~~ 不错的文章,谢谢楼主
相关推荐阅读
用户1409899 2013-10-31 14:46
modbus协议crc-16算法
/------------------------------------- #if 0 #define uchar unsigned char #define uint  unsig...
用户1409899 2013-10-31 14:42
堆栈指针
  一道嵌入式系统设计师堆栈指针考题引发的思考: 在8086微处理器中,若(SS)=2000H,(SP)=0100H,(AX)=2117H,执行指令 PUSHAX后存放数据21H的物理...
用户1409899 2013-10-24 16:51
转载 :数据结构内存对齐
内存对齐 在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度。 我们还是先来看一段简单的程序: 程序一 ...
用户1409899 2013-01-14 09:51
中星微zc301b摄像头
  硬件环境:友善之臂mini2440开发板+中星微zc301b摄像头 软件环境:linux2.6.29内核+上位机Ubuntu8.04 日    期:2012-12-1...
用户1409899 2012-07-05 19:44
国嵌mp3播放器应用程序
************************************************* Function name: main Parameter    : void Descr...
用户1409899 2012-07-05 19:43
国嵌mp3播放器应用程序
1.掌握双向循环链表,对指针,结构体,动态分配内存等C语言要求较高 2.掌握多进程编程,以及共享内存通信相关方面的内容     /*  *     mp3播放器控制程序  * ...
EE直播间
更多
我要评论
3
9
关闭 站长推荐上一条 /3 下一条