按键以及蜂鸣器仍然是GPIO的那一章节的。所以这一章我会快速过完,其中代码完全是webee的(所以这篇应该是转载),不过这个裸机开发的代码好像都是差不多。按键轮询,就是while(1)一直检测是否检测按下。蜂鸣器则和led一般。
按键:
连接CPU的是
管脚是GPH2_0 -GPH2_4 ,GPH3_0-GPH3_4,配置这些关键为输入
start.s
.text
.global _start
_start:
ldr sp, =0xD0037D80
bl main
halt_loop:
bl halt_loop
key.c
#include"key.h"
/* 按键初始化函数 */
void key_init()
{
/* 设置8个按键引脚为输入状态 */
GPH2CON = GPH2_0_INTPUT&GPH2_1_INTPUT&GPH2_2_INTPUT&GPH2_3_INTPUT;
GPH3CON = GPH3_0_INTPUT&GPH3_1_INTPUT&GPH3_2_INTPUT&GPH3_3_INTPUT;
}
int key_check(int pin)
{
volatile unsigned long tempDat1,tempDat2;
int i = 0;
tempDat1 = GPH2DAT; // 读取K1~K4的状态,0表示按下
tempDat2 = GPH3DAT; // 读取K5~K8的状态,0表示按下
if((tempDat1 & (1 << (pin-1)*1))||(tempDat2 & (1 << (pin-5)*1)))
{
i = 1;
return i;
}
return i;
}
main.c
#include"led.h"
#include"key.h"
int main()
{
key_init(); //按键初始化
led_init(); //LED初始化
while(1)
{
if(key_check(1)) //K1还没有被按下
GPJ2DAT |= LED0_OFF; //LED0熄灭
else
GPJ2DAT &= LED0_ON; //K1被按下,同时LED0点亮
if(key_check(2)) //K2还没有被按下
GPJ2DAT |= LED1_OFF;
else
GPJ2DAT &= LED1_ON; //K2被按下,同时LED1点亮
if(key_check(3))
GPJ2DAT |= LED2_OFF;
else
GPJ2DAT &= LED2_ON;
if(key_check(4))
GPJ2DAT |= LED3_OFF;
else
GPJ2DAT &= LED3_ON;
if(key_check(5))
GPJ2DAT |= LED0_OFF;
else
GPJ2DAT &= LED0_ON&LED1_ON;
if(key_check(6))
GPJ2DAT |= LED1_OFF;
else
GPJ2DAT &= LED2_ON&LED3_ON;
if(key_check(7))
GPJ2DAT |= LED2_OFF;
else
led_flash(); //按下S7,执行LED闪烁函数
if(key_check(8))
GPJ2DAT |= LED3_OFF;
else
led_flow_water(); //按下S8,执行流水灯函数
}
return 0;
}
led.c
#include"led.h"
/* LED初始化函数 */
void led_init()
{
/* 设置4个LED引脚为输出状态 */
GPJ2CON |=GPJ2_0_OUT|GPJ2_1_OUT|GPJ2_2_OUT|GPJ2_3_OUT;
/* 关闭全部LED */
GPJ2DAT |= LED0_OFF|LED1_OFF|LED2_OFF|LED3_OFF;
}
/* 延时函数 */
void delay(int count)
{
while (count--)
;
}
/* 流水灯函数 */
void led_flow_water()
{
unsigned int i = 0,j = 0;
GPJ2CON |= (GPJ2_0_OUT | GPJ2_1_OUT | GPJ2_2_OUT | GPJ2_3_OUT); // 配置引脚
for(j = 0;j < 10;j++)
{
GPJ2DAT = ~(1<<i); //GPJ2DAT的值依次为 1110B 1101B 1011B 0111B ,不断循环
i++;
if (i == 4)
i = 0;
delay(0x100000);
}
}
/* LED闪烁函数 */
void led_flash()
{
int i = 0;
GPJ2CON |= (GPJ2_0_OUT | GPJ2_0_OUT | GPJ2_0_OUT | GPJ2_0_OUT); // 配置引脚
for(i = 0;i < 5;i++)
{
GPJ2DAT &= (LED0_ON & LED1_ON & LED2_ON & LED3_ON); // LED全亮
delay(0x100000);
GPJ2DAT |= (LED0_OFF | LED1_OFF | LED2_OFF | LED3_OFF); // LED全灭
delay(0x100000);
}
}
没有可以说的。看注释。
蜂鸣器则更简单
连接CPU管脚是GPD0_0,拉高时响,拉低则不响
代码:
start.s
.text
.global _start
_start:
ldr sp, =0xD0037D80
bl main
halt_loop:
bl halt_loop
main.c
/*延时函数*/
void delay(volatile unsigned long count)
{
while(--count);
}
int main()
{
beep_init(); //初始化蜂鸣器
while(1)
{
beep_start(); //蜂鸣器响
delay(0x100000);
beep_stop(); //蜂鸣器停止
delay(0x100000);
}
return 0;
}
beep.c
/* 蜂鸣器引脚寄存器定义 */
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define GPD0_0_OUT (1<<0)
#define BEEP_START (1<<0)
#define BEEP_STOP ~(1<<0)
/* 蜂鸣器初始化函数 */
void beep_init()
{
GPD0CON |= GPD0_0_OUT; //蜂鸣器引脚设置为输出状态
}
/* 蜂鸣器启动函数 */
void beep_start()
{
GPD0DAT |= BEEP_START; //开启蜂鸣器
}
/* 蜂鸣器停止函数 */
void beep_stop()
{
GPD0DAT &= BEEP_STOP; //关闭蜂鸣器
}
这个简单到无话可说了,和LED灯那一章类似的。结束。