4X4行列式矩阵键盘驱动

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()); }

}


相关文章

  • 电子琴课程设计 1
  • 四川师范大学成都学院电子工程学院 电子技术课程设计 电子琴 学生姓名 学 号 所在学院 专业名称 班 级 指导教师 成 绩 刘子仪 2013137052 电子工程学院 汽车服务工程 2013级 苏 清 茂 四川师范大学成都学院 二○一五年十 ...查看


  • 基于单片机的电子密码锁及程序
  • 基于单片机的电子密码锁设计 摘要 随着科技和人们的生活水平的提高,如何实现家庭防盗这一问题也变的尤为突出,传统的机械锁由于构造简单,被撬事件屡见不鲜.电子密码锁保密性好,使用灵活性高,收到广大用户的青睐. 本设计是以单片机AT89C52作为 ...查看


  • 基于51单片机的简易电子琴设计
  • 青岛黄海职业学院 本 科 毕 业 论 题 目:基于单片机的灯光电子琴设计 学 院:物理与电子信息学院 专 业:电子信息技术与科学 年 级:08电子二班 姓 名: 张志丹 指导教师: 增实现 完成日期: 2011-10-25 文 内蒙古民族大 ...查看


  • 4×4行列式键盘控制电路设计
  • [摘要]设计一个基于单片机的4×4行列式键盘,能够实现的功能是:确定有无键按下,判断哪一个键按下,键的功能是什么:还要消除按键在闭合或断开时的抖动.两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈 ...查看


  • 基于单片机的无线遥控系统
  • 一. 设计要求 (一)基本功能 1. 有效遥控距离大于50米,可穿透一定的建筑物等. 2. 遥控控制的路数在10路以上. 3. 采用数码管显示当前工作的控制电路. (二)扩展功能 1.通过遥控器可以任意设置用户密码(1-16位长度),只有合 ...查看


  • 减速器箱体液压夹具的设计
  • 摘 要 车库门全自动门控装置,其特征在于设有置于车库内和车库外的主控制器以及安装在车辆内的密码标识器,主控制器由单片机.315M无线接收器.解码器.键盘和红外对管组成,密码标识器由无线发射器和编码器.PT2262与PT2272地址和数据状态 ...查看


  • 智能门禁系统毕业论文
  • 智能门禁系统毕业论文 智能门禁系统的研究与设计 摘要:门禁系统是生活不可或缺的保障设施,由此提出了基于51单片机的多功能电子门禁系统.系统研究了电子密码锁技术,LCD 显示技术,串口通信技术,51单片机及时钟和温度读取方法.介绍了电子门禁系 ...查看


  • 单片机电子密码锁设计
  • 毕 业设 计(论 文)单片机电子密码锁设计系 别: 专 业 名 称: 学 生 姓 名: 学 号: 指导教师姓名.职称: 指导教师姓名.职称:自动化工程系完成日期2009 年5 月 6 日 电子科技大学中山学院毕业设计(论文)任务书系 专 别 ...查看


  • 51单片机电子密码锁
  • 中北大学信息商务学院 课 程 设 计 说 明 书 学生姓名: 郑晓峰 学 号: 10050644X22 学生姓名: 梁一才 学 号: 10050644X30 学生姓名: 李 功 学 号: 10050644X32 学 院: 信息与通信工程 专 ...查看


热门内容