51单片机按键 问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 17:01:30
/********************************************************************
* 文件名 : 矩阵键盘.c
* 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后两位来显示当前的按键值。
*********************************************************************/
#include <reg51.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j <i;j++)
for(x=0;x <=148;x++);
}

/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。

写了些说明,不见得对。

uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环四次
P1 = Buffer[j]; //在P1高四位分别输出一个低电平

temp = 0x01; //计划先读出P1.0位

for(i = 0; i < 4; i++) { //循环四次
if(!(P1 & temp)) { //从P1低四位,截取1位
return (i + j * 4); //返回取得的按键值
}
temp <<= 1; //换左边一位
}
}
}

if(!(P1&temp))
的作用只是检测高四位中左移的低电平是否拉低了低四位的高电平