找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7669|回复: 5
打印 上一主题 下一主题
收起左侧

单片机多功能计数器程序 12864液晶显示

  [复制链接]
跳转到指定楼层
楼主
多功能计数器  有循环 延时 输出 等指令。可灵活设定步数。如需要原理图可以联系我 354340189


单片机源程序如下:
  1. #include "common.h"
  2. #include "port.h"
  3. #include "res.h"
  4. #include "lcd12864.h"
  5. #include "24c64.h"

  6. void Timer0Init(void);
  7. void Timer1Init(void);
  8. u32 TimerGetCount(void);//读取计数
  9. void TimerSetCount(u32 nCnt);//设置计数
  10. void ShowCursor(u8 nPos,u8 bMove);//设置选择光标
  11. void PulseOut(u8 nIndex);//输出一个脉冲 0-2

  12. void BuildCmd(u8 *buf);//构建命令
  13. void AnalyzeCmd(u8 *buf);//解析指令
  14. void ShowCmd(u8 nPos,u8 nHide);//显示指令
  15. void CopyProg(u16 src,u16 dst);//复制程序
  16. void ClearProg(u16 dst);//清除程序

  17. u8 code CMDLEN[]={6,6,3,7,6,1,1,1};
  18. u16 code DECTAB[]={1,10,100,1000,10000};

  19. u8 g_tnKeyDown[4]={0};
  20. u8 g_tnPulse[3]={0};
  21. u8 g_tnShow=0;

  22. bit g_bOverflow=0,bLineChange=0;

  23. u8 idata g_nCmdBuf[3][4]={0x00,0xFF,0xCF,0xC7};
  24. u16 idata g_nLineStack[10];
  25. u8 g_nCurFile=0;
  26. u8 g_nStackDeep=0;
  27. s16 g_nCurLine;
  28. u8 g_nCurCmd;
  29. s16 g_nCurPara0,g_nCurPara1;
  30. s32 g_nCurPara=0;

  31. u32 g_tnDelay=0;
  32. u16 g_nLoop=0xFFFF;

  33. main()
  34. {
  35.         u8 i;
  36.         u8 key;
  37.         u8 nMode=0,nModeOld=0;
  38.         u8 nMenu=0,nSubMenu=0;
  39.         u8 nMask=0;
  40.         u8 nProgSelect=0;
  41.         bit bNextCmd=0;

  42.         Timer0Init();
  43.         Timer1Init();
  44.         LcdInit();

  45.         //输出
  46.         for(i=0;i<5;i++) SetOutput(i,0);
  47.         for(i=0;i<2;i++) GetInput();
  48.         
  49.         //取消写保护
  50.         X24_WriteProtect(0);
  51.         
  52.         //待机界面
  53.         LcdWriteString(0x00,RESMENU[nMenu]);
  54.         X24_Read(2020,&nProgSelect,1);
  55.         if(nProgSelect > 9) nProgSelect = 0;
  56.         LcdWriteNum(0x13,nProgSelect+1,3,0);
  57.         g_nCurLine = 0;
  58.         X24_Read(g_nCurLine<<2,g_nCmdBuf[0],4);
  59.         LcdWriteNum(0x15,g_nCurLine,3,0);
  60.         AnalyzeCmd(g_nCmdBuf[0]);
  61.         ShowCmd(0x23,0);

  62.         EA = 1;
  63.         while(1)
  64.         {
  65.                 key = GetKey();
  66.                 if(!key && !nMenu) key = GetInput();//待机
  67.                 if(nMenu == 2)//手动计数模式
  68.                 {
  69.                         if(nMask) key = nMask;
  70.                         nMask = 0;
  71.                 }
  72.                 for(i=0;i<4;i++)
  73.                 {
  74.                         if(!IsKeyDown(i)) g_tnKeyDown[i] = 0;
  75.                 }
  76.                 if(!key)
  77.                 {
  78.                         //按键长按处理
  79.                         for(i=0;i<4;i++)
  80.                         {
  81.                                 if((g_tnKeyDown[i] != 0xFF) && (g_tnKeyDown[i] > 100))
  82.                                 {
  83.                                         g_tnKeyDown[i] = 0xFF;
  84.                                         key = 11+i;
  85.                                 }
  86.                         }
  87.                 }
  88.                 if(key)
  89.                 {
  90.                         switch(nMenu)
  91.                         {
  92.                         case 0://待机界面
  93.                                 switch(key)
  94.                                 {
  95.                                 case 13://进入主菜单
  96.                                         if(nMode != 1)
  97.                                         {
  98.                                                 nMenu = 1;
  99.                                                 nSubMenu = 0;
  100.                                                 //主菜单
  101.                                                 LcdWriteString(0x00,RESMENU[nMenu]);
  102.                                                 ShowCursor(0x00,0);
  103.                                         }
  104.                                         break;
  105.                                 case 1://K1 启动
  106.                                         if(nMode != 1)
  107.                                         {
  108.                                                 if(nMode == 2)
  109.                                                 {
  110.                                                         if(g_nCurCmd || (!GetOutput(1)))
  111.                                                         {
  112.                                                                 ForceClose(0);//暂停
  113.                                                                 nMode = 1;
  114.                                                                 LcdWriteString(0x33,"启动");
  115.                                                         }
  116.                                                 }
  117.                                                 else
  118.                                                 {
  119.                                                         nMode = 1;
  120.                                                         LcdWriteString(0x33,"启动");
  121.                                                 }
  122.                                         }
  123.                                         break;
  124.                                 case 2://K2 暂停
  125.                                         if(nMode == 1)
  126.                                         {
  127.                                                 nMode = 2;
  128.                                                 nMask = 0;
  129.                                                 ForceClose(1);//关闭所有端口
  130.                                                 if(g_nCurCmd == 0)
  131.                                                 {
  132.                                                         if(g_nCurPara > 0) g_nCurPara = 0x01000000-TimerGetCount();
  133.                                                         else g_nCurPara = TimerGetCount()-0x01000000;
  134.                                                         PulseOut(1);//Q2输出一个高电平
  135.                                                 }
  136.                                                 LcdWriteString(0x33,"暂停");
  137.                                         }
  138.                                         break;
  139.                                 case 14://长按 K4
  140.                                         if(nMode == 2)
  141.                                         {
  142.                                                 nMode = 0;
  143.                                                 nMask = 0;
  144.                                                 nModeOld = 0;
  145.                                                 g_tnDelay = 0;
  146.                                                 g_nLoop = 0xFFFF;
  147.                                                 g_nCurFile=0;
  148.                                                 g_nStackDeep=0;
  149.                                                 g_nCurLine = 0;
  150.                                                 for(i=0;i<5;i++) SetOutput(i,0);
  151.                                                 X24_Read(g_nCurLine<<2,g_nCmdBuf[0],4);
  152.                                                 LcdWriteNum(0x15,g_nCurLine,3,0);
  153.                                                 AnalyzeCmd(g_nCmdBuf[0]);
  154.                                                 LcdWriteString(0x23,"         ");
  155.                                                 ShowCmd(0x23,0);
  156.                                                 LcdWriteString(0x33,"待机");
  157.                                         }
  158.                                         break;
  159.                                 }
  160.                                 break;

  161.                         case 1://主菜单
  162.                                 switch(key)
  163.                                 {
  164.                                 case 4://返回主菜单
  165.                                         nMenu = 0;
  166.                                         nMode = 0;
  167.                                         nModeOld = 0;
  168.                                         g_nCurFile=0;
  169.                                         g_nStackDeep=0;
  170.                                         nMask = 0;
  171.                                         //待机界面
  172.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  173.                                         X24_Read(2020,&nProgSelect,1);
  174.                                         if(nProgSelect > 9) nProgSelect = 0;
  175.                                         LcdWriteNum(0x13,nProgSelect+1,3,0);
  176.                                         g_nCurLine = 0;
  177.                                         X24_Read(g_nCurLine<<2,g_nCmdBuf[0],4);
  178.                                         LcdWriteNum(0x15,g_nCurLine,3,0);
  179.                                         AnalyzeCmd(g_nCmdBuf[0]);
  180.                                         ShowCmd(0x23,0);
  181.                                         break;
  182.                                 case 5://上
  183.                                         if(!nSubMenu) nSubMenu = 3;
  184.                                         else nSubMenu--;
  185.                                         ShowCursor(nSubMenu << 4,1);
  186.                                         break;
  187.                                 case 6://下
  188.                                         if(nSubMenu < 3) nSubMenu++;
  189.                                         else nSubMenu = 0;
  190.                                         ShowCursor(nSubMenu << 4,1);
  191.                                         break;
  192.                                 case 1://进入选项
  193.                                         nMenu = 2+nSubMenu;
  194.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  195.                                         if(nSubMenu) ShowCursor(0x20,0);
  196.                                         nSubMenu = 0;

  197.                                         //初始化
  198.                                         if(nMenu == 2)//计数手动
  199.                                         {
  200.                                                 nMode = 0;
  201.                                                 nModeOld = 0;
  202.                                                 nMask = 0;
  203.                                                 g_nCurPara = 0;
  204.                                         }
  205.                                         break;
  206.                                 }
  207.                                 break;

  208.                         case 2://计数手动
  209.                                 switch(key)
  210.                                 {
  211.                                 case 4://返回主菜单
  212.                                         nMode = 0;

  213.                                         nSubMenu = nMenu - 2;
  214.                                         nMenu = 1;
  215.                                         //主菜单
  216.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  217.                                         ShowCursor(nSubMenu << 4,0);
  218.                                         break;
  219.                                 case 5://上
  220.                                         if(!nMode)
  221.                                         {
  222.                                                 PulseOut(0);
  223.                                                 if(nModeOld == 2)
  224.                                                 {
  225.                                                         g_bOverflow = 0;
  226.                                                         TimerSetCount(0x01000000-g_nCurPara);
  227.                                                         nMode = 4;
  228.                                                         LcdWriteString(0x34,RESCOUNT[nMode]);
  229.                                                 }
  230.                                                 else
  231.                                                 {
  232.                                                         TimerSetCount(g_nCurPara);
  233.                                                         nMode = 1;
  234.                                                         LcdWriteString(0x34,RESCOUNT[nMode]);
  235.                                                 }
  236.                                         }
  237.                                         break;
  238.                                 case 6://下
  239.                                         if(!nMode)
  240.                                         {
  241.                                                 PulseOut(2);
  242.                                                 if(nModeOld == 1)
  243.                                                 {
  244.                                                         g_bOverflow = 0;
  245.                                                         TimerSetCount(0x01000000-g_nCurPara);
  246.                                                         nMode = 3;
  247.                                                         LcdWriteString(0x34,RESCOUNT[nMode]);
  248.                                                 }
  249.                                                 else
  250.                                                 {
  251.                                                         TimerSetCount(g_nCurPara);
  252.                                                         nMode = 2;
  253.                                                         LcdWriteString(0x34,RESCOUNT[nMode]);
  254.                                                 }
  255.                                         }
  256.                                         break;
  257.                                 case 8://暂停
  258.                                         if(nMode)
  259.                                         {
  260.                                                 PulseOut(1);
  261.                                                 if(nMode <= 2)//计数模式
  262.                                                 {
  263.                                                         nModeOld = nMode;
  264.                                                         g_nCurPara = TimerGetCount();
  265.                                                         if(g_nCurPara > 100000)
  266.                                                         {
  267.                                                                 g_nCurPara -= 100000;
  268.                                                                 TimerSetCount(g_nCurPara);
  269.                                                         }
  270.                                                 }
  271.                                                 else//倒数模式
  272.                                                 {
  273.                                                         g_nCurPara = 0x01000000-TimerGetCount();
  274.                                                         if(g_bOverflow)
  275.                                                         {
  276.                                                                 nMode = 0;
  277.                                                                 nModeOld = 0;
  278.                                                                 g_nCurPara = 0;
  279.                                                         }
  280.                                                 }
  281.                                                 if(nMode & 0x01) LcdWriteNum(0x24,g_nCurPara,5,0);//递增模式
  282.                                                 else LcdWriteNum(0x24,-g_nCurPara,5,0);//递减模式
  283.                                                 if(nMode)
  284.                                                 {
  285.                                                         LcdWriteString(0x34,RESCOUNT[nModeOld+4]);
  286.                                                 }
  287.                                                 else LcdWriteString(0x34,RESCOUNT[nMode]);
  288.                                                 nMode = 0;
  289.                                         }
  290.                                         break;
  291.                                 case 12://长按K2
  292.                                         if(!nMode)
  293.                                         {
  294.                                                 nModeOld = 0;
  295.                                                 g_nCurPara = 0;
  296.                                                 LcdWriteNum(0x24,g_nCurPara,5,0);
  297.                                                 LcdWriteString(0x34,RESCOUNT[nMode]);
  298.                                         }
  299.                                         break;
  300.                                 }
  301.                                 break;
  302.                         case 3://程序编写
  303.                         case 4://I/O手动
  304.                         case 5://程序存储
  305.                                 switch(key)
  306.                                 {
  307.                                 case 4://返回主菜单
  308.                                         nSubMenu = nMenu - 2;
  309.                                         nMenu = 1;
  310.                                         //主菜单
  311.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  312.                                         ShowCursor(nSubMenu << 4,0);
  313.                                         break;
  314.                                 case 5://上
  315.                                         if(!nSubMenu) nSubMenu = 1;
  316.                                         else nSubMenu--;
  317.                                         ShowCursor(0x20+(nSubMenu<<4),1);
  318.                                         break;
  319.                                 case 6://下
  320.                                         if(nSubMenu < 1) nSubMenu++;
  321.                                         else nSubMenu = 0;
  322.                                         ShowCursor(0x20+(nSubMenu<<4),1);
  323.                                         break;
  324.                                 case 1://进入选项
  325.                                         nMenu = 6+(nMenu-3)*2+nSubMenu;
  326.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  327.                                         nSubMenu = 0;

  328.                                         //初始化
  329.                                         switch(nMenu)
  330.                                         {
  331.                                         case 6://程序编辑
  332.                                                 LcdWriteNum(0x04,nProgSelect+1,2,2);

  333.                                                 g_nCurLine = 0;
  334.                                                 nMode = 0;
  335.                                                 nModeOld = 0;
  336.                                                 nMask = 0;
  337.                                                 X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  338.                                                 for(i=0;i<3;i++)
  339.                                                 {
  340.                                                         AnalyzeCmd(g_nCmdBuf[i]);
  341.                                                         ShowCmd(0x13+(i<<4),0);
  342.                                                 }
  343.                                                 break;
  344.                                         case 7://程序保存
  345.                                                 LcdWriteNum(0x04,nProgSelect+1,2,1);
  346.                                                 break;
  347.                                         case 8://输入监控
  348.                                                 nMask = 1;
  349.                                                 nMode = 0;
  350.                                                 for(i=0;i<5;i++)
  351.                                                 {
  352.                                                         if(IsInputDown(i))
  353.                                                         {
  354.                                                                 nMode |= nMask;
  355.                                                                 LcdWriteString(((2+i/3)<<4)+(i%3)*3+1,"●");
  356.                                                         }
  357.                                                         else LcdWriteString(((2+i/3)<<4)+(i%3)*3+1,"○");
  358.                                                         nMask <<= 1;
  359.                                                 }
  360.                                                 break;
  361.                                         case 9://手动输出
  362.                                                 for(i=0;i<5;i++)
  363.                                                 {
  364.                                                         if(GetOutput(i)) LcdWriteString(((2+i/3)<<4)+(i%3)*3+1,"●");
  365.                                                         else LcdWriteString(((2+i/3)<<4)+(i%3)*3+1,"○");
  366.                                                 }

  367.                                                 LcdSetPos(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3);
  368.                                                 LcdPosOn(1);
  369.                                                 break;
  370.                                         case 10://程序调取
  371.                                         case 11://程序清除
  372.                                                 nSubMenu = nProgSelect;
  373.                                                 LcdSetPos(((1+(nSubMenu>>2))<<4)+(nSubMenu&0x03)*2);
  374.                                                 LcdPosOn(1);
  375.                                                 break;
  376.                                         }
  377.                                         break;
  378.                                 }
  379.                                 break;

  380.                         case 6://程序编辑
  381.                                 if(!nMode)
  382.                                 {
  383.                                         switch(key)
  384.                                         {
  385.                                         case 4://返回上级菜单
  386.                                                 nSubMenu = nMenu & 0x01;
  387.                                                 nMenu = ((nMenu-6)>>1)+3;
  388.                                                 LcdWriteString(0x00,RESMENU[nMenu]);
  389.                                                 ShowCursor(0x20+(nSubMenu<<4),1);
  390.                                                 break;
  391.                                         case 5://上
  392.                                                 if(!nSubMenu)
  393.                                                 {
  394.                                                         if(g_nCurLine)
  395.                                                         {
  396.                                                                 g_nCurLine--;
  397.                                                                 X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  398.                                                                 for(i=0;i<3;i++)
  399.                                                                 {
  400.                                                                         LcdWriteNum(0x10+(i<<4),g_nCurLine+i,3,0);
  401.                                                                         AnalyzeCmd(g_nCmdBuf[i]);
  402.                                                                         LcdWriteString(0x13+(i<<4),"         ");
  403.                                                                         ShowCmd(0x13+(i<<4),0);
  404.                                                                 }
  405.                                                                 nModeOld = 0;
  406.                                                                 nMask = 0;
  407.                                                         }
  408.                                                 }
  409.                                                 else
  410.                                                 {
  411.                                                         LcdWriteNum(0x10+(nSubMenu<<4),g_nCurLine+nSubMenu,3,0);
  412.                                                         nSubMenu--;
  413.                                                         nModeOld = 0;
  414.                                                         nMask = 1;
  415.                                                 }
  416.                                                 break;
  417.                                         case 6://下
  418.                                                 if(nSubMenu >= 2)
  419.                                                 {
  420.                                                         if(g_nCurLine < 498)
  421.                                                         {
  422.                                                                 g_nCurLine++;
  423.                                                                 X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  424.                                                                 for(i=0;i<3;i++)
  425.                                                                 {
  426.                                                                         LcdWriteNum(0x10+(i<<4),g_nCurLine+i,3,0);
  427.                                                                         AnalyzeCmd(g_nCmdBuf[i]);
  428.                                                                         LcdWriteString(0x13+(i<<4),"         ");
  429.                                                                         ShowCmd(0x13+(i<<4),0);
  430.                                                                 }
  431.                                                                 nModeOld = 0;
  432.                                                                 nMask = 0;
  433.                                                         }
  434.                                                 }
  435.                                                 else
  436.                                                 {
  437.                                                         LcdWriteNum(0x10+(nSubMenu<<4),g_nCurLine+nSubMenu,3,0);
  438.                                                         nSubMenu++;
  439.                                                         nModeOld = 0;
  440.                                                         nMask = 1;
  441.                                                 }
  442.                                                 break;
  443.                                         case 7://左翻页
  444.                                                 if(g_nCurLine)
  445.                                                 {
  446.                                                         if(g_nCurLine >= 3) g_nCurLine -= 3;
  447.                                                         else g_nCurLine = 0;
  448.                                                         X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  449.                                                         for(i=0;i<3;i++)
  450.                                                         {
  451.                                                                 LcdWriteNum(0x10+(i<<4),g_nCurLine+i,3,0);
  452.                                                                 AnalyzeCmd(g_nCmdBuf[i]);
  453.                                                                 LcdWriteString(0x13+(i<<4),"         ");
  454.                                                                 ShowCmd(0x13+(i<<4),0);
  455.                                                         }
  456.                                                         nModeOld = 0;
  457.                                                         nMask = 0;
  458.                                                 }

  459.                                                 break;
  460.                                         case 8://右翻页
  461.                                                 if(g_nCurLine < 498)
  462.                                                 {
  463.                                                         g_nCurLine += 3;
  464.                                                         if(g_nCurLine > 498) g_nCurLine = 498;
  465.                                                         X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  466.                                                         for(i=0;i<3;i++)
  467.                                                         {
  468.                                                                 LcdWriteNum(0x10+(i<<4),g_nCurLine+i,3,0);
  469.                                                                 AnalyzeCmd(g_nCmdBuf[i]);
  470.                                                                 LcdWriteString(0x13+(i<<4),"         ");
  471.                                                                 ShowCmd(0x13+(i<<4),0);
  472.                                                         }
  473.                                                         nModeOld = 0;
  474.                                                         nMask = 0;
  475.                                                 }
  476.                                                 break;
  477.                                         case 3://插入新行
  478.                                                 //1行处理
  479.                                                 for(g_nCurPara0 = 500;g_nCurPara0 > g_nCurLine+nSubMenu;g_nCurPara0--)
  480.                                                 {
  481.                                                         X24_Read((g_nCurPara0-1)<<2,g_nCmdBuf[0],4);
  482.                                                         X24_Write(g_nCurPara0<<2,g_nCmdBuf[0],4);
  483.                                                 }
  484.                                                 for(i=0;i<4;i++) g_nCmdBuf[nSubMenu][i] = 0xFF;
  485.                                                 X24_Write(g_nCurPara0<<2,g_nCmdBuf[nSubMenu],4);

  486.                                                 X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  487.                                                 for(i=0;i<3;i++)
  488.                                                 {
  489.                                                         LcdWriteNum(0x10+(i<<4),g_nCurLine+i,3,0);
  490.                                                         AnalyzeCmd(g_nCmdBuf[i]);
  491.                                                         LcdWriteString(0x13+(i<<4),"         ");
  492.                                                         ShowCmd(0x13+(i<<4),0);
  493.                                                 }
  494.                                                 nModeOld = 0;
  495.                                                 nMask = 0;
  496.                                                 break;
  497.                                         case 2://删除行
  498.                                                 //1行处理
  499.                                                 for(g_nCurPara0 = g_nCurLine+nSubMenu;g_nCurPara0 < 500;g_nCurPara0++)
  500.                                                 {
  501.                                                         X24_Read((g_nCurPara0+1)<<2,g_nCmdBuf[0],4);
  502.                                                         X24_Write(g_nCurPara0<<2,g_nCmdBuf[0],4);
  503.                                                 }

  504.                                                 X24_Read(g_nCurLine<<2,g_nCmdBuf[0],12);
  505.                                                 for(i=0;i<3;i++)
  506.                                                 {
  507.                                                         LcdWriteNum(0x10+(i<<4),g_nCurLine+i,3,0);
  508.                                                         AnalyzeCmd(g_nCmdBuf[i]);
  509.                                                         LcdWriteString(0x13+(i<<4),"         ");
  510.                                                         ShowCmd(0x13+(i<<4),0);
  511.                                                 }
  512.                                                 nModeOld = 0;
  513.                                                 nMask = 0;
  514.                                                 break;
  515.                                         case 1://进入编辑状态
  516.                                                 LcdWriteNum(0x10+(nSubMenu<<4),g_nCurLine+nSubMenu,3,0);
  517.                                                 nMode = 1;
  518.                                                 nModeOld = 0;
  519.                                                 nMask = 1;
  520.                                                 if(g_nCmdBuf[nSubMenu][0] > 7) g_nCmdBuf[nSubMenu][0] = 7;
  521.                                                 AnalyzeCmd(g_nCmdBuf[nSubMenu]);
  522.                                                 ShowCmd(0x13+(nSubMenu<<4),0);
  523.                                                 break;
  524.                                         }
  525.                                 }
  526.                                 else
  527.                                 {
  528.                                         switch(key)
  529.                                         {
  530.                                         case 4://返回行号选择
  531.                                                 nMode = 0;
  532.                                                 X24_Write((g_nCurLine+nSubMenu)<<2,g_nCmdBuf[nSubMenu],4);
  533.                                                 ShowCmd(0x13+(nSubMenu<<4),0);
  534.                                                 break;
  535.                                         case 7://左
  536.                                                 if(nMode > 1) nMode--;
  537.                                                 else nMode = CMDLEN[g_nCmdBuf[nSubMenu][0]];

  538.                                                 nModeOld = 0;
  539.                                                 nMask = 0;
  540.                                                 ShowCmd(0x13+(nSubMenu<<4),0);
  541.                                                 break;
  542.                                         case 8://右
  543.                                                 if(nMode < CMDLEN[g_nCmdBuf[nSubMenu][0]]) nMode++;
  544.                                                 else nMode = 1;

  545.                                                 nModeOld = 0;
  546.                                                 nMask = 0;
  547.                                                 ShowCmd(0x13+(nSubMenu<<4),0);
  548.                                                 break;
  549.                                         case 5://上
  550.                                                 if(nMode == 1)//命令选择
  551.                                                 {
  552.                                                         if(g_nCurCmd) g_nCurCmd--;
  553.                                                         else g_nCurCmd = 7;
  554.                                                         g_nCurPara = 0;
  555.                                                         g_nCurPara0 = 0;
  556.                                                         g_nCurPara1 = 0;
  557.                                                 }
  558.                                                 else//nMode == 2开始第一位设置
  559.                                                 {
  560.                                                         switch(g_nCurCmd)
  561.                                                         {
  562.                                                         case 0://J 计数指令
  563.                                                         case 1://Y 延时指令
  564.                                                                 g_nCurPara += DECTAB[6-nMode];
  565.                                                                 break;
  566.                                                         case 2://Q 输出开关
  567.                                                                 if(nMode == 2) g_nCurPara0++;
  568.                                                                 else g_nCurPara1++;
  569.                                                                 break;
  570.                                                         case 3://X 循环
  571.                                                                 if(nMode <= 4) g_nCurPara0 += DECTAB[4-nMode];
  572.                                                                 else g_nCurPara1 += DECTAB[7-nMode];
  573.                                                                 break;
  574.                                                         case 4://D 调用
  575.                                                                 if(nMode <= 4) g_nCurPara0 += DECTAB[4-nMode];
  576.                                                                 else g_nCurPara1 += DECTAB[6-nMode];
  577.                                                                 break;
  578.                                                         }
  579.                                                 }
  580.                                                 nModeOld = 0;
  581.                                                 nMask = 0;
  582.                                                 LcdWriteString(0x13+(nSubMenu<<4),"         ");
  583.                                                 BuildCmd(g_nCmdBuf[nSubMenu]);
  584.                                                 ShowCmd(0x13+(nSubMenu<<4),0);
  585.                                                 break;
  586.                                         case 6://下
  587.                                                 if(nMode == 1)//命令选择
  588.                                                 {
  589.                                                         if(g_nCurCmd < 7) g_nCurCmd++;
  590.                                                         else g_nCurCmd = 0;
  591.                                                         g_nCurPara = 0;
  592.                                                         g_nCurPara0 = 0;
  593.                                                         g_nCurPara1 = 0;
  594.                                                 }
  595.                                                 else//nMode == 2开始第一位设置
  596.                                                 {
  597.                                                         switch(g_nCurCmd)
  598.                                                         {
  599.                                                         case 0://J 计数指令
  600.                                                         case 1://Y 延时指令
  601.                                                                 g_nCurPara -= DECTAB[6-nMode];
  602.                                                                 break;
  603.                                                         case 2://Q 输出开关
  604.                                                                 if(nMode == 2) g_nCurPara0--;
  605.                                                                 else g_nCurPara1--;
  606.                                                                 break;
  607.                                                         case 3://X 循环
  608.                                                                 if(nMode <= 4) g_nCurPara0 -= DECTAB[4-nMode];
  609.                                                                 else g_nCurPara1 -= DECTAB[7-nMode];
  610.                                                                 break;
  611.                                                         case 4://D 调用
  612.                                                                 if(nMode <= 4) g_nCurPara0 -= DECTAB[4-nMode];
  613.                                                                 else g_nCurPara1 -= DECTAB[6-nMode];
  614.                                                                 break;
  615.                                                         }
  616.                                                 }
  617.                                                 nModeOld = 0;
  618.                                                 nMask = 0;
  619.                                                 LcdWriteString(0x13+(nSubMenu<<4),"         ");//X 000 000
  620.                                                 BuildCmd(g_nCmdBuf[nSubMenu]);
  621.                                                 ShowCmd(0x13+(nSubMenu<<4),0);
  622.                                                 break;
  623.                                         case 2://K2切换符号
  624.                                                 if(nMode > 1 && g_nCurCmd == 0)
  625.                                                 {
  626.                                                         g_nCurPara = -g_nCurPara;
  627.                                                         nModeOld = 0;
  628.                                                         nMask = 0;
  629.                                                         BuildCmd(g_nCmdBuf[nSubMenu]);
  630.                                                         ShowCmd(0x13+(nSubMenu<<4),0);
  631.                                                 }
  632.                                                 break;
  633.                                         }
  634.                                 }
  635.                                 break;
  636.                         case 7://程序保存
  637.                                 switch(key)
  638.                                 {
  639.                                 case 1://确定保存
  640.                                         CopyProg(0,nProgSelect+1);
  641.                                 case 2://返回上级菜单
  642.                                         nSubMenu = nMenu & 0x01;
  643.                                         nMenu = ((nMenu-6)>>1)+3;
  644.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  645.                                         ShowCursor(0x20+(nSubMenu<<4),1);
  646.                                         break;
  647.                                 }
  648.                                 break;
  649.                         case 8://输入监控
  650.                                 switch(key)
  651.                                 {
  652.                                 case 4://返回上级菜单
  653.                                         nSubMenu = nMenu & 0x01;
  654.                                         nMenu = ((nMenu-6)>>1)+3;
  655.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  656.                                         ShowCursor(0x20+(nSubMenu<<4),1);
  657.                                         break;
  658.                                 }
  659.                                 break;
  660.                         case 9://手动输出
  661.                                 switch(key)
  662.                                 {
  663.                                 case 4://返回上级菜单
  664.                                         LcdPosOn(0);
  665.                                         nSubMenu = nMenu & 0x01;
  666.                                         nMenu = ((nMenu-6)>>1)+3;
  667.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  668.                                         ShowCursor(0x20+(nSubMenu<<4),1);
  669.                                         break;
  670.                                 case 5://上
  671.                                         if(nSubMenu >= 3) nSubMenu -= 3;
  672.                                         else nSubMenu += 3;
  673.                                         if(nSubMenu > 4) nSubMenu -= 3;
  674.                                         LcdSetPos(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3);
  675.                                         break;
  676.                                 case 6://下
  677.                                         if(nSubMenu <= 2) nSubMenu += 3;
  678.                                         else nSubMenu -= 3;
  679.                                         if(nSubMenu > 4) nSubMenu -= 3;
  680.                                         LcdSetPos(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3);
  681.                                         break;
  682.                                 case 7://左
  683.                                         if(nSubMenu) nSubMenu--;
  684.                                         else nSubMenu = 4;
  685.                                         LcdSetPos(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3);
  686.                                         break;
  687.                                 case 8://右
  688.                                         if(nSubMenu < 4) nSubMenu++;
  689.                                         else nSubMenu = 0;
  690.                                         LcdSetPos(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3);
  691.                                         break;
  692.                                 case 1://K1切换输出状态
  693.                                         SetOutput(nSubMenu,!GetOutput(nSubMenu));
  694.                                         if(GetOutput(nSubMenu)) LcdWriteString(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3+1,"●");
  695.                                         else LcdWriteString(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3+1,"○");
  696.                                         LcdSetPos(((2+nSubMenu/3)<<4)+(nSubMenu%3)*3);
  697.                                         break;
  698.                                 }
  699.                                 break;
  700.                         case 10://程序调取
  701.                         case 11://程序清除
  702.                                 switch(key)
  703.                                 {
  704.                                 case 4://返回上级菜单
  705.                                         LcdPosOn(0);
  706.                                         nSubMenu = nMenu & 0x01;
  707.                                         nMenu = ((nMenu-6)>>1)+3;
  708.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  709.                                         ShowCursor(0x20+(nSubMenu<<4),1);
  710.                                         break;
  711.                                 case 5://上
  712.                                         if(nSubMenu >= 4) nSubMenu -= 4;
  713.                                         else nSubMenu += 8;
  714.                                         if(nSubMenu > 9) nSubMenu -= 4;
  715.                                         LcdSetPos(((1+(nSubMenu>>2))<<4)+(nSubMenu&0x03)*2);
  716.                                         break;
  717.                                 case 6://下
  718.                                         if(nSubMenu <= 7) nSubMenu += 4;
  719.                                         else nSubMenu -= 8;
  720.                                         if(nSubMenu > 9) nSubMenu -= 8;
  721.                                         LcdSetPos(((1+(nSubMenu>>2))<<4)+(nSubMenu&0x03)*2);
  722.                                         break;
  723.                                 case 7://左
  724.                                         if(nSubMenu) nSubMenu--;
  725.                                         else nSubMenu = 9;
  726.                                         LcdSetPos(((1+(nSubMenu>>2))<<4)+(nSubMenu&0x03)*2);
  727.                                         break;
  728.                                 case 8://右
  729.                                         if(nSubMenu < 9) nSubMenu++;
  730.                                         else nSubMenu = 0;
  731.                                         LcdSetPos(((1+(nSubMenu>>2))<<4)+(nSubMenu&0x03)*2);
  732.                                         break;
  733.                                 case 1://进入选项
  734.                                         LcdPosOn(0);
  735.                                         nMenu += 2;
  736.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  737.                                         LcdWriteNum(0x04,nSubMenu+1,2,1);
  738.                                         break;
  739.                                 }
  740.                                 break;
  741.                         case 12://调取程序
  742.                         case 13://清除程序
  743.                                 switch(key)
  744.                                 {
  745.                                 case 1://确定调取/清除
  746.                                         if(nMenu == 12)
  747.                                         {
  748.                                                 nProgSelect = nSubMenu;
  749.                                                 X24_Write(2020,&nProgSelect,1);
  750.                                                 CopyProg(nProgSelect+1,0);
  751.                                         }
  752.                                         else
  753.                                         {
  754.                                                 ClearProg(nSubMenu+1);
  755.                                         }
  756.                                 case 2://返回上级菜单
  757.                                         nMenu -= 2;
  758.                                         LcdWriteString(0x00,RESMENU[nMenu]);
  759.                                         LcdSetPos(((1+(nSubMenu>>2))<<4)+(nSubMenu&0x03)*2);
  760.                                         LcdPosOn(1);
  761.                                         break;
  762.                                 }
  763.                                 break;
  764.                         }
  765.                 }

  766.                 //运行控制
  767.                 if(!nMenu && nMode == 1)
  768.                 {
  769.                         if(IsInputDown(2))//故障I3
  770.                         {
  771.                                 nMode = 2;//暂停状态
  772.                                 ForceClose(1);//关闭所有端口
  773.                                 if(g_nCurCmd == 0)
  774.                                 {
  775.                                         nMask = 0;
  776.                                         if(g_nCurPara > 0) g_nCurPara = 0x01000000-TimerGetCount();
  777.                                         else g_nCurPara = TimerGetCount()-0x01000000;
  778.                                         PulseOut(1);//Q2输出一个高电平
  779.                                 }
  780.                                 LcdWriteString(0x33,"故障");
  781.                         }
  782.                         else
  783.                         {
  784.                                 bNextCmd = 0;
  785.                                 switch(g_nCurCmd)
  786.                                 {
  787.                                 case 0://J 计数指令
  788.                                         switch(nMask)
  789.                                         {
  790.                                         case 0:
  791.                                                 if(g_nCurPara > 0)
  792.                                                 {
  793.                                                         nMask = 1;
  794.                                                         PulseOut(0);
  795.                                                 }
  796.                                                 else
  797.                                                 {
  798.                                                         nMask = 2;
  799.                                                         PulseOut(2);
  800.                                                 }
  801.                                                 break;
  802.                                         case 1://>0
  803.                                                 if(!g_tnPulse[0])
  804.                                                 {
  805.                                                         nMask = 3;
  806.                                                         SetOutput(0,0);
  807.                                                         g_bOverflow = 0;
  808.                                                         TimerSetCount(0x01000000 - g_nCurPara);
  809.                                                 }
  810.                                                 break;
  811.                                         case 2://<=0
  812.                                                 if(!g_tnPulse[2])
  813.                                                 {
  814.                                                         nMask = 3;
  815.                                                         SetOutput(2,0);
  816.                                                         g_bOverflow = 0;
  817.                                                         TimerSetCount(0x01000000 + g_nCurPara);
  818.                                                 }
  819.                                                 break;
  820.                                         case 3://等待溢出
  821.                                                 if(g_bOverflow)
  822.                                                 {
  823.                                                         nMask = 4;
  824.                                                         PulseOut(1);
  825.                                                 }
  826.                                                 break;
  827.                                         case 4://等待Q2输出完成
  828.                                                 if(!g_tnPulse[1])
  829.                                                 {
  830.                                                         nMask = 0;
  831.                                                         SetOutput(1,0);
  832.                                                         bNextCmd = 1;
  833.                                                 }
  834.                                                 break;
  835.                                         }
  836.                                         break;
  837.                                 case 1://Y 延时指令
  838.                                         if(!nMask)//计时状态
  839.                                         {
  840.                                                 nMask = 1;
  841.                                                 g_tnDelay = g_nCurPara;
  842.                                         }
  843.                                         else
  844.                                         {
  845.                                                 if(!g_tnDelay)
  846.                                                 {
  847.                                                         nMask = 0;
  848.                                                         bNextCmd = 1;
  849.                                                 }
  850.                                         }
  851.                                         break;
  852.                                 case 2://Q 输出开关
  853.                                         SetOutput(g_nCurPara1-1,g_nCurPara0);
  854.                                         bNextCmd = 1;
  855.                                         break;
  856.                                 case 3://X 循环
  857.                                         if(!g_nCurPara1) g_nCurLine = g_nCurPara0-1;
  858.                                         else
  859.                                         {
  860.                                                 if(g_nLoop > g_nCurPara1) g_nLoop = g_nCurPara1;
  861.                                                 if(g_nLoop)
  862.                                                 {
  863.                                                         g_nLoop--;
  864.                                                         g_nCurLine = g_nCurPara0-1;
  865.                                                 }
  866.                                                 else g_nLoop = 0xFFFF;
  867.                                         }
  868.                                         bNextCmd = 1;
  869.                                         break;
  870.                                 case 4://D 调用
  871.                                         if(g_nStackDeep < 10)
  872.                                         {
  873.                                                 g_nLineStack[g_nStackDeep] = g_nCurLine | ((u16)g_nCurFile<<12);
  874.                                                 g_nStackDeep++;
  875.                                                 g_nCurLine = g_nCurPara0 - 1;
  876.                                                 g_nCurFile = g_nCurPara1;
  877.                                         }
  878.                                         bNextCmd = 1;
  879.                                         break;
  880.                                 case 5://P 暂停
  881.                                         nMode = 2;//暂停状态
  882.                                         ForceClose(1);//关闭所有端口
  883.                                         bNextCmd = 1;
  884.                                         LcdWriteString(0x33,"暂停");
  885.                                         break;
  886.                                 case 6://H
  887.                                         switch(nMask)
  888.                                         {
  889.                                         case 0:
  890.                                                 nMask = 1;
  891.                                                 PulseOut(2);
  892.                                                 break;
  893.                                         case 1:
  894.                                                 if(!g_tnPulse[2])
  895.                                                 {
  896.                                                         nMask = 2;
  897.                                                         SetOutput(2,0);
  898.                                                 }
  899.                                                 break;
  900.                                         case 2:
  901.                                                 if(IsInputDown(3))//等待I4
  902.                                                 {
  903.                                                         nMask = 3;
  904.                                                         PulseOut(1);
  905.                                                 }
  906.                                                 break;
  907.                                         case 3:
  908.                                                 if(!g_tnPulse[2])
  909.                                                 {
  910.                                                         nMask = 0;
  911.                                                         SetOutput(1,0);
  912.                                                         bNextCmd = 1;
  913.                                                 }
  914.                                                 break;
  915.                                         }
  916.                                         break;
  917.                                 default://END >= 7
  918.                                         if(g_nStackDeep)
  919.                                         {
  920.                                                 g_nStackDeep--;
  921.                                                 g_nCurFile = g_nLineStack[g_nStackDeep] >> 12;
  922.                                                 g_nCurLine = (g_nLineStack[g_nStackDeep] & 0x0FFF);
  923.                                         }
  924.                                         else
  925.                                         {
  926.                                                 nMode = 0;
  927.                                                 g_nCurLine = -1;
  928.                                                 LcdWriteString(0x33,"待机");
  929.                                         }
  930.                                         bNextCmd = 1;
  931.                                         break;
  932.                                 }
  933.                                 if(bNextCmd)
  934.                                 {
  935.                                         bLineChange = 1;
  936.                                         g_nCurLine++;
  937.                                         X24_Read(((u16)g_nCurFile<<11)+(g_nCurLine<<2),g_nCmdBuf[0],4);
  938.                                         AnalyzeCmd(g_nCmdBuf[0]);
  939.                                 }
  940.                         }
  941.                 }

  942.                 //显示控制
  943.                 if(!g_tnShow)
  944.                 {
  945.                         g_tnShow = 10;
  946.                         switch(nMenu)
  947.                         {
  948.                         case 0:
  949.                                 if(bLineChange)
  950.                                 {
  951.                                         bLineChange = 0;
  952.                                         LcdWriteNum(0x15,g_nCurLine,3,0);
  953.                                         LcdWriteString(0x23,"         ");
  954.                                         ShowCmd(0x23,0);
  955.                                 }
  956.                                 else
  957.                                 {
  958.                                         if(nMode == 1)//运行时
  959.                                         {
  960.                                                 if(g_nCurCmd == 0 && nMask == 3)//计数 状态下,显示计数
  961.                                                 {
  962.                                                         if(g_nCurPara > 0) LcdWriteNum(0x24,0x01000000-TimerGetCount(),5,0);
  963.                                                         else LcdWriteNum(0x24,TimerGetCount() - 0x01000000,5,0);
  964.                                                 }
  965.                                         }
  966.                                         else if(nMode == 2)//暂停状态
  967.                                         {
  968.                                                 if((!g_nCurCmd) && (!g_tnPulse[1])) SetOutput(1,0);
  969.                                         }
  970.                                 }
  971.                                 break;
  972.                         case 2://计数手动
  973.                                 for(i=0;i<3;i++)
  974.                                 {
  975.                                         if(!g_tnPulse[i]) SetOutput(i,0);
  976.                                 }
  977.                                 if(nMode)
  978.                                 {
  979.                                         if(IsInputDown(3)) nMask = 8;//I4
  980.                                         if(nMode <= 2)//计数模式
  981.                                         {
  982.                                                 g_nCurPara = TimerGetCount();
  983.                                                 if(g_nCurPara > 100000)
  984.                                                 {
  985.                                                         g_nCurPara -= 100000;
  986.                                                         TimerSetCount(g_nCurPara);
  987.                                                 }
  988.                                         }
  989.                                         else//倒数模式
  990.                                         {
  991.                                                 g_nCurPara = 0x01000000-TimerGetCount();
  992.                                                 if(g_bOverflow)
  993.                                                 {
  994.                                                         PulseOut(1);
  995.                                                         nMode = 0;
  996.                                                         nModeOld = 0;
  997.                                                         g_nCurPara = 0;
  998.                                                         LcdWriteString(0x34,RESCOUNT[nMode]);
  999.                                                 }
  1000.                                         }
  1001.                                         if(nMode & 0x01) LcdWriteNum(0x24,g_nCurPara,5,0);//递增模式
  1002.                                         else LcdWriteNum(0x24,-g_nCurPara,5,0);//递减模式
  1003.                                 }
  1004.                                 break;
  1005.                         case 6://程序编辑
  1006.                                 if(nModeOld) nModeOld--;
  1007.                                 else
  1008.                                 {
  1009.                                         nModeOld = 4;
  1010.                                         nMask = !nMask;
  1011.                                         if(!nMode)//闪烁行号
  1012.                                         {
  1013.                                                 if(nMask) LcdWriteNum(0x10+(nSubMenu<<4),g_nCurLine+nSubMenu,3,0);
  1014.                                                 else LcdWriteString(0x10+(nSubMenu<<4),"   ");
  1015.                                         }
  1016.                                         else
  1017.                                         {
  1018.                                                 if(nMask) ShowCmd(0x13+(nSubMenu<<4),0);
  1019.                                                 else ShowCmd(0x13+(nSubMenu<<4),nMode);
  1020.                                         }
  1021.                                 }
  1022.                                 break;
  1023.                         case 8://输入监控
  1024.                                 nMask = 1;
  1025.                                 for(i=0;i<5;i++)
  1026.                                 {
  1027.                                         if(IsInputDown(i))
  1028.                                         {
  1029.                                                 if(!(nMode & nMask))
  1030.                                                 {
  1031.                                                         nMode |= nMask;
  1032.                                                         LcdWriteString(((2+i/3)<<4)+(i%3)*3+1,"●");
  1033.                                                 }
  1034.                                         }
  1035.                                         else
  1036.                                         {
  1037.                                                 if(nMode & nMask)
  1038.                                                 {
  1039.                                                         nMode &= ~nMask;
  1040.                                                         LcdWriteString(((2+i/3)<<4)+(i%3)*3+1,"○");
  1041.                                                 }
  1042.                                         }
  1043.                                         nMask <<= 1;
  1044.                                 }
  1045.                                 break;
  1046.                         }
  1047.                 }
  1048.         }
  1049. }

  1050. //显示选择光标
  1051. void ShowCursor(u8 nPos,u8 bMove)
  1052. {
  1053.         static u8 nPosOld=0x00;
  1054.         if(bMove) LcdWriteString(nPosOld,"  ");
  1055.         LcdWriteString(nPos,">>");
  1056.         nPosOld = nPos;
  1057. }

  1058. //构建命令
  1059. void BuildCmd(u8 *buf)
  1060. {
  1061.         buf[0] = g_nCurCmd;
  1062.         switch(g_nCurCmd)
  1063.         {
  1064.         case 0://J 计数指令
  1065.                 if(g_nCurPara > 99999) g_nCurPara = 99999;
  1066.                 else if(g_nCurPara < -99999) g_nCurPara = -99999;
  1067.                 break;
  1068.         case 1://Y 延时指令
  1069.                 if(g_nCurPara > 99999) g_nCurPara = 99999;
  1070.                 else if(g_nCurPara < 1) g_nCurPara = 1;
  1071.                 break;
  1072.         case 2://Q 输出开关
  1073.                 if(g_nCurPara0 > 1) g_nCurPara0 = 1;
  1074.                 else if(g_nCurPara0 < 0) g_nCurPara0 = 0;
  1075.                 if(g_nCurPara1 > 5) g_nCurPara1 = 5;
  1076.                 else if(g_nCurPara1 < 1) g_nCurPara1 = 1;
  1077.                 break;
  1078.         case 3://X 循环
  1079.                 if(g_nCurPara0 > 500) g_nCurPara0 = 500;
  1080.                 else if(g_nCurPara0 < 0) g_nCurPara0 = 0;
  1081.                 if(g_nCurPara1 > 999) g_nCurPara1 = 999;
  1082.                 else if(g_nCurPara1 < 0) g_nCurPara1 = 0;
  1083.                 break;
  1084.         case 4://D 调用
  1085.                 if(g_nCurPara0 > 500) g_nCurPara0 = 500;
  1086.                 else if(g_nCurPara0 < 0) g_nCurPara0 = 0;
  1087.                 if(g_nCurPara1 > 10) g_nCurPara1 = 10;
  1088.                 else if(g_nCurPara1 < 1) g_nCurPara1 = 1;
  1089.                 break;
  1090.         }
  1091.         if(g_nCurCmd <= 1)
  1092.         {
  1093.                 buf[1] = ((u8*)&g_nCurPara)[1];
  1094.                 buf[2] = ((u8*)&g_nCurPara)[2];
  1095.                 buf[3] = ((u8*)&g_nCurPara)[3];
  1096.         }
  1097.         else if(g_nCurCmd <= 4)
  1098.         {
  1099.                 buf[1] = ((u8*)&g_nCurPara0)[0] << 4;
  1100.                 buf[1] |= ((u8*)&g_nCurPara0)[1] >> 4;
  1101.                 buf[2] = ((u8*)&g_nCurPara0)[1] << 4;
  1102.                 buf[2] |= ((u8*)&g_nCurPara1)[0] & 0x0F;
  1103.                 buf[3] = ((u8*)&g_nCurPara1)[1];
  1104.         }
  1105. }

  1106. //解析指令
  1107. void AnalyzeCmd(u8 *buf)
  1108. {
  1109.         g_nCurCmd = buf[0];
  1110.         if(g_nCurCmd <= 1)
  1111.         {
  1112.                 ((u8*)&g_nCurPara)[0] = (buf[1] & 0x80) ? 0xFF:0x00;
  1113.                 ((u8*)&g_nCurPara)[1] = buf[1];
  1114.                 ((u8*)&g_nCurPara)[2] = buf[2];
  1115.                 ((u8*)&g_nCurPara)[3] = buf[3];
  1116.         }
  1117.         else if(g_nCurCmd <= 4)
  1118.         {
  1119.                 ((u8*)&g_nCurPara0)[0] = buf[1]>>4;
  1120.                 ((u8*)&g_nCurPara0)[1] = (buf[1]<<4)|(buf[2]>>4);
  1121.                 ((u8*)&g_nCurPara1)[0] = buf[2]&0x0F;
  1122.                 ((u8*)&g_nCurPara1)[1] = buf[3];
  1123.         }
  1124. }

  1125. //显示指令
  1126. void ShowCmd(u8 nPos,u8 nHide)
  1127. {
  1128.         if(g_nCurCmd <= 7)
  1129.         {
  1130.                 if(nHide == 1)
  1131.                 {
  1132.                         if(g_nCurCmd < 7) LcdWriteString(nPos," ");
  1133.                         else LcdWriteString(nPos,"   ");
  1134.                 }
  1135.                 else LcdWriteString(nPos,RESCMD[g_nCurCmd]);

  1136.                 nHide += 10-2;
  1137.                 switch(g_nCurCmd)
  1138.                 {
  1139.                 case 0://0 计数
  1140.                 case 1://1 延时
  1141.                         if(nHide >= 10) LcdWriteNum(nPos+1,g_nCurPara,5,nHide);
  1142.                         else LcdWriteNum(nPos+1,g_nCurPara,5,0);
  1143.                         break;
  1144. ……………………

  1145. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码下载:
多功能计数器程序 12864.rar (150.98 KB, 下载次数: 98)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:199101 发表于 2017-6-2 23:26 | 只看该作者
最近想搞个累计计时功能,下载参考一下
回复

使用道具 举报

板凳
ID:231447 发表于 2017-9-6 16:39 | 只看该作者
楼主能提供原理图吗
回复

使用道具 举报

地板
ID:230847 发表于 2017-9-23 18:30 | 只看该作者
正在学习中,借鉴一下,谢谢
回复

使用道具 举报

5#
ID:24486 发表于 2020-3-21 11:20 | 只看该作者
借鉴一下,谢谢分享。
回复

使用道具 举报

6#
ID:516928 发表于 2022-3-18 23:05 | 只看该作者
楼主可提原理图给我?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表