实验四 GPIO 输入实验一、实验目的1、可以使用GPIO的输入模式读取开关信号2、掌握GPIO相关寄存器的用法和设立3、掌握用C语言编写程序控制GPIO二、实验环境 PC机 一台 ADS 1.2集成开发环境 一套EasyARM2131教学实验平台 一套 三、实验内容1.实验通过跳线 JP8 连接KEY1与P0.16,程序检测按键KEY1 的状态,控制蜂鸣器BEEP 的鸣叫按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣调通实验后,改为KEY3键进行输入) 2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键没有输入键输入改为键KEY4,发光管改为LED6)3.结合实验三,当按下按键Key1时,启动跑马灯程序并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键再次按下。
四、实验原理当P0 口用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路图参见图 4.2进行 GPIO 输入实验时,先要设立IODIR 使接口线成为输入方式,然后读取IOPIN 的值即可图 4.2按键电路原理图实验通过跳线 JP8 连接KEY1_P0.16,程序检测按键KEY1 的状态,控制蜂鸣器BEEP 的鸣叫按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣在这个实验中,需要将按键KEY1 输入口P0.16 设为输入口而蜂鸣器控制口P0.7 设立为输出口蜂鸣器电路如图 4.3 所示,当跳线JP6 连接蜂鸣器时,P0.7 控制蜂鸣器,低电平时蜂鸣器鸣叫LED灯电路如图4.4所示,低电平时灯亮图 4.3 蜂鸣器控制电路图 4.4 LED 控制电路程序一方面设立管脚连接寄存器PINSEL0 和PINSEL1,设立P0.16 为输入,设立P0.7,P1.21 为输出然后检测端口P0.16 的电平,对P0.7, P1.21进行相应的控制,流程图如图 4.5 所示,实现程序见程序清单 4.1图 4.5 按键输入实验流程图五、 实验环节、源代码及调试结果内容1实验环节① 启动ADS1.2IDE集成开发环境,选择ARM Executable Image for lpc2131工程模板建立一个工程BEEP_key。
② 在user组里编写主程序代码main.c③ 选用DebugInFLASH生成目的,然后编译链接工程④ 将EasyARM教学实验开发平台上的相应管脚跳线短接gde台ngtheng 444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444⑤ 选择Project->Debug,启动AXD进行JLINK仿真调试⑥ 全速运营程序,程序将会在main.c的主函数中停止如下图所示:⑦ 单击Context Variable图标按钮(或者选择Processor Views->Variables)打开变量观测窗口,通过此窗口可以观测局部变量和全局变量选择System Views->Debugger Internals 即可打开LPC2023系列ARM7微控制器的片内外寄存器窗口通过变量窗口可以观测变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口如下图所示:⑧ 可以单步运营程序,先按下Key1,观测IO0PIN寄存器的值,然后断开Key1,观测IO0PIN寄存器的值。
可以设立/取消断点;或者全速运营程序,停止程序运营,观测变量的值,判断蜂鸣器控制是否对的如下图所示: 图4.6 未按下Key1时IO0PIN的值 图4.7 按下Key1时IO0PIN的值 由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,说明控制是对的的现象描述:按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣源代码:#include "config.h"const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器const uint32 KEY1 = 1 << 16; // P0.16 连接KEY1 (改为KEY3时,只需“const uint32 KEY1 = 1 << 16”改为“const uint32 KEY3 = 1 << 18”,其余不变/********************************************************************************************* 函数名称:main()** 函数功能:GPIO 输入实验测试。
检测按键KEY1KEY1 按下,蜂鸣器蜂鸣,松开后停止蜂鸣 跳线说明:把 JP8 的KEY1 跳线短接,JP11 连接蜂鸣器/int main (void){ PINSEL0 = 0x00000000; // 所有管脚连接GPIOPINSEL1 = 0x00000000;IO0DIR = BEEP; // 蜂鸣器控制口输出,其余输入while (1){ if ((IO0PIN & KEY1) == 0) IO0CLR = BEEP; // 假如KEY1 按下,蜂鸣器鸣叫else IO0SET = BEEP; // 松开则停止蜂鸣}return 0;}内容二实验环节① 启动ADS1.2IDE集成开发环境,选择ARM Executable Image for lpc2131工程模板建立一个工程BEEP_key② 在user组里编写主程序代码main.c③ 选用DebugInFLASH生成目的,然后编译链接工程④ 将EasyARM教学实验开发平台上的相应管脚跳线短接gde台ngtheng 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999。
⑤ 选择Project->Debug,启动AXD进行JLINK仿真调试⑥ 全速运营程序,程序将会在main.c的主函数中停止如下图所示:⑦ 单击Context Variable图标按钮(或者选择Processor Views->Variables)打开变量观测窗口,通过此窗口可以观测局部变量和全局变量选择System Views->Debugger Internals 即可打开LPC2023系列ARM7微控制器的片内外寄存器窗口通过变量窗口可以观测变量BEEP、KEY1等全局变量、i等本地变量和ARM7微控制器的片内外寄存器窗口如下图所示: 左图所示为ARM7微控制器的片内寄存器窗口 图4.9 本地变量 图4.8 全局变量⑧ 可以单步运营程序,先按下Key1,观测IO0PIN寄存器的值,然后断开Key1,观测IO0PIN寄存器的值可以设立/取消断点;或者全速运营程序,停止程序运营,观测变量的值,判断蜂鸣器控制是否对的如下图所示:.图4.10 未按下KEY1时IO0PIN的值 图4.11 按下KEY1后IO0PIN的值对比图4.10和4.11,发现按下KEY1后,IO0PIN寄存器的第16位由1变为0;而KEY1相应管脚P0.16,当按下时输入低电平,这说明KEY1的控制是对的的。
上图所示为运营 “IO0CLR = BEEP”后IO0PIN寄存器的值,与图4.10对比,发现第8位由1变为0,BEEP相应P0.7管脚,这说明BEEP的控制是对的现象描述:当按下KEY1时,蜂鸣器鸣响,LED4亮;当松开KEY1后,蜂鸣器静音,LED4灭源代码如下:#include "config.h"const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器const uint32 KEY1 = 1 << 16; // P0.16 连接KEY1 (改为KEY4按键时,只需把上句代码改为“const uint32 KEY4=1<<19”,其余不变)const uint32 LEDS4= 1 << 21; // P1[21]控制LED4,低电平点亮(改为LED6时,只需把上句代码改为“const uint32 LED6=1<<23”,其余不变/***************************************************************************** 函数名称:main()** 函数功能:GPIO 输入实验测试。
检测按键KEY1KEY1 按下,蜂鸣器蜂鸣,松开后停止蜂鸣 跳线说明:把 JP8 的KEY1 跳线短接,JP11 连接蜂鸣器/int main (void){ Uint32 i; PINSEL0 = 0x00000000; // 所有管脚连接GPIOPINSEL1 = 0x00000000;IO0DIR = BEEP; // 蜂鸣器控制口输出0IO1DIR = LEDS4; // 设立LED4 灯亮while (1){ if ((IO0PIN & KEY1) == 0)for(i=0; i<1000; i++); // 软件延时{IO0CLR = BEEP; // 假如KEY1 按下,蜂鸣器鸣叫IO1DCLR = LEDS4; // 设立LED4 灯亮}else { IO0SET = BEEP; // 松开则停止蜂鸣IO1SET= LEDS4; // 设立LED4 灯灭}for(i=0; i<1000; i++); // 软件延时}return 0;}内容三实验环节① 启动ADS1.2IDE集成开发环境,选择ARM Executable Image for lpc2131工程模板建立一个工程BEEP_key。
② 在user组里编写主程序代码main.c③ 选用DebugInFLASH生成目的,然后编译链接工程④ 将EasyAR。