如果对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)包含了键盘中断触发方式、键盘中断标志、键盘中断应答、键盘中断使能和中断检测的功能。
数据位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
读 | KBEDG7 | KBEDG6 | KBEDG5 | KBEDG4 | KBF | 0 | KBIE | KBIMOD |
写 | KBEDG7 | KBEDG6 | KBEDG5 | KBEDG4 | 未定义 | KBACK | KBIE | KBIMOD |
功能 | 设置中断引脚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) |
---|---|---|---|---|---|---|---|---|
读写 | KBIPE7 | KBIPE6 | KBIPE5 | KBIPE4 | KBIPE3 | KBIPE2 | KBIPE1 | KBIPE0 |
复位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 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--;
}}
}
如果对你有用的话,可不可以点个赞呢