c - 按下键盘按钮时,PIC18 全局中断使能位切换
问题描述
客观的
我正在尝试将 4x3 矩阵键盘和 7 段 LED 显示屏连接到 PIC18f4550 微控制器。当我按下键盘上的按钮时,我希望 7 段显示器相应地显示数字。
到目前为止我做了什么
根据我的研究,我可以使用扫描(连续轮询)或使用中断将键盘与 MCU 连接。我决定使用中断,这样微控制器就可以腾出时间进行其他操作。
以下是键盘与 MCU 的连接。
我使用 RB0-2 作为 MCU 的输入,RB4-7 设置为 MCU 的输出。RB4-7 永久设置为高电平,因此当用户按下键盘按钮时,将触发 RB0-2(INT0-INT2) 中断处理。
为简单起见,我将只讨论键盘的第 1 列。
这就是我初始化和设置寄存器的方式。
void main(void)
{
OSCCON = 0x72;
TRISD = 0;
LATD = 0;
ADCON1 = 0x0F;
TRISB = 0x07;
LATB = 0xF0;// keep the RB4-7 high
INTCONbits.GIE = 1;
INTCONbits.INT0IF = 0;
INTCONbits.INT0IE = 1;
INTCON2bits.INTEDG0 = 1;
while (1);
}
我的中断处理如下:
if(INTCONbits.INT0IF == 1)
{
for(char scan=0x10; scan>=0x80; scan <<= 1) // send 1 to each row starting from RB4 till RB7
{
LATB = scan;
if (PORTBbits.RB0 = 1)
{
if(scan == 0x10)
{
display_number(1);
}
if(scan == 0x20)
{
display_number(4);
}
if(scan == 0x40)
{
display_number(7);
}
}
}
LATB = 0xF0;
INTCONbits.INT0IF == 0;
我的问题
当我运行模拟时,我注意到只要按下第 1 列中的任何按钮,GIE 位就会在 0 和 1 之间快速切换,并且在 7 段上也没有显示任何数字。我添加了监视窗口屏幕截图并突出显示了正在切换的 GIE 位。
我做错了什么?我处理中断的逻辑有缺陷吗?
更新 1
正如 DavidHoadley 建议的那样,我已更改为使用 useunsigned char
而不是char
.
我还更正了 for 循环条件。
我观察到的是,如果我将循环保留在中断例程中,循环将由于某种原因而卡住。
目前,我已经放弃尝试在中断函数中使用循环,而是在主循环中使用一个函数来在每一行永远按顺序输出高电平,并且中断函数仅用于使用switch statement
.
解决方案
这是 PIC micros 的正常行为。当 PIC 进入中断向量时,GIE 位被硬件复位,当它完成中断服务时,它RETFIE
通过设置 GIE 位返回汇编指令,这在 C 代码中是不可见的。所以这件事你的代码没有错,这甚至不是问题。
我在您的代码中看到您仅使用 INT0 中断来检测压力,而其余的 INTx 引脚未激活。这就是为什么 PIC micro 将能够检测到唯一第一列的变化。我建议您使用 RB<7:4> 位上的更改中断 (IOC)。这样您就可以释放 INTx 引脚用于其他目的。您可以将 3 个引脚移动到 PORTB 以外的端口。如果您有兴趣,这是程序或我的建议:
- 将 RB<7:4> 引脚配置为输入并启用其 IOC 功能。
- 将任意 3 个引脚配置为任意端口的输出。
- 如果您使用正逻辑,则将 3 个引脚设置为高电平,否则为低电平。
- 在您的 ISR 中轮询 RBIF 以了解 RB<7:4> 引脚是否发生变化。
- 如果是这样,请进行按钮扫描以检测按下的键。
不幸的是,由于您尚未共享代码和显示配置,因此无法告诉您有关显示问题的任何信息。
推荐阅读
- windows - Dart: Can i use it to create software with GUI?
- java - 过滤器逻辑应该在前端还是后端?
- javascript - 21 数数游戏(如 nim 游戏)
- python - 如何按条件计算每列的平均值
- java - 在 POM 中使用 By - Selenium
- php - PHP 三元运算符不能按预期工作?
- python - 无法返回列表中的值
- reactjs - 如何使用 React Native 为整个应用程序背景应用 react-native-linear-gradient
- php - 无法在其他功能中打印链接
- assembly - “转义操作码”是什么意思?