现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起;弹起时灭掉。
主要目的是学习GPIO的输入及中断。
一、 电路
图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳线是接通的。
可以看到,当按钮按下时,引脚接地。即若引脚接个上拉电阻,则在按钮弹起状态下,引脚处于高电平状态;而在按钮按下时,则处于低电平状态。
这次使用的按钮是BP3,即PA20引脚;LED为蓝色LED,即PA0。
二、 最简单的办法
在开发版重置时,所有的引脚就默认接了上拉电阻。
所以,直接使用一根杜邦线将PA20和PA0短接,就可以用BP3控制蓝色LED了。
三、 稍微有技术含量的思路
假设,身边不存在杜邦线……
那么很直接的思路就是根据按钮引脚的电平,来控制LED灯引脚的电平。可以选择通过不断查询来获取按钮引脚的电平状态,但我们现在使用更高级的武器:中断。
我们让按钮引脚在电平变换时产生一个中断,然后在中断服务函数中控制LED引脚电平。
四、 LED引脚的配置
这个配置已经做过多次了……
五、 输入引脚的配置
1. 启用PIO控制器的时钟。启用中断、获取引脚电平需要开启相应PIO控制器的时钟。
1 | PMC->PMC_PCER0 = (1 << ID_PIOA); |
2. 引脚配置为仅做输入用途
1 2 3 4 5 | #define BUTTON_PIO PIO_PA20 /* 使用PIO控制器控制引脚 */ PIOA->PIO_PER = BUTTON_PIO; /* 禁用引脚输出,即按钮引脚仅做为输入引脚 */ PIOA->PIO_ODR = BUTTON_PIO; |
3. 启用上拉电阻。默认情况下无需做此设置。但配置时需要注意,在启用上拉电阻前需要禁用下拉电阻。
1 2 3 | /* 启用上拉电阻(不过重置时就是默认启用的) */ PIOA->PIO_PPDDR = BUTTON_PIO; PIOA->PIO_PUER = BUTTON_PIO; |
4. 启用中断。
1 2 3 4 5 6 7 8 | /* 启用中断 */ PIOA->PIO_IER = BUTTON_PIO; /* 不使用额外中断控制模式 */ PIOA->PIO_AIMDR = BUTTON_PIO; /* NVIC中启用中断 */ NVIC_ClearPendingIRQ(PIOA_IRQn); NVIC_SetPriority(PIOA_IRQn, 0); NVIC_EnableIRQ(PIOA_IRQn); |
这样,该引脚就会在输入电平的上升沿及下降沿,即按钮弹起及按下时,产生中断了。
六、 错误的的中断配置
GPIO可以选择一些额外的中断控制模式:上升沿触发,下降沿触发,低电平触发,高电平触发。为使引脚在检测到上升沿或下降沿时均触发中断,做了以下配置:
1 2 3 4 5 6 7 8 | /* 注:这是错误的做法 */ /* 启用额外中断控制模式 */ PIOA->PIO_AIMER = BUTTON_PIO; /* 选择边沿触发 */ PIOA->PIO_ESR = BUTTON_PIO; /* 上升和下降沿 */ PIOA->PIO_REHLSR = BUTTON_PIO; PIOA->PIO_FELLSR = BUTTON_PIO; |
这样做的后果是,只会在下降沿触发中断。原因是,上面提到的几种中断模式中,只能使用一种——即最后的语句配置的“下降沿/低电平”触发中断。
而在不启用额外中断控制时,则会在两种边沿都会触发中断。
七、 中断服务函数
有这样几个寄存器:
PIO_ELSR——用来表示触发中断的是电平还是边沿
PIO_FRLHSR——用来表示触发中断的是下降沿或低电平,还是上升沿或高电平
很遗憾,在不使用额外中断控制模式下,这些寄存器都是无效果的。
但可以通过读取PIO_PDSR寄存器来直接确定引脚的电平。需要注意,使用这个寄存器时,需要先开启PIO控制器的时钟。
代码逻辑比较简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #define LED_PIO PIO_PA0 void PIOA_Handler() { /* 获取中断的状态,同时拉低中断 */ uint32_t status = PIOA->PIO_ISR; /* 先确定是否是由按钮引脚触发的中断 */ if ((status & BUTTON_PIO) != 0) { if (PIOA->PIO_PDSR & BUTTON_PIO) { /* 高电平,按钮弹起 */ PIOA->PIO_SODR = LED_PIO; } else { /* 低电平,按钮按下 */ PIOA->PIO_CODR = LED_PIO; } } } |
关键字:SAM4E 单片机 LED闪烁 按钮控制
引用地址:
SAM4E单片机之旅——6、LED闪烁之按钮控制
推荐阅读最新更新时间:2024-03-16 15:29
使用8051单片机在LCD屏幕上显示内容的教程
液晶显示器(LCD)是一种常用的显示屏,在许多电子产品中经常使用它来以文本或图像格式显示信息。LCD用于在其屏幕上显示字母、数字等字符。LCD显示器由8条数据线和3条控制线组成,用于将LCD显示器与8051单片机连接。 考虑使用基于Proteus的模拟LCD与8051单片机的接口是: 如何在LCD显示屏上显示“8051单片机”,案例程序如下: #include reg51.h #define kam P0 void lcd_initi(); void lcd_dat(unsigned char ); void lcd_cmd(unsigned char ); void delay(); void di
[单片机]
单片机编程检验总结
经验之一:用“软件陷阱+程序口令”对付PC指针的弹飞 当CPU受到外界干扰,有时PC指针会飞到另一段程序中,或跳到空白段去。其实,如果PC指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。但是,如果PC指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下: 1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。 2、设立一个模块(子程序)ID寄存器。 3、为每个子程序配置一个唯一的ID号码。 4、每当子程序执行完毕,要返回(RET)之前, 先将本子程序的ID号送入 ID寄存器。 5、返回到上级程序
[单片机]
驱动永磁无刷直流电机的嵌入式微控制器
摘要: 本文介绍了一种适用于控制永磁无刷直流电机的廉价嵌入式微控制器,并结合实例给出了软件和硬件两种控制方法。
关键词: 永磁无刷直流电机 控制 嵌入式微控制器
一、 概述
永磁无刷直流电机(Permanent Magnet Brushless DC Motor以下简称PMBLDC)由于其固有的特点,在家用消费类产品(空调、冰箱、洗衣机)和IT周边产品(打印机、软驱、硬驱)中得到广泛的应用。它具有结构简单、高效、低噪声、高功率密度、启动扭矩大、寿命长等其它种类直流电机无法比拟的特性。我国是稀土大国,稀土永磁材料经过这几年的发展,已经有了一定的规模,质量和数据都有较大的提高,价格已不断
[应用]
基于单片机的环境监测仪设计与实现
引言 随着人民群众环保意识的不断增强。以及国家对环保重视程度的不断提高,社会对环境监测提出了新的更高要求,环境监测的任务日趋繁重。据不完全统计我国已经制定的各类国家环境标准有400余项,涵盖了大气、水质、土壤、噪声、辐射、固体废物、农药等领域。并且已经开展了环境质量监测、环境质量周报、日报、预报监测;污染源监测、污染事故应急监测、污染物总量控制监测、污染源解析监测。环境污染治理工程效果监测等,需监测的污染因子达上百种。这种点多、面广、任务繁重的环境监测形势,急切需要提高环境监测的自动化水平,减少人工作业量,提高环境监测实效。随着大规模集成电路制造技术的不断发展。推动了单片机技术的发展。为野外条件下进行实时环境监测提供了便利 单片
[单片机]
AVR相比51系列单片机的优势特征
单片机又称单片微控制器,它是把一个计算机系统集成到一个芯片上,概括的讲:一块芯片就成了一台计算机。单片机技术是计算机技术的一个分支,是简易机器人的核心元件。 1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术, 共同研发出RISC精简指令集的高速8位单片机,简称AVR。 AVR单片机的优势特征 单片机已广泛地应用于军事、工业、家用电器、智能玩具、便携式智能仪表和机器人制作等领域,使产品功能、精度和质量大幅度提升,且电路简单,故障率低,可靠性高,成本低廉。单片机种类很多,在简易机器人制作和创新中,为什么选用AVR单片机呢? 一、简便易学
[单片机]
基于AVR单片机的I SP1362 OTG设计
0 引言 随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照最新的USB OTG技术规范,设计了一种遵循USB协议的主/从机系统。 1 ISP1362芯片的内部结构 Philips公司的ISP1362是一款符合USB 2.0总线协议的接口芯片,内部有3个USB控
[单片机]
51单片机--仿真出租车计价器
这汇编的程序,编写的很复杂,实现的功能却还是很简陋。 在硬件方面,显示金额的位数也不足。 做而论道用 C 重新编写了一个程序,如下: #include reg52.h #include intrins.h #define BAITIAN 10 //白天价格/km #define YEJIAN 14 //夜间价格/km #define DENGREN 1 //停车等人价格/30s sbit QD = P3^4; sbit RY = P3^7; unsigned char danjia, jvli, n_X0, mode; unsigned int jinee, n_50ms; bit ye;
[单片机]
8位RISC MCU IP软核仿真的新方法
随着集成电路产业的发展,SoC系统已经成为IC产业的主流。微控制器(MCU)是SoC系统的核心模块,由于8位微控制器具有指令简单灵活、规模小、速度快的特点,因此广泛应用于SoC系统中。 本文所要验证的8位RISC MCU IP核是与Microchip公司的8位MCU指令集完全兼容的IP核,采用哈佛总线结构,地址总线和数据总线分开,程序和数据分别存储在程序存储器和数据存储器中;采用两级流水线设计,共有33条指令,指令宽度为12位,PC宽度为11位,可寻址2KB 。除了部分条件测试指令和跳转指令为双周期外,其他所有指令都可以在一个指令周期完成。 1 MCU的结构分析 该MCU核没有内部程序存储器,顶层划分为控制部
[工业控制]