本帖最后由 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 上传
点击文件名下载附件
状态机时钟
你是想按键按住连接加吗?
一周热门 更多>