状态图编程法。 代码 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. }
状态图编程法扫描按键
最新推荐文章于 2024-04-08 18:31:00 发布