|
/**************************************************************************
* p1.3 p1.2 p1.1 p1.0
* -----|----|----|----|-------p1.4
* -----|----|----|----|-------p1.5
* -----|----|----|----|-------p1.6
* -----|----|----|----|-------p1.7
* | | | |
*
* 键值排列:
* 15 14 13 12
* 11 10 9 8
* 7 6 5 4
* 3 2 1 0
****************************************************************************/
#define uchar unsigned char
#include <intrins.h>
uchar KeyScan()
{
uchar row = 0; //将行号置0
uchar col = 0; //将列号置0
uchar mask = 0x7f;
uchar pic = 0;
uchar key0 = 255;
uchar Shift_Count = 0;
uchar code Key_value[]={ 0,1,2,3,5,6,7,8,9,10,
11,12,13,14,15,16};
/* 抖动返回200,无键按下返回255 */
P1 &= 0x0f;
if (( P1 & 0x0f ) == 0x0f ) {key0 = 255; return (key0);}
Delay(50); //延时25mS去抖动
if (( P1 & 0x0f ) == 0x0f ) {key0 = 200; return (key0);}
/* 有键按下,则分析键所在的列号 */
P1 = mask;
while (( P1 & 0x0f ) == 0x0f && Shift_Count<3 )
{
++col; ++Shift_Count;
mask = _cror_(mask,1); //右移动一位
P1 = mask;
}
/* 有键按下,则分析键所在的行号 */
pic = P1 &0x0f;
mask = 0x01;
while ( pic & mask )
{
++row;
mask = _crol_(mask,1); //左移一位
}
/* 得到键值 */
pic = row * 4 + col;
key0 = Key_value[pic];
return (key0);
}
/************************************************************
* 函数功能: 延时程序 0.5mS
* input: i
* output: NULL
* mcu: p89c51
* frequency: 11.0592M Hz
* period: f/6
************************************************************/
void Delay(uint i)
{
uchar j;
while(i--)
{for(j=0;j<125;j++);}
}
|
|