状态图编程法扫描按键

状态图编程法。
代码
1.	/****************************************************************************************   
2.	如果采用晶体为12MHz时,指令周期为1us(即主频为1MHz),要产生20ms左右的计时,则计数值达到20000,T0工作必须为定时器方式1,16位非自动重载,即可产生20ms的周期性中断,在中断服务程序中实现按键扫描   
3.	*****************************************************************************************/   
4.	#include <at89x52.h>    
5.	#include “KEY.H”    
6.	void main( void )    
7.	{     
8.	TMOD = (TMOD & 0xf0 ) | 0x01; //不改变T1的工作方式,T0为定时器方式1    
9.	TL0 = -20000;     //计数周期为20000个主频脉,自动取低8位    
10.	TH0 = (-20000)>>8;    //右移8位,实际上是取高8位    
11.	TR0=1;      //允许T0开始计数    
12.	ET0=1;      //允许T0计数溢出时产生中断请求    
13.	EA=1;      //允许CPU响应中断请求    
14.	while( 1 ) //永远为真,即死循环    
15.	 {    
16.	if( keyHit() != 0 ) //如果队列中有按键    
17.	P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上    
18.	 }    
19.	}    
20.	void timer0int( void ) interrupt 1 //20ms;T0的中断号为1    
21.	{ static unsigned char sts=0;    
22.	TL0 = -20000;     //方式1为软件重载    
23.	TH0 = (-20000)>>8;    //右移8位,实际上是取高8位    
24.	 P1_0 = 1;  //作为输入引脚,必须先输出高电平    
25.	switch( sts )    
26.	 {    
27.	  case 0: if( P1_0==0 ) sts=1; break; //按键则转入状态1    
28.	  case 1:    
29.	if( P1_0==1 ) sts=0;  //假按错,或干扰,回状态0    
30.	else{ sts=2; keyPut( 6 ); } //确实按键,键值入队列,并转状态2    
31.	break;    
32.	  case 2: if( P1_0==1 ) sts=3; break; //如果松键,则转状态3    
33.	  case 3:    
34.	   if( P1_0==0 ) sts=2;  //假松键,回状态2    
35.	   else sts=0;    //真松键,回状态0,等待下一次按键过程     
36.	 }    
37.	}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值