webee210裸机开发之按键轮询及蜂鸣器

按键以及蜂鸣器仍然是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灯那一章类似的。结束。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值