4X4行列式矩阵键盘驱动(C51)
作者:POWER 来源:斯凯科技 点击数:
37 更新时间:2007年02月06日
/********************************************************************************************
* 文 件 名:test024.c
* 功 能:4*4行列式键盘驱动。
* 硬件条件:1.CPU型号:AT89S52
* 2.晶振:12.000MHz
* 3.用跳线帽短接BEEP_P1.3
* 4.用杜绑线将4*4行列式键盘模块与开发板的P2口相连,连接关系如下: * ============================================================== * ARMSKY-51Easy教学实验开发板 4*4行列式键盘模块 *
* P2.7 row1 * P2.6 row2 * P2.5 row3 * P2.4 row4 * P2.3 col1 * P2.2 col2 * P2.1 col3 * P2.0 col4 * +5V VCC
* GND GND
* ============================================================== * 注意:用户可根据自己的情况,选择ARMSKY-51Easy教学实验开发板上 * 的其他引脚与4*4行列式键盘模块相连。
*
* 作 者:POWER
* 日 期:2006年12月12号
* 斯凯科技主页:www.armsky.net
* 斯凯科技论坛:www.armsky.net/bbs
*********************************************************************************************/
#include "reg52.h" // 包含头文件
/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char uint8; // 无符号8位整型变量 typedef signed char int8; // 有符号8位整型变量 typedef unsigned short uint16; // 无符号16位整型变量 typedef signed short int16; // 有符号16位整型变量 typedef unsigned int uint32; // 无符号32位整型变量 typedef signed int int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度) typedef double fp64; // 双精度浮点数(64位长度) /********************************************************************************************/
/* 定义位变量 */
sbit P1_3 = P1 ^ 3; sbit row1 = P2 ^ 7;
sbit row2 = P2 ^ 6;
sbit row3 = P2 ^ 5;
sbit row4 = P2 ^ 4;
sbit col1 = P2 ^ 3;
sbit col2 = P2 ^ 2;
sbit col3 = P2 ^ 1;
sbit col4 = P2 ^ 0;
#define BEEP_ON() (P1_3=0) // 定义"BEEP_ON()"为P1.3输出低电平,控制蜂鸣器蜂鸣
#define BEEP_OFF() (P1_3=1) // 定义"BEEP_OFF()"为P1.3输出高电平,控制蜂鸣器不蜂鸣
/********************************************************************************************
* 函数名称:Delay()
* 功 能:软件延时
* 入口参数:count 延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0; i
} // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}
/********************************************************************************************
* 函数名称:BeepCount()
* 功 能:蜂鸣器按指定次数缝鸣
* 入口参数:count
* 出口参数:无
*********************************************************************************************/
void BeepCount(uint8 count)
{
for(;count>0;count--)
{
BEEP_ON(); Delay(120);
BEEP_OFF();Delay(120);
}
}
/********************************************************************************************
* 函数名称:KeyDown()
* 功 能:检测键盘是否按下
* 入口参数:无
* 出口参数:返回1表示键盘按下,返回0表示键盘未按下
* 注 意:该函数有消抖功能
*********************************************************************************************/
uint8 KeyDown(void)
{
col1=0; col2=0; col3=0; col4=0; // 列线全部置低
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 若有任一行线读回
状态为低
{
Delay(80); // 延时消抖
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 再次读行线状态,若有任一行线读回状态为低
return 1; // 返回1,表明有键盘按下
else
return 0; // 返回0,表明无键盘按下
}
else
return 0;
}
/********************************************************************************************
* 函数名称:KeyUp()
* 功 能:检测键盘是否弹起
* 入口参数:无
* 出口参数:返回1表示键盘弹起,返回0表示键盘未弹起
* 注 意:该函数有消抖功能
*********************************************************************************************/
uint8 KeyUp(void)
{
col1=0; col2=0; col3=0; col4=0; // 列线全部置低 if((row1==1) && (row2==1) && (row3==1) && (row4==1)) // 若全部行线读回状态都为高
{
Delay(80); // 延时消抖
if((row1==1) && (row2==1) && (row3==1) && (row4==1)) // 再次读行线状态,若全部行线读回状态都为高
return 1; // 返回1,表明所有键盘都处于弹起状态
else
return 0; // 返回0,表明有键盘处于按下状态
}
else
return 0;
}
/********************************************************************************************
* 函数名称:KeyNum()
* 功 能:检测用户按下的键盘所对应的键盘号
* 入口参数:无
* 出口参数:返回0表示没有键盘被按动,返回1~16对应被按动的键盘
* 说 明:用户可根据自己的键盘编号修改该函数。
*********************************************************************************************/
uint8 KeyNum(void)
{
uint8 KeyTemp;
KeyTemp=0;
if(KeyDown()==1) // 若键盘被按下 {
col1=0; col2=1; col3=1; col4=1; // 将列线1置低,其他列线置高
if (row1==0) KeyTemp=1; // 若行线1读回状态为低,则表明按键1被按下 if (row2==0) KeyTemp=5; // 若行线2读回状态为低,则表明按键5被按下
if (row3==0) KeyTemp=9; // 若行线3读回状态为低,则表明按键9被按下 if (row4==0) KeyTemp=13; // 若行线4读回状态为低,则表明按键13被按下
col1=1; col2=0; col3=1; col4=1; //
if (row1==0) KeyTemp=2; //
为低,则表明按键2被按下
if (row2==0) KeyTemp=6; //
低,则表明按键6被按下
if (row3==0) KeyTemp=10; //
明按键10被按下
if (row4==0) KeyTemp=14; //
被按下
col1=1; col2=1; col3=0; col4=1;
if (row1==0) KeyTemp=3;
if (row2==0) KeyTemp=7;
if (row3==0) KeyTemp=11;
if (row4==0) KeyTemp=15;
col1=1; col2=1; col3=1; col4=0;
if (row1==0) KeyTemp=4;
if (row2==0) KeyTemp=8; 将列线2置低,其他列线置高 若行线1读回状态若行线2读回状态为若行线3读回状态为低,则表若行线4读回状态为低,则表明按键14
if (row3==0) KeyTemp=12;
if (row4==0) KeyTemp=16;
while ( KeyUp()!=1); // 等待按下的键盘被释放
return KeyTemp; // 返回被按下并被释放的键盘的编号
}
else
return 0;
}
/********************************************************************************************
* 函数名称:main()
* 功 能:4*4行列式键盘驱动。当发现用户按下并释放键盘,则检测出相应键盘号,并控制蜂鸣器蜂鸣
* 相应次数。
*********************************************************************************************/
void main (void)
{
BEEP_OFF(); // 蜂鸣器不蜂鸣
while(1) // 死循环
{
BeepCount(KeyNum()); }
}
4X4行列式矩阵键盘驱动(C51)
作者:POWER 来源:斯凯科技 点击数:
37 更新时间:2007年02月06日
/********************************************************************************************
* 文 件 名:test024.c
* 功 能:4*4行列式键盘驱动。
* 硬件条件:1.CPU型号:AT89S52
* 2.晶振:12.000MHz
* 3.用跳线帽短接BEEP_P1.3
* 4.用杜绑线将4*4行列式键盘模块与开发板的P2口相连,连接关系如下: * ============================================================== * ARMSKY-51Easy教学实验开发板 4*4行列式键盘模块 *
* P2.7 row1 * P2.6 row2 * P2.5 row3 * P2.4 row4 * P2.3 col1 * P2.2 col2 * P2.1 col3 * P2.0 col4 * +5V VCC
* GND GND
* ============================================================== * 注意:用户可根据自己的情况,选择ARMSKY-51Easy教学实验开发板上 * 的其他引脚与4*4行列式键盘模块相连。
*
* 作 者:POWER
* 日 期:2006年12月12号
* 斯凯科技主页:www.armsky.net
* 斯凯科技论坛:www.armsky.net/bbs
*********************************************************************************************/
#include "reg52.h" // 包含头文件
/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char uint8; // 无符号8位整型变量 typedef signed char int8; // 有符号8位整型变量 typedef unsigned short uint16; // 无符号16位整型变量 typedef signed short int16; // 有符号16位整型变量 typedef unsigned int uint32; // 无符号32位整型变量 typedef signed int int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度) typedef double fp64; // 双精度浮点数(64位长度) /********************************************************************************************/
/* 定义位变量 */
sbit P1_3 = P1 ^ 3; sbit row1 = P2 ^ 7;
sbit row2 = P2 ^ 6;
sbit row3 = P2 ^ 5;
sbit row4 = P2 ^ 4;
sbit col1 = P2 ^ 3;
sbit col2 = P2 ^ 2;
sbit col3 = P2 ^ 1;
sbit col4 = P2 ^ 0;
#define BEEP_ON() (P1_3=0) // 定义"BEEP_ON()"为P1.3输出低电平,控制蜂鸣器蜂鸣
#define BEEP_OFF() (P1_3=1) // 定义"BEEP_OFF()"为P1.3输出高电平,控制蜂鸣器不蜂鸣
/********************************************************************************************
* 函数名称:Delay()
* 功 能:软件延时
* 入口参数:count 延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0; i
} // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}
/********************************************************************************************
* 函数名称:BeepCount()
* 功 能:蜂鸣器按指定次数缝鸣
* 入口参数:count
* 出口参数:无
*********************************************************************************************/
void BeepCount(uint8 count)
{
for(;count>0;count--)
{
BEEP_ON(); Delay(120);
BEEP_OFF();Delay(120);
}
}
/********************************************************************************************
* 函数名称:KeyDown()
* 功 能:检测键盘是否按下
* 入口参数:无
* 出口参数:返回1表示键盘按下,返回0表示键盘未按下
* 注 意:该函数有消抖功能
*********************************************************************************************/
uint8 KeyDown(void)
{
col1=0; col2=0; col3=0; col4=0; // 列线全部置低
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 若有任一行线读回
状态为低
{
Delay(80); // 延时消抖
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 再次读行线状态,若有任一行线读回状态为低
return 1; // 返回1,表明有键盘按下
else
return 0; // 返回0,表明无键盘按下
}
else
return 0;
}
/********************************************************************************************
* 函数名称:KeyUp()
* 功 能:检测键盘是否弹起
* 入口参数:无
* 出口参数:返回1表示键盘弹起,返回0表示键盘未弹起
* 注 意:该函数有消抖功能
*********************************************************************************************/
uint8 KeyUp(void)
{
col1=0; col2=0; col3=0; col4=0; // 列线全部置低 if((row1==1) && (row2==1) && (row3==1) && (row4==1)) // 若全部行线读回状态都为高
{
Delay(80); // 延时消抖
if((row1==1) && (row2==1) && (row3==1) && (row4==1)) // 再次读行线状态,若全部行线读回状态都为高
return 1; // 返回1,表明所有键盘都处于弹起状态
else
return 0; // 返回0,表明有键盘处于按下状态
}
else
return 0;
}
/********************************************************************************************
* 函数名称:KeyNum()
* 功 能:检测用户按下的键盘所对应的键盘号
* 入口参数:无
* 出口参数:返回0表示没有键盘被按动,返回1~16对应被按动的键盘
* 说 明:用户可根据自己的键盘编号修改该函数。
*********************************************************************************************/
uint8 KeyNum(void)
{
uint8 KeyTemp;
KeyTemp=0;
if(KeyDown()==1) // 若键盘被按下 {
col1=0; col2=1; col3=1; col4=1; // 将列线1置低,其他列线置高
if (row1==0) KeyTemp=1; // 若行线1读回状态为低,则表明按键1被按下 if (row2==0) KeyTemp=5; // 若行线2读回状态为低,则表明按键5被按下
if (row3==0) KeyTemp=9; // 若行线3读回状态为低,则表明按键9被按下 if (row4==0) KeyTemp=13; // 若行线4读回状态为低,则表明按键13被按下
col1=1; col2=0; col3=1; col4=1; //
if (row1==0) KeyTemp=2; //
为低,则表明按键2被按下
if (row2==0) KeyTemp=6; //
低,则表明按键6被按下
if (row3==0) KeyTemp=10; //
明按键10被按下
if (row4==0) KeyTemp=14; //
被按下
col1=1; col2=1; col3=0; col4=1;
if (row1==0) KeyTemp=3;
if (row2==0) KeyTemp=7;
if (row3==0) KeyTemp=11;
if (row4==0) KeyTemp=15;
col1=1; col2=1; col3=1; col4=0;
if (row1==0) KeyTemp=4;
if (row2==0) KeyTemp=8; 将列线2置低,其他列线置高 若行线1读回状态若行线2读回状态为若行线3读回状态为低,则表若行线4读回状态为低,则表明按键14
if (row3==0) KeyTemp=12;
if (row4==0) KeyTemp=16;
while ( KeyUp()!=1); // 等待按下的键盘被释放
return KeyTemp; // 返回被按下并被释放的键盘的编号
}
else
return 0;
}
/********************************************************************************************
* 函数名称:main()
* 功 能:4*4行列式键盘驱动。当发现用户按下并释放键盘,则检测出相应键盘号,并控制蜂鸣器蜂鸣
* 相应次数。
*********************************************************************************************/
void main (void)
{
BEEP_OFF(); // 蜂鸣器不蜂鸣
while(1) // 死循环
{
BeepCount(KeyNum()); }
}