键盘中断的配置及使用(MC9S08AW60)

如果对GPIO还不是很熟的话建议先去看GPIO;链接:https://blog.csdn.net/qq_45390365/article/details/109081057
熟悉之后再来看键盘中断

前言

  • 中断指计算机CPU获知某些事,暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后再继续执行之前的程序。整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。
    在这里插入图片描述

  • AW60单片机共有8个引脚与键盘中断模块的引脚复用,分别是:PTG0、PTG1、PTG2、PTG3、PTG4、PTD2、PTD3、PTD7分别对应于键盘中断引脚KBI1P0~KBI1P7。

  • 使用键盘中断其实就是配置中断状态控制寄存器(KBI1SC)和中断引脚使能寄存器(KBI1PE)。

键盘中断状态控制寄存器(KBI1SC)

  • 中断状态控制寄存器(KBI1SC)包含了键盘中断触发方式、键盘中断标志、键盘中断应答、键盘中断使能和中断检测的功能。
数据位D7D6D5D4D3D2D1D0
KBEDG7KBEDG6KBEDG5KBEDG4KBF0KBIEKBIMOD
KBEDG7KBEDG6KBEDG5KBEDG4未定义KBACKKBIEKBIMOD
功能设置中断引脚KBIPE7的触发方式设置中断引脚KBIPE6的触发方式设置中断引脚KBIPE5的触发方式设置中断引脚KBIPE4的触发方式键盘中断标志位键盘中断应答位键盘中断使能位键盘中断检测模式
  • 功能详情如下:
    (1)中断引脚的触发方式 (D7~D4):设置中断引脚KBI1P7 ~ KBI1P4的触发中断的方式,0表示下降沿或者低电平触发,1表示上升沿或者高电平触发。因此用PTG4、PTD2、PTD3、PTD7引脚做中断时,引脚接上拉电阻和下拉电阻都可以用。
    注意:这几位数据位对键盘中断引脚KBI1P3 ~ KBI1P0无影响,KBI1P0 ~ KBI1P3默认为下降沿或者低电平触发。因此用PTG0~PTG3引脚做中断时,只能接上拉电阻。
    至于具体是边沿触发还是电平触发,决定于中断检测模式(D0)。
    (2)中断标志位 (D3):KBF=1时,产生键盘中断;KBF=0时,未产生键盘中断。该数据位只能读取,不需要人为设置;初始化时设为0或1都行。
    (3)中断应答位(D2):设为1时,清除键盘中断标志位。如:
    KBI1SC |= 0b00000100(0x04);
    (4)中断使能位 (D1):设为1时,开放键盘中断;设为0时,禁止键盘中断。如:
    KBI1SC |= 0b00000010(0x02);开放键盘中断。
    KBI1SC &= ~0b00000010( ~ 0x02);禁止键盘中断。
    为了不改变其他数据位的值,单独设置的时候必须要用位运算(|、&、 ~ )。
    (5)中断检测模式(D0):设为1时,仅边沿检测模式(上升沿和下降沿检测中断);设为0时,边沿和电平检测模式(上升沿、下降沿和高低电平检测中断)

键盘中断引脚使能寄存器(KBI1PE)

  • 中断引脚使能寄存器:决定所对应的引脚是否允许中断进入。
数据位D7(PTD7)D6(PTD3)D5(PTD2)D4(PTG4)D3(PTG3)D2(PTG2)D1(PTG1)D0(PTG0)
读写KBIPE7KBIPE6KBIPE5KBIPE4KBIPE3KBIPE2KBIPE1KBIPE0
复位00000000
  • KBIPE0 ~ KBIPE7分别对应键盘中断引脚KBI1P0 ~ KBI1P7。
  • KBIPEn=1(n引脚),表示相应键盘中断引脚KBIPEn被定义为中断输入引脚;KBIPEn=0(n引脚)该引脚不作为中断输入引脚。
  • KBI1PE=0b00001111(0x0f):设置KBIPE0~KBIPE3(PTG0 ~ PTG3)为中断输入引脚。

键盘中断配置

  • 初始化顺序:(1)关闭总中断;(2)关闭看门狗复位功能,避免程序自动复位;(3)设置中断状态控制寄存器(KBI1SC);(4)设置中断引脚使能寄存器(KBI1PE);(5)开键盘中断;(6)开总中断;
  • 设置中断状态控制寄存器:设置触发方式,清标志位
  • 设置中断引脚使能寄存器(KBI1PE):键盘复用功能允许
  • 进入中断服务函数后一定用记得清除键盘中断标志位:KBI1SC |=0b00000100;

代码如下:

void MCU_int(void)
{
	DisableInterrupts; //关闭中断
	SOPT_COPE=0;       //关闭看门狗复位功能,避免程序自动复位
	KBI1SC=0b00000100;//设置触发方式为下降沿和低电平触发,清标志位。
	KBI1PE |=0b00000011;//键盘复用功能允许(按键接的是PTG0和PTG1引脚)
	KBI1SC |=0b00000010;// 开键盘中断  
	EnableInterrupts;	// 开总中断
}

实例

把4位七段数码管的段选接在AW60的D口上,位选接在B口的0、1、2、3端口上,G口的0,1端口连接按键Key1和Key2。当按下Key1时显示数值+1,当按下Key2时显示数值-1。初始显示0000。
在这里插入图片描述
在这里插入图片描述
编程思路:
(1)求出每位数码管要显示的数
(2)控制段选位和位选位,实现逐位 显示各个数字
(3)由按键来决定修改要显示的数值。

代码如下:

#include <hidef.h>          //调用头文件
#include "derivative.h"
void main(void) 
{
	
	uchar qian,shi,bai,ge;
	MCU_Init();          //初始化函数
	KBI1SC |=0b00000010;// 开键盘中断  
	EnableInterrupts;	// 开总中断

  while(1) {
		//数码管动态扫描
	}
}
void MCU_Init(void)
{
 	DisableInterrupts; //关闭总中断 
    SOPT_COPE=0;   //关看门狗
  /*以下为初始化引脚*/
  //输入输出引脚定义与初始化
	PTDDD=0xff;//数码管段选
	PTBDD=0x0f;//数码管位选
	KBI1SC=0b00000100;//设置触发方式,清标志位。
	KBI1PE |=0b00000011;//键盘复用功能允许
	PTGPE |= 0b00000011; //内部上拉电阻
}
//中断服务函数
interrupt VectorNumber_Vkeyboard1 void isrKeyBoard(void)
{
    KBI1SC|=0b00000100;   //清键盘中断标志位
    if((PTGD&0x03)==0x01)
    {	Delay(1);
    	if((PTGD&0x03)==0x01)
    	{
    		if(Num==9999)
			Num=0;
			else
			Num++;	
    	} }
	else if((PTGD&0x03)==0x02)
    {	Delay(1);
    	if((PTGD&0x03)==0x02)
    	{
    		if(Num==0)
			Num=9999;
			else
			Num--;	
    	}}
         
}

如果对你有用的话,可不可以点个赞呢

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值