4X4键盘C语言

1 单片机程序
#ifndef _SIGNALGEN_H // 防止SignalGen.h被重复引用

#define _SIGNALGEN_H

#include <reg52.h> // 引用标准库的头文件

#define uchar unsigned char

uchar key; // 按键值

sbit A0 = P2^0; // MAX038的波形选择位A0
sbit A1 = P2^1; // MAX038的波形选择位A1

void delay();
uchar keyscan();

#endif

/* 用于键消抖的延时函数 */
void delay()
{
uchar i;
for (i=400;i>0;i--);
}

/* 键扫描函数 */
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0; // 发全0行扫描码
if ((P1&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
P1 = scancode; // 输出行扫描码
if ((P1&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (P1&0xf0)|0x0f;

/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}

/* 主程序 */
void main()
{
uchar key;

while(1)
{
key = keyscan(); // 调用键盘扫描函数

delay();

switch(key)
{
case 0x11: // 第1行第1列,选择正弦波输出
A0 = 0;
A1 = 1;
break;
case 0x21: // 第1行第2列,选择矩形波输出
A0 = 0;
A1 = 0;
break;
case 0x41: // 第1行第3列,选择三角波输出
A0 = 1;
A1 = 0;
break;
default:break;
}
}
}

给一段我写的4X4矩阵键盘包括 0-9, + - ON/C X % = 等等,调试完成的,返回键值,管脚 P1.0-P1.3为列,P1.4-1.7为行
,管脚 延时函数 修改下可以直接调用
unsigned char KeyScan()
{

unsigned char cord,keyValue;

cord = 0xFF;

P1=0xFE;

if((P1&0xf0)!=0xf0)
{
DelayXms(5);
if((P1&0xf0)!=0xf0) //消除键盘抖动 延时10ms
{
cord=P1;
}
}
P1=0xff;
P1_1 =0;

if((P1&0xf0)!=0xf0)
{
DelayXms(5);
if((P1&0xf0)!=0xf0) //消除键盘抖动 延时10ms
{
cord=P1;
}
}

P1=0xff;
P1_2 =0;

if((P1&0xf0)!=0xf0)
{
DelayXms(5);
if((P1&0xf0)!=0xf0) //消除键盘抖动 延时10ms
{
cord=P1;
}
}
P1=0xff;
P1_3 =0;

if((P1&0xf0)!=0xf0)
{
DelayXms(5);
if((P1&0xf0)!=0xf0) //消除键盘抖动 延时10ms
{
cord=P1;
}
}
P1=0xf0;
while(P1!=0xf0); //等待按键释放

switch(cord)
{
case 0xee: keyValue=7;break;//7 P1.0-P1.3为列,P1.4-1.7为行
case 0xed: keyValue=8;break;//8
case 0xeb: keyValue=9;break;//9
case 0xe7: keyValue=11;break;// %

case 0xde: keyValue=4;break;//4
case 0xdd: keyValue=5;break;//5
case 0xdb: keyValue=6;break;//6
case 0xd7: keyValue=12;break;//X

case 0xbe: keyValue=1;break;//1
case 0xbd: keyValue=2;break;//2
case 0xbb: keyValue=3;break;//3
case 0xb7: keyValue=13;break;// -

case 0x7e: keyValue=14;break;//ON/C
case 0x7d: keyValue=0;break;//0
case 0x7b: keyValue=15;break;//=
case 0x77: keyValue=16;break;//+
default: keyValue = 0xff;
}
return keyValue;
}
}
return keyValue;
}
温馨提示:答案为网友推荐,仅供参考
相似回答