/*********************《 矩阵键盘程序 》******************************
说明: 此程序基于开发板HC151_V1.5开发,其它开发板只需修改对应引脚即可
跳线JP3:短接1-2脚
跳线JP4: 短接2-3脚
端口J9 :与对应的单片机I/O口相接,本程序为J9与P13口短接
端口J11: 与对应的单片机I/O口相接,本程序为J11分别与P2口对应短接
晶振12MHz
描述: 本程序实现 4 * 4矩阵键盘的扫描,通过数码管的最后一位来显示当前的按键值
——晖创电子制作——
*************************************************** —www.schuitron.com—*/
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E };
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j=0; j<4; j++)
{
P2 = Buffer[j];
delay();
temp = 0x01;
for(i=0; i<4; i++)
{
if(!(P2 & temp))
{
return (i+j*4);
}
temp <<= 1;
}
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar Key_Value; //读出的键值
while(1)
{
P2 = 0xf0;
if(P2 != 0xf0)
{
Delay_1ms(15);//按键消抖
if(P2 != 0xf0)
{
Key_Value = Keyscan();
if(Key_Value>0xF) Key_Value = 0;
}
}
P0 = table[Key_Value];
P1 &= 0xF7;
}
}