本帖最后由 黄福均 于 2021-4-12 21:38 编辑
第1题:基本的按键操作(如独立按键/4x4矩阵按键等),能完成基本的按键操作。 1.完整硬件的照片
2.引脚连接图等电路图
3.工程源代码(建议直接上传整个工程)
4.如果键盘使用了驱动芯片,则要上传驱动芯片的手册等资料
**********************************************************************************************************
1.硬件照片
MSP432P401R
用独立按键S2——P1.4作为输入,用LED2——P2.0作为显示输出
功能描述:初始状态,LED2以高频闪烁红光,按下板载独立按键S2,LED2闪烁频率变慢为原来的1/10,仍为红光,
再按下S2,LED2闪烁频率变回高频。如此反复,按下按键S2,LED2红光闪烁频率切换。
2. 原理图
LED2可以与LED1替换,LED2的其他管脚控制发出不同颜色的光。
独立按键S2可以S1替换,按键按下,该管脚为高电平。
3.工程文件打开说明
单片机型号:MSP-EXP432P401R Launchpad
开发环境: Code Composer Studio 10.1.1
首先,一定不要把工程文件放在有中文的路径!
必须全英文路径!全英文路径!英文路径!
否则如下:
工程文件在CCS里面导入,操作为:File - Open Projects from File System... - Directory... - 找到工程文件 - Finish
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
工程用到了msp432p4xx的库,驱动库需添加此路径。正常情况是配置好了的。
插上开发板,编译gpio_input_interrupt_work20210111.c文件,下载程序。
按一下复位键,开发板开始工作。不按复位不工作。
4. 工程源代码
/*******************************************************************************
* MSP432P401R 独立按键
* 功能描述:初始状态,LED2以高频闪烁红光,
* 按下板载独立按键S2,LED2闪烁频率变慢为原来的1/10,仍为红光,
* 再按下S2,LED2闪烁频率变回高频。
* 如此反复,按下按键S2,LED2红光闪烁频率切换。
*
* MSP432P401R
* ------------------
* /|\| |
* | | |
* --|RST P2.0 |---> P2.0 LED2红光
* | |
* | P1.4 |<-- 按键S2
* | |
* | |
*
******************************************************************************/
/* 添加驱动库头文件 */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
/* 基本头文件 */
#include <stdint.h>
#include <stdbool.h>
/* LED2模式选择参数,choose为偶数LED2高频闪烁,为奇数LED2低频闪烁,可根据需要设置更多模式 */
uint32_t choose=0;
int main(void)
{
volatile uint32_t ii; //设置变量ii, 作为延时循环次数,ii越大,闪烁频率越慢
/* 关闭看门狗 */
MAP_WDT_A_holdTimer();
/* 配置P2.0为输出*/
MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0);
/* 配置P1.4为输入并使能中断 */
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN4);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN4);
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN4);
MAP_Interrupt_enableInterrupt(INT_PORT1);
/* Enabling SRAM Bank Retention */
MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK1);
/* 使能全局中断 */
MAP_Interrupt_enableMaster();
/* LED2进入闪烁循环 */
while (1)
{
/* 延时 */
if((choose%2) == 0) //高频模式
{
for(ii=0;ii<10000;ii++)
{
}
}
else //低频模式
{
for(ii=0;ii<100000;ii++)
{
}
};
/* 取反P2.0的输出 */
MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
}
}
/* GPIO中断服务程序 */
/* 两个独立按键S1--P1.1 、 S2--P1.4, 按键按下为高电平,
* GPIO_PORT_P1和GPIO_PIN1都为高,则S1按下,本实验未用到,
* GPIO_PORT_P1和GPIO_PIN4都为高,则S2按下,
* 否则没按键按下 */
void PORT1_IRQHandler(void)
{
uint32_t status; //设置一个状态标志量,寄存中断情况
status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1); //读取按键状态,按下为高
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status); //清零所有中断标志位
/* S2按下,choose+1,模式改变 */
if(status & GPIO_PIN4)
{
choose++;
}
/* 按键按下次数太多,choose清零,重新计数,choose可计数按下次数 */
if(choose>500000)
{
choose=0;
}
}
gpio_input_interrupt_work20210111.zip
(116.74 KB, 下载次数: 11)
欢迎大家提问,大家一起讨论学习。感谢亲们的收藏、打赏和投票!!!
|