第3节 08C语言键盘中断模块编程实例
推荐给好友
打印
加入收藏
更新于2008-07-25 19:39:39

 本节给出与汇编程序相对应的08C语言程序,键盘中断08C工程文件组织如表8-2所示。

8.3.1 按键识别与键盘定义函数

(1) 键盘函数定义头文件
//[KB.h]键盘函数定义头文件--------------------------------------------------

#include "GP32C.h" //MCU映像寄存器名定义
#include "EnDisInt.h" //开放或禁止MCU各模块中断的宏定义
#include "Type.h" //类型别名定义

//键盘控制引脚定义
#define KB_P PTA //键盘接在PTA口上
#define KB_D DDRA //相应的方向寄存器
#define KB_PUE PTAPUE //相应的上拉电阻允许寄存器
#define ACKKBit 2 //键盘中断应答位

//函数声明
void KBInit(void); //键盘初始化
INT8U KBScan(void); //扫描读取键值
INT8U KBDef(INT8U valve); //键值转为定义值


(2) 键盘函数定义
//[KB.c]键盘函数定义-------------------------------------------------------*
//本文件包含: *
// (1)KBInit:初始化键盘控制及中断的相关寄存器 *
// (2)KBScan:扫描4*4键盘 *
// (3)KBDef:键值转为定义值 *
//硬件连接: *
// PTA7-4接键盘4根列线,PTA3-0接键盘4根行线 *
//-------------------------------------------------------------------------*

#include "KB.h" //该头文件包含键盘控制引脚定义及"KB.c"用到的相关头文件

//KBInit:键盘初始化函数----------------------------------------------------*
//功能:初始化键盘控制及中断的相关寄存器,但未开放键盘中断 *
//参数:无 *
//返回:无 *
//-------------------------------------------------------------------------*
void KBInit(void)
{
//复位相应寄存器
KB_P = 0x00;
KB_D = 0b00001111; //使列线(7-4位)为输入,使行线(3-0位)为输出
KB_PUE = 0b11110000; //输入引脚(列线)有内部上拉电阻
DisableKBInt(); //屏蔽键盘中断(IMASKK = 1)
INTKBIER = 0b11110000; //允许输入引脚的中断可进入
INTKBSCR |= (1 << ACKKBit); //清除键盘中断请求(ACKK = 1)
}

//KBScan:扫描读取键值函数--------------------------------------------------*
//功能:扫描4*4键盘,返回扫描到的键值,若无按键,返回0xff *
//参数:无 *
//返回:扫描到的键值 *
//-------------------------------------------------------------------------*
INT8U KBScan(void)
{
INT8U line,i,tmp;
line=0b11111110; //使第一根行线为0(低电平)
for (i = 1; i <= 4; i++) //最多将扫描4根行线
{
//当前扫描的一行,输出低电平
tmp = KB_P;
tmp |= 0b00001111;
KB_P = tmp & line;

asm("NOP");
asm("NOP");
//读取键盘口数据寄存器
tmp = KB_P;
//通过观察4根列线中是否出现低电平来判断当前行有无按键
tmp &= 0b11110000; //仅保留列线的值
if (tmp != 0xf0) //当前行有键按下
{
tmp=KB_P; //读取扫描到的键值
break; //退出循环不再扫描
}
else //当前行无按键,准备扫描下一行
line = (line << 1) | 0x01;
}
if (i == 5) //无按键,以后将返回0xff
tmp = 0xff;
return (tmp);
}

//KBDef:键值转为定义值函数-------------------------------------------------*
//功能:键值转为定义值 *
//参数:键值 *
//返回:键定义值 *
//-------------------------------------------------------------------------*
//键盘定义表
const INT8U KBTable[] =
{
0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
0x00
};
INT8U KBDef(INT8U valve)
{
INT8U KeyPress; //键定义值
INT8U i;
i = 0;
KeyPress = 0xff;
while (KBTable[i] != 0x00) //在键盘定义表中搜索欲转换的键值,直至表尾
{
if(KBTable[i] == valve) //在表中找到相应的键值
{
KeyPress = KBTable[i+1]; //取出对应的键定义值
break;
}
i += 2; //指向下一个键值,继续判断

}
return KeyPress;
}


8.3.2 键盘中断编程08C语言举例

(1) 键盘中断编程实例的08C主函数
//-------------------------------------------------------------------------*
//工 程 名:KeyBoard_Int.prj *
//硬件连接: *
// (1)MCU的A口接键盘(见"KB.c"文件中的说明) *
//程序描述:按下键盘按键,串口发送对应的键值 *
//目 的:键盘中断,键盘扫描,键值识别,键值转换 *
//说 明: *
//注 意:如果键盘插在实验板的上排插孔,无须连线,若插在下排 *
// 插孔,需手工接线 *
//日 期:2007.01.03 *
//--------------清华2007版《嵌入式技术基础与实践》实例----------------------*

#include "Includes.h" //总头文件

//主函数
void main()
{
DisableMCUInt(); //禁止总中断
MCUInit(); //芯片初始化
SCIInit(); //串行口初始化
KBInit(); //键盘初始化
EnableKBInt(); //开放键盘中断
EnableMCUInt(); //开放总中断
//主循环
while (1)
{
}
}

(2) 键盘中断编程实例的08C中断矢量表文件
//[Vectors08.c]中断处理函数与中断向量表------------------------------------*
//功能: *
// (1)定义中断处理子程序 *
// (2)放置中断向量表 *
//本文件包含: *
// (1)键盘中断处理函数 *
// (2)未定义的中断处理函数 *
//说明:该文件与芯片具体型号有关 *
// (1)芯片型号MC68HC908GP32 *
//-------------------------------------------------------------------------*

//头文件
#include "Type.h" //类型别名定义
#include "EnDisInt.h" //开放或禁止MCU各模块中断的宏定义
#include "SCI.h" //该头文件包含串行通信函数声明
#include "KB.h" //该头文件包含键盘模块函数声明

//isrKeyBoard:键盘中断处理函数---------------------------------------------*
//功能:识别按键并发送键值,把键值转换成对应的定义值,再从串口发送出去 *
//调用函数: *
// (1)扫描法读取键值函数(KBScan) *
// (2)键值转为定义值函数(KBDef) *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrKeyBoard
void isrKeyBoard(void)
{
INT8U valve;

DisableMCUInt(); //关总中断
DisableKBInt(); //屏蔽键盘中断

valve = KBScan(); //扫描键值,存于value中
SCISend1(valve); //发送键值
SCISend1(KBDef(valve)); //键值转化为定义值并发送

KBInit(); //键盘初始化键盘中断
EnableKBInt(); //开放键盘中断
EnableMCUInt(); //开总中断
}
//未定义的中断处理函数,本函数不能删除
#pragma interrupt_handler isrDummy
void isrDummy(void)
{
}

//中断矢量表,需定义中断函数,可修改下表中的相应项目
//(interrupt service routine,isr 中断处理程序)
#pragma abs_address:0xffdc //中断向量表起始地址
void (* const _vectab[])(void) = {
//…………省略其他未使用的中断向量定义
isrKeyBoard, //键盘中断
//…………省略其他未使用的中断向量定义
};
#pragma end_abs_address

练习题
【基础题】
1.简述键盘编程原理。
2.在本章给出的键盘编程例程中,若把扫描线接在PTB.3~PTB.0,如何编程识别键盘。

【综合题】
3.重新定义键盘,分别将“0”-“9”定义为数字0-9,不是字符“0”-“9”。
4.自行设计一个6×6键盘,仿照本章例题,给出扫描法求键值程序。
5.用键盘实现计算器的功能,显示用LCD。

<<上一节 下一节>> 

相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.