下图采用LPC2200系列ARM微控制器的PO.14(EINT1)接外部按键,当按键按下时,该引脚电平为低电平,松开按键后,该引脚为高电平。采用该芯片的PO.0、PO.1、P0.2、PO.3分别控制外部LED 的状态,当输出为低电平时,LED被点亮,当输出为高电平时,LED熄灭。如下图,请按要求完成以下几个问题。(1)请完成图中按键输入和控制LED的端口初始化程序段。 (2)编写程序,实现当按键按下时,所有LED同时点亮,当按键松开时,所有LED同时熄灭。 (3)编写程序,实现当按键按下时,4个LED闪烁,当按键松开时,4个 LED熄灭。(4)若系统要利用上升沿产生中断的方式实现对外部按键的检测,请完成对PO.14端口的初始化程序段。 (5)画出下降沿产生中断的时刻示意图。
时间: 2024-02-06 15:02:58 浏览: 65
(1) 程序段:
```
//初始化PO.14为输入口,PO.0、PO.1、P0.2、PO.3为输出口
PINSEL0 &= ~(3 << 28); //清零P0.14的功能位
IO0DIR &= ~(1 << 14); //将P0.14设置为输入口
IO0DIR |= (0x0F); //将P0.0~P0.3设置为输出口
```
(2) 程序段:
```
while(1){
if((IO0PIN & (1 << 14)) == 0){ //按键按下
IO0PIN &= ~(0x0F); //所有LED点亮
}
else{ //按键松开
IO0PIN |= (0x0F); //所有LED熄灭
}
}
```
(3) 程序段:
```
while(1){
if((IO0PIN & (1 << 14)) == 0){ //按键按下
for(int i=0; i<10; i++){ //闪烁10次
IO0PIN ^= (0x0F); //所有LED闪烁
Delay(100); //延时
}
IO0PIN |= (0x0F); //所有LED熄灭
}
else{ //按键松开
IO0PIN |= (0x0F); //所有LED熄灭
}
}
```
(4) 程序段:
```
//初始化PO.14为输入口,PO.0、PO.1、P0.2、PO.3为输出口
PINSEL0 &= ~(3 << 28); //清零P0.14的功能位
IO0DIR &= ~(1 << 14); //将P0.14设置为输入口
IO0DIR |= (0x0F); //将P0.0~P0.3设置为输出口
//设置PO.14上升沿触发中断
EXTMODE |= (1 << 1); //设置P0.14为边沿触发模式
EXTPOLAR &= ~(1 << 1); //设置P0.14为上升沿触发
VICVectAddr2 = (unsigned long)EINT1_Handler; //设置中断服务程序入口地址
VICVectCntl2 = (1 << 5) | 15; //设置中断向量号和使能中断
VICIntEnable = (1 << 15); //使能外部中断
```
(5) 时刻示意图:
```
_______ _______
| | | |
__| |_________| |__
___________
| |
| |
-------- ---------
^ ^
| |
下降沿 上升沿
```