第一次用模块化,状态机的按键程序搞不好,高手帮我看看.

2020-01-25 15:28发布

本帖最后由 4758866 于 2013-12-13 21:23 编辑

#include <REGX52.H>
#define key_state_0        0 //初始
#define key_state_1        1 //按下
#define key_state_2        2 //释放
sbit key_1=P3^4;
sbit key_2=P3^5;
sbit key_3=P3^6;
sbit key_4=P3^7;
void read_key( )
{
  unsigned char aa,bb,cc,dd,s2a,fun;
  static unsigned char key_state=0;
  switch (key_state)
{
  case key_state_0:  // 按键初始态
  if (!key_1||!key_2||!key_3||!key_4)
  key_state=key_state_1;// 键被按下,状态转换到键确认态
  break;
  case key_state_1: // 按键确认态
  if(!key_1||!key_2||!key_3||!key_4)
{
    if(!key_1)//功能键.0:时钟运行1:时钟调整
        {
       fun++;
        if(fun>=2)
           fun=0;
                   }
    if(!key_2)//时分切换键.0:分钟调整1:小时调整
{
     s2a++;
     if(s2a>=2)
     s2a=0;
}
    if(!key_3)//向上调整键
{
    if((fun==1)&&(s2a==0))//时钟分加
    {
            Write1302(WRITE_PROTECT,0X00);
              fen++;
     if(fen==60)
        fen=0;
          
            }
     if((fun==1)&&(s2a==1))//时钟时加
     {
          Write1302(WRITE_PROTECT,0X00);
      shi++;
      if(shi==24)
      shi=0;
                 }
                                  }
       if(!key_4)//向下调整键
{
      if((fun==1)&&(s2a==0))//时钟分减
{
         Write1302(WRITE_PROTECT,0X00);
     if(fen==0)
     fen=0x60;
         fen--;
                  }
     if((fun==1)&&(s2a==1))//时钟时减
{          
          Write1302(WRITE_PROTECT,0X00);
      if(shi==0)
      shi=0x24;
          shi--;
              }
                                    }
         Write1302(WRITE_PROTECT,0X00);
     aa=fen/10;//进制转换
     bb=fen%10;
     aa<<=4;
     fen=aa+bb;
     Write1302(WRITE_MINUTE,fen);//写入分数据
     cc=shi/10;
     dd=shi%10;
     cc<<=4;
     shi=cc+dd;     
     Write1302(WRITE_HOUR,shi);//写入时数据
     Write1302(WRITE_PROTECT,0x80);//写保护
     key_state=key_state_2;// 状态转换到键释放态 ;       
                       }                  
     else
     key_state=key_state_0;// 按键已抬起,转换到按键初始态
     break;
     case key_state_2:
     if(key_1&&key_2&&key_3&&key_4)
     key_state=key_state_0;//按键已释放,转换到按键初始态
     break;
}
}
void timer2() interrupt 3//定时器0中断程序
{
    TH1=0xD8;//装初值
    TL1=0x3B;//装初值
    read_key();
}
附件在这里包含了仿真文件 状态机时钟.rar (84.66 KB, 下载次数: 12) 2013-12-13 21:21 上传 点击文件名下载附件
状态机时钟
  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lusson
1楼-- · 2020-01-25 20:24
没对齐,看着难受。放弃了。
你是想按键按住连接加吗?
4758866
2楼-- · 2020-01-25 21:11
lusson 发表于 2013-12-13 20:42
没对齐,看着难受。放弃了。
你是想按键按住连接加吗?

这是一个用DS1302的时钟,附件正在上传,包含仿真文件
lusson
3楼-- · 2020-01-26 02:17
建议你定时器只置个标志。
主程序中去查这个标志再做状态机。
可以建一个KEY模块,只往外发送按键。
另外的模块接收到按键再做么地应的处理。
而不要把定时器,按键状态机,按键处理全部揉合在一起。
4758866
4楼-- · 2020-01-26 08:07
 精彩回答 2  元偷偷看……
mojinpan
5楼-- · 2020-01-26 11:41
你直接用我这个现成的吧:http://www.amobbs.com/thread-5558434-1-1.html
4758866
6楼-- · 2020-01-26 12:47
楼上的程序以我目前水平还看不懂啊

一周热门 更多>