第七章 LED将为我闪烁:控制发光二极管

cat main.c
/**
* @file main.c
* @Synopsis
* 1:判断按键KEY是按下还是松开(所谓判断这里是读取引脚,读回来,看它是0还是1)
* {
* 1>:配置按键引脚KEY为输入,LED引脚为输出
* 2>:读按键引脚(某些寄存器)KEY,根据这些值 来设置LED引脚
* }
* 2:点亮/熄灭LED 判断
* @author MrClimb
* @version 1.1.0
* @date 2012-06-22
*/

#include <stdio.h>
#if 1

#define GPH2CON (*(volatile unsigned long *)0XE0200C40) // button key 控制输入输出引脚
#define GPH2DAT (*(volatile unsigned long *)0xE0200C44) // button key 控制高低电频

#define GPH3CON (*(volatile unsigned long *)0XE0200C60) // button key 控制输入输出引脚
#define GPH3DAT (*(volatile unsigned long *)0xE0200C64) // button key 控制高低电频

#define GPJ2CON (*(volatile unsigned long *)0xE0200280) // LED 控制输入输出引脚
#define GPJ2DAT (*(volatile unsigned long *)0xE0200284) // LED 控制高低电频

/* led1 to led4 1>:配置 LED引脚为输出 */

// 0000 0000 0000 00000 00000 0000 0000 0001
#define GPJ2CON0_OUT (1<<(2*0)) // [3:0] led1引脚设置为输出模式
// 0000 0000 0000 0000 0000 0000 0001 0000
#define GPJ2CON1_OUT (1<<(2*2)) // [7:4] led2引脚设置为输出模式
// 0000 0000 0000 0000 0000 0001 0000 0000
#define GPJ2CON2_OUT (1<<(2*4)) // [11:8] led3引脚设置为输出模式
// 0000 0000 0000 0000 0001 0000 0000 0000
#define GPJ2CON3_OUT (1<<(2*6)) // [15:12] led4引脚设置为输出模式


// 0000 0000 0000 0000 0000 0000 0000 0011
// 1111 1111 1111 1111 1111 1111 1111 1100
#define GPJ2CON0_MASK (3<<(2*0))

// 0000 0000 0000 0000 0000 0000 0011 0000
// 1111 1111 1111 1111 1111 1111 1100 1111 ~ 取反
#define GPJ2CON1_MASK (3<<(2*2))

// 0000 0000 0000 0000 0000 0011 0000 0000
// 1111 1111 1111 1111 1111 1100 1111 0000 ~ 取反
#define GPJ2CON2_MASK (3<<(2*4))

// 0000 0000 0000 0000 0011 0000 0000 0000
// 1111 1111 1111 1111 1100 1111 1111 1111 ~ 取反
#define GPJ2CON3_MASK (3<<(2*6))

/*
* button key1 -> key5
* 1>:配置按键引脚KEY为输入
*
* */
// 0000 0000 0000 0000 0000 0000 0000 000 0
#define GPH2CON0_IN (0<<(2*0)) // [3:0]
#define GPH2CON1_IN (0<<(2*2)) // [7:4]
#define GPH2CON2_IN (0<<(2*4)) // [11:8]
#define GPH2CON3_IN (0<<(2*6)) // [15:12]

// 0000 0000 0000 0000 0000 0000 0000 0011
// 1111 1111 1111 1111 1111 1111 1111 1110 ~ 取反
#define GPH2CON0_MASK (3<<(2*0))

// 0000 0000 0000 0000 0000 0000 0011 0000
// 1111 1111 1111 1111 1111 1111 1110 1111 ~ 取反
#define GPH2CON1_MASK (3<<(2*2))

// 0000 0000 0000 0000 0000 0011 0000 0000
// 1111 1111 1111 1111 1111 1110 1111 1111 ~ 取反
#define GPH2CON2_MASK (3<<(2*4))

// 0000 0000 0000 0000 0011 0000 0000 0000
// 1111 1111 1111 1111 1110 1111 1111 1111 ~ 取反
#define GPH2CON3_MASK (3<<(2*6))
/

// 0000 0000 0000 0000 0000 0000 0000 000 0
#define GPH3CON0_IN (0<<(2*0)) // [3:0]
#define GPH3CON1_IN (0<<(2*2)) // [7:4]
#define GPH3CON2_IN (0<<(2*4)) // [11:8]
#define GPH3CON3_IN (0<<(2*6)) // [15:12]

// 0000 0000 0000 0000 0000 0000 0000 0011
// 1111 1111 1111 1111 1111 1111 1111 1110 ~ 取反
#define GPH3CON0_MASK (3<<(2*0))

// 0000 0000 0000 0000 0000 0000 0011 0000
// 1111 1111 1111 1111 1111 1111 1110 1111 ~ 取反
#define GPH3CON1_MASK (3<<(2*2))

// 0000 0000 0000 0000 0000 0011 0000 0000
// 1111 1111 1111 1111 1111 1110 1111 1111 ~ 取反
#define GPH3CON2_MASK (3<<(2*4))

// 0000 0000 0000 0000 0011 0000 0000 0000
// 1111 1111 1111 1111 1110 1111 1111 1111 ~ 取反
#define GPH3CON3_MASK (3<<(2*6))

#endif

/**
* 点灯测式
*/
void
lightLedSet ()
{
// 把LED相应的位设置0,其它位不受影响,这里包含LED1,LED2,LED3,LED4
GPJ2CON &= ~(GPJ2CON0_MASK | GPJ2CON1_MASK | GPJ2CON2_MASK | GPJ2CON3_MASK);
// 0000 0000 0000 0000 0001 0001 0001 0001
GPJ2CON |= (GPJ2CON0_OUT | GPJ2CON1_OUT | GPJ2CON2_OUT | GPJ2CON3_OUT);

GPJ2DAT = 0XF; // 熄灭所有灯
}

/**
* 按键设置 为输入
*/
void
buttonKeySet ()
{
/* 把按键相应的位设置为0,其它位不受影响 */
GPH2CON &= ~(GPH2CON0_MASK | GPH2CON1_MASK | GPH2CON2_MASK | GPH2CON3_MASK);
/* 把相应的位设置进去 */
GPH2CON |= (GPH2CON0_IN | GPH2CON1_IN | GPH2CON2_IN | GPH2CON3_IN);

/* 把按键相应的位设置为0,其它位不受影响 */
GPH3CON &= ~(GPH3CON0_MASK | GPH3CON1_MASK | GPH3CON2_MASK | GPH3CON3_MASK);
/* 把相应的位设置进去 */

GPH3CON |= (GPH3CON0_IN | GPH3CON1_IN | GPH3CON2_IN | GPH3CON3_IN);
}

/**
2>:读按键引脚(某些寄存器)KEY,根据这些值 来设置LED引脚
*/
void
readButtonKey ()
{
unsigned long Dat;
while (1)
{
Dat = GPH2DAT; /*key1 to key4 */
switch (Dat)
{
/* case 0x1:
GPJ2DAT = 0X1;
break;
case 0x2:
GPJ2DAT = 0X2;
break;
case 0x4:
GPJ2DAT = 0X4;
break;
case 0x5:
GPJ2DAT = 0X5;
break;
case 0x6:
GPJ2DAT = 0X6;
break;
case 0x8:
GPJ2DAT = 0x8;
break;
case 0x9:
GPJ2DAT = 0x9;
break;
case 0xa:
GPJ2DAT = 0xa;
break;
case 0xc:
GPJ2DAT = 0xc;
break; */
case 0x7: /* 0111 control led4 */
GPJ2DAT = 0X7;
break;
case 0xb: /* 1011 contrl led3 */
GPJ2DAT = 0xb;
break;
case 0xd: /*1101 contrl led2 */
GPJ2DAT = 0xd;
break;
case 0xe: /*1110 contrl led1 */
GPJ2DAT = 0xe;
break;
case 0xf:
GPJ2DAT = 0xf;
break;
default:
GPJ2DAT = 0XF;
break;
}

Dat = GPH3DAT; /*key5 to key8 */
switch (Dat)
{
/* case 0x1:
GPJ2DAT = 0X1;
break;
case 0x2:
GPJ2DAT = 0X2;
break;
case 0x4:
GPJ2DAT = 0X4;
break;
case 0x5:
GPJ2DAT = 0X5;
break;
case 0x6:
GPJ2DAT = 0X6;
break;
case 0x8:
GPJ2DAT = 0x8;
break;
case 0x9:
GPJ2DAT = 0x9;
break;
case 0xa:
GPJ2DAT = 0xa;
break;
case 0xc:
GPJ2DAT = 0xc;
break; */
case 0x7:
GPJ2DAT = 0X7; /* 0111 control led4 */
break;
case 0xb:
GPJ2DAT = 0xb; /* 1011 control led3 */
break;
case 0xd:
GPJ2DAT = 0xd; /* 1101 control led2 */
break;
case 0xe:
GPJ2DAT = 0xe; /* 1110 control led1 */
break;
case 0xf:
GPJ2DAT = 0xf;
break;
default:
GPJ2DAT = 0XF;
break;
}
}
}

int
main (int argc, char **argv)
{
/**
* 配制LED的三根引脚为输出
*/
#if 1
lightLedSet ();
buttonKeySet ();
readButtonKey ();
#endif
return 0;

}


cat start.s
.text
.globl start
.globl _start
_start:

BL main

MAIN_LOOP:
B MAIN_LOOP

 

cat Makefile
#app.bin : file.s
# 进行编译
# arm-linux-gcc -g -c -o file.o file.s
# 这个是链接
# arm-linux-ld -Ttext 0x00000000 -g file.o -o file_on_elf
# 然后生成 app.bin 这个文件将会烧到开发板上去
# arm-linux-objcopy -o binary -S file_on_elf app.bin
#clean:
# rm -f app.bin file_on_elf *.o
# 1:预处理
# 2:编译 .c -> .s
# 3:汇编 .s -> .o
# 4:链接 多个.o 合并成一个可执行文件
#
CC=arm-linux-gcc
AS=arm-linux-as
LD=arm-linux-ld
OBJCOPY=arm-linux-objcopy
OBJCFLAGS=--gap-fill=0xff
src_c = $(wildcard *.c)
src_s = $(wildcard *.s)
obj_c = $(patsubst %.c, %.o, $(src_c))
obj_s = $(patsubst %.s, %.o, $(src_s))
target = app

$(target).bin:$(target)
$(OBJCOPY) $(OBJCFLAGS) -O binary $< $@

$(target):$(obj_s) $(obj_c)
$(LD) -e 0x21000000 -Ttext 0x21000000 $^ -o $@
%.o:%.c
$(CC) -o $@ -c $<
%.o:%.s
$(AS) -o $@ $<

clean:
-rm -f $(target)
-rm -f $(target).bin
-rm -f $(obj_s)
-rm -f $(obj_c)
-rm -f *~

 

转载于:https://www.cnblogs.com/chn-android/p/5501990.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值