// 简单描述 : 本文件是行列扫描法实现矩阵按键扫描程序
/* ***************************************************** */
#include 《reg52.h》
/* ***************************************************** */
// 宏定义
/* ***************************************************** */
#define uInt16 unsigned int
#define uChar8 unsigned char
#define DATA P0 //数据口
#define KEYPORT P3 //键盘接入端口
/* ***************************************************** */
// 位定义
/* ***************************************************** */
sbit SEG_SELECT = P1^7; //段选控制端
sbit BIT_SELECT = P1^6; //位选控制端
/* ***************************************************** */
// 数组定义
/* ***************************************************** */
uChar8 code SEG_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//段选显示表格
/* ***************************************************** */
// 全局变量定义
/* ***************************************************** */
uChar8 g_ucKeyNum = 16; //键值
/* ***************************************************** */
// 函数名称:MelayMS()
// 函数功能:毫秒延时
// 入口参数:延时毫秒数(ValMS)
// 出口参数:无
/* ***************************************************** */
void DelayMS(uInt16 ValMS)
{
uInt16 uiVal,ujVal;
for(uiVal = 0; uiVal 《 ValMS; uiVal++)
for(ujVal = 0; ujVal 《 121; ujVal++);
}
/* ***************************************************** */
// 函数名称:ScanKey()
// 函数功能:矩阵按键扫描
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void ScanKey(void)
{
uChar8 ucTemp;
KEYPORT = 0xfe; //检测第一行
ucTemp = KEYPORT; //读取键盘端口数值
if(ucTemp != 0xfe) //若是不等于0xF0表示有按键按下
{
DelayMS(5); //去抖
ucTemp = KEYPORT; //读端口值
if(ucTemp != 0xfe) //再次判断
{
ucTemp = KEYPORT; //取键值
switch(ucTemp) //判断键值对应键码
{
case 0xee:g_ucKeyNum = 0;break;
case 0xde:g_ucKeyNum = 1;break;
case 0xbe:g_ucKeyNum = 2;break;
case 0x7e:g_ucKeyNum = 3;break;
}
while(KEYPORT != 0xfe); //按键释放检测
}
}
KEYPORT = 0xfd;
ucTemp = KEYPORT;
if(ucTemp != 0xfd)
{
DelayMS(5);
ucTemp = KEYPORT;
if(ucTemp != 0xfd)
{
ucTemp = KEYPORT;
switch(ucTemp)
{
case 0xed:g_ucKeyNum = 4;break;
case 0xdd:g_ucKeyNum = 5;break;
case 0xbd:g_ucKeyNum = 6;break;
case 0x7d:g_ucKeyNum = 7;break;
}
while(KEYPORT != 0xfd);
}
}
KEYPORT = 0xfb;
ucTemp = KEYPORT;
if(ucTemp != 0xfb)
{
DelayMS(5);
ucTemp = KEYPORT;
if(ucTemp != 0xfb)
{
ucTemp = KEYPORT;
switch(ucTemp)
{
case 0xeb:g_ucKeyNum = 8;break;
case 0xdb:g_ucKeyNum = 9;break;
case 0xbb:g_ucKeyNum = 10;break;
case 0x7b:g_ucKeyNum = 11;break;
}
while(KEYPORT != 0xfb);
}
}
KEYPORT = 0xf7;
ucTemp = KEYPORT;
if(ucTemp != 0xf7)
{
DelayMS(5);
ucTemp = KEYPORT;
if(ucTemp != 0xf7)
{
ucTemp = KEYPORT;
switch(ucTemp)
{
case 0xe7:g_ucKeyNum = 12;break;
case 0xd7:g_ucKeyNum = 13;break;
case 0xb7:g_ucKeyNum = 14;break;
case 0x77:g_ucKeyNum = 15;break;
}
while(KEYPORT != 0xf7);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部6条评论
快来发表一下你的评论吧 !