|
这里我写了一个程序,跟你的电路差别不大,你自己看看再修改一下吧
[code]
/***************************************************************************************
*
*函数功能:4*4矩阵键盘扫描--行扫描法
*功能描述:有键按下键码返回为keycode[i *4 + j],没有键按下则返回-1,按键没有松开也返回-1
*内部变量:i--行值,j--列值,VALUE--键盘读入数据,null--连击标志
*输入参数:无
*输出参数:keycode[i *4 + j]
*
**************************************************************************************/
#include "stc.h"
#include "stdio.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define key_interface XBYTE[0x6000]//键盘接口
unsigned char code keycode[16] = { 0x01,0x02,0x03,0x0f,//自定义键盘编码
0x04,0x05,0x06,0x0e,
0x07,0x08,0x09,0x0d,
0x0a,0x00,0x0b,0x0c};
//键盘扫描函数------行列反转法-------//
uchar keyboard(void)
{
unsigned char i,j,VALUE;//行扫描值,列扫描值,键值
static bit null = 0;//连击标志
for(i = 0;i < 4;i ++)
{
key_interface = 0xf7 >> i;//输出扫描行
if((VALUE = key_interface & 0xf0) != 0xf0)break;//读入扫描列
}
if((~VALUE & 0xf0) == 0)//没有按键按下返回 -1,同时清除连击标志位
{
null = 0;
return(-1);
}
if(null == 1)return(-1);//按键被连击,返回 -1
for(j = 0;j < 4;j ++)
if(((VALUE << j) & 0x80) == 0)break;
null = 1;//有键盘被按下,确定连击标志
return(keycode[i * 4 + j]);//返回按键编码
}
void delay_key(void)
{
int i;
for(i = 0;i < 250;i ++);
}
char scanf(void)
{
uchar get_char;
char gnull;
get_char = keyboard();
if(get_char == -1)return(-1);
else
{
delay_key();
gnull = keyboard();
if((gnull == -1) && (get_char != -1))return(get_char);
else
return(-1);
}
}
|
|