×
单片机 > 单片机程序设计 > 详情

51单片机编程 第五节:键盘驱动

发布时间:2020-08-24 发布时间:
|
第五节:键盘驱动

指提供一些函数给任务调用,获取按键信息,或读取按键值。
定义一个头文档 ,描述可用函数,如下:

代码

1.       #ifndef _KEY_H_  //防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句   

2.       #define _KEY_H_  //只要引用过一次,即 #include ,则定义符号 _KEY_H_   

3.       unsigned char keyHit( void ); //如果按键,则返回非0,否则返回0   

4.       unsigned char keyGet( void ); //读取按键值,如果没有按键则等待到按键为止   

5.       void keyPut( unsigned char ucKeyVal ); //保存按键值ucKeyVal到按键缓冲队列末   

6.       void keyBack( unsigned char ucKeyVal ); //退回键值ucKeyVal到按键缓冲队列首   

7.       #endif  

定义函数体文档 KEY.C,如下:

代码

1.       #include “key.h”   

2.       #define KeyBufSize 16 //定义按键缓冲队列字节数   

3.       unsigned char KeyBuf[ KeyBufSize ]; //定义一个无符号字符数组作为按键缓冲队列。该队列为先进   

4.               //先出,循环存取,下标从0到 KeyBufSize-1   

5.       unsigned char KeyBufWp=0; //作为数组下标变量,记录存入位置   

6.       unsigned char KeyBufRp=0; //作为数组下标变量,记录读出位置   

7.       //如果存入位置与读出位置相同,则表明队列中无按键数据   

8.       unsigned char keyHit( void )   

9.       { if( KeyBufWp == KeyBufRp ) return( 0 ); else return( 1 ); }   

10.     

11.   unsigned char keyGet( void )   

12.   { unsigned char retVal; //暂存读出键值   

13.   while( keyHit()==0 ); //等待按键,因为函数keyHit()的返回值为 0 表示无按键   

14.   retVal = KeyBuf[ KeyBufRp ]; //从数组中读出键值   

15.   if( ++KeyBufRp >= KeyBufSize ) KeyBufRp=0; //读位置加1,超出队列则循环回初始位置   

16.    return( retVal );   

17.   }   

18.     

19.   void keyPut( unsigned char ucKeyVal )   

20.   { KeyBuf[ KeyBufWp ] = ucKeyVal; //键值存入数组   

21.    if( ++KeyBufWp >= KeyBufSize ) KeyBufWp=0;  //存入位置加1,超出队列则循环回初始位置   

22.   }   

23.   /*****************************************************************************************  

24.   由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。就如取错了信件,有必要退回一样  

25.   ******************************************************************************************/  

26.   void keyBack( unsigned char ucKeyVal )   

27.   {   

28.   /*  

29.   如果KeyBufRp=0; 减1后则为FFH,大于KeyBufSize,即从数组头退回到数组尾。或者由于干扰使得KeyBufRp超出队列位置,也要调整回到正常位置,  

30.   */  

31.    if( --KeyBufRp >= KeyBufSize ) KeyBufRp=KeyBufSize-1;    

32.   KeyBuf[ KeyBufRp ] = ucKeyVal; //回存键值   

33.   }  


下面渐进讲解键盘物理层的驱动。
电路共同点:P2端口接一共阴数码管,共阴极接GND,P2.0接a段、P2.1接b段、…、P2.7接h段。
软件共同点:code unsigned char Seg7Code[10] 是七段数码管共阴编码表。
Code unsigned char Seg7Code[16]=
// 0     1    2     3     4    5     6     7     8     9    A     b     C     d    E    F
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址