杭州电子科技大学
实验报告
课程名称:嵌入式系统原理课程设计 姓名: 应海东
实验项目: 矩阵键盘驱动、看门狗实验 班级: 10052313
指导教师:任彧 学号: 10051329
日期: 2012.11.27
第二篇:矩阵键盘驱动
/********************************************************************************************* 文 件 名: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* 日 期:20xx年12月12号* 斯凯科技主页:* 斯凯科技论坛:/bbs*********************************************************************************************//********************************************************************************************/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 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 < 125; i++); // ";" 表示空语句,CPU空转。} // 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,表明有键盘按下elsereturn 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,表明所有键盘
都处于弹起状态elsereturn 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; // 将列线2置低,其他列线置高if (row1==0) KeyTemp=2; // 若行线1读回状态为低,则表明按键2被按下if (row2==0) KeyTemp=6; // 若行线2读回状态为低,则表明按键6被按下if (row3==0) KeyTemp=10; // 若行线3读回状态为低,则表明按键10被按下if (row4==0) KeyTemp=14; // 若行线4读回状态为低,则表明按键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; if (row3==0) KeyTemp=12; if (row4==0) KeyTemp=16;while ( KeyUp()!=1); // 等待按下的键盘被释放return KeyTemp; // 返回被按下并被释放的键盘的编号 }elsereturn 0;}