经典4*4矩阵键盘C51程序

【经典4*4矩阵键盘C51程序】/**************************
文件所用资源
1.端口:P2
2.调用delay_ms函数
**************************/
#include
#include
#define key_port P2//键盘接口定义
sbitkey_port_0=key_port^0;
sbitkey_port_1=key_port^1;
sbitkey_port_2=key_port^2;
sbitkey_port_3=key_port^3;
/**************************
延时函数
***************************/
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for( i=0;ifor(j=0;j<332;j++); //332是STC89C52在22.1184MHz晶振
}


/**************************
键盘扫描函数
**************************/
unsigned char keyscan(void)
{
unsigned char key,i;
unsigned char code key_table[16]=
{0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
//扫描端口数据与键值的对应关系,可以根据使用来调节顺序
key_port=0x0f; //确定行列位置
if(key_port==0x0f)return(0x10);//无键按下返回0
delay_ms(10); //调用延时函数,目的是去前沿键抖 。
if(key_port==0x0f)return(0x10);//再次判断 。目的是确保检测正确
else
{
for(i=0;i<4;i++) //以下为经典的计算键值(判断闭合键所在的位置)
{
key_port=_cror_(0x7f,i);
if(key_port_0==0)break;
if(key_port_1==0)break;
if(key_port_2==0)break;
if(key_port_3==0)break;
}
key=key_port; //取得键值
for(;key_port!=0x0f;key_port=0x0f);//等待键松开,目的是去后沿键抖
for(i=0;key_table[i]!=key && i<16;i++);//查表取key的值0-F
key=i;
return(key); //带键值返回主调函数
}
}


    推荐阅读