计数器(状态机按键检测)程序
KeyValue = (~KEY_PORT) & KEY_MASK;
switch(KeyStatus)
{
case KEY_SEARCH_STATUS: //按键查询状态
{
if(KeyValue)
{
KeyStatus = KEY_ACK_STATUS; //按键下一个状态为确认状态
}
return 0;
}
break;
case KEY_ACK_STATUS: //按键确认状态
{
if(!KeyValue)
{
KeyStatus = KEY_SEARCH_STATUS;
}
else
{
for(i=0;i<4;i++)
{
if(KeyValue&(1{
KeyCurPress = KEY1 + i;
break;
}
}
KeyStatus = KEY_REALEASE_STATUS;
}
return 0;
}
break;
case KEY_REALEASE_STATUS: //按键释放状态
{
if(!KeyValue)
{
KeyStatus = KEY_SEARCH_STATUS;
return KeyCurPress;
}
return 0;
}
default:
return 0;
break;
}
}
/**********************************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主题
***********************************************************/
void main(void)
{
PortInit();
TimerInit();
Timer0Start();
SegRefreshDisplayBuf();
EA = 1;
while(1)
{
SegRefreshDisplayBuf();
if(Timer0IRQEvent)
{
Timer0IRQEvent = 0;
switch(KeyRead())
{
case KEY1:
{
bSetTime = ~bSetTime;
SegCurPosMark = 0;
}
break;
case KEY2:
{
if(++SegCurPosMark>=4)
{
SegCurPosMark = 0;
}
}
break;
case KEY3:
{
if(!bSetTime)
break;
if(CounterValue>=9999)
CounterValue = 0;
if (SegCurPosMark == 0)
CounterValue += 1;
else if(SegCurPosMark == 1)
CounterValue += 10;
else if(SegCurPosMark == 2)
CounterValue += 100;
else
CounterValue += 1000;
}
break;
case KEY4:
{
if(!bSetTime)
break;
if(CounterValue<=0)
CounterValue = 9999;
if (SegCurPosMark == 0)
CounterValue -= 1;
else if(SegCurPosMark == 1)
CounterValue -= 10;
else if(SegCurPosMark == 2)
CounterValue -= 100;
else
CounterValue -= 1000;
}
break;
default:
break;
}
}
else if(Time1SecEvent)
{
Time1SecEvent = 0;
if(!bSetTime)
{
if(++CounterValue>=9999)
{
CounterValue = 0;
}
}
}
}
}
/**********************************************************
*函数名称:Timer0IRQ
*输 入:无
*输 出:无
*功 能:定时器中断函数
***********************************************************/
void Timer0IRQ(void) interrupt 1
{
TH0 = (65536 - TIMER0_INITIAL_VALUE)/256;
TL0 = (65536 - TIMER0_INITIAL_VALUE)%256;
Timer0IRQEvent = 1;
SegDisplay();
if(++TimeCount >= 200)
{
TimeCount = 0;
Time1SecEvent = 1;
}
}
计数器状态机按键检 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)